blob: 5f02fd19672a7d32152cd15b7341d14bd9a20366 [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$gAcl":"http://schemas.google.com/acl/2007","xmlns$gd":"http://schemas.google.com/g/2005","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:50:22.270Z"},"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\u003d2501\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\u003d2001\u0026max-results\u003d500"},{"rel":"previous","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev?alt\u003djson\u0026start-index\u003d1500\u0026max-results\u003d501"}],"generator":{"version":"1","uri":"https://sites.google.com","$t":"Google Sites"},"openSearch$startIndex":{"$t":"2001"},"openSearch$itemsPerPage":{"$t":"500"},"entry":[{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/651664873547430280"},"published":{"$t":"2013-10-08T23:38:45.454Z"},"updated":{"$t":"2013-10-08T23:38:45.530Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-08T23:38:45.454Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Tue Oct 08 2013 16:38:45 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eeae\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eleviw\u003c/li\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-tue-oct-08-2013-16-38-45-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/651664873547430280"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/651664873547430280"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/651664873547430280"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-tue-oct-08-2013-16-38-45-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1119665406422918205"},"published":{"$t":"2013-10-08T23:38:14.498Z"},"updated":{"$t":"2013-10-08T23:38:14.641Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-08T23:38:14.498Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Tue Oct 08 2013 16:38:14 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eeae\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eleviw\u003c/li\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-tue-oct-08-2013-16-38-14-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1119665406422918205"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1119665406422918205"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1119665406422918205"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-tue-oct-08-2013-16-38-14-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6832150536372178863"},"published":{"$t":"2013-10-08T23:24:01.305Z"},"updated":{"$t":"2013-10-08T23:24:01.414Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-08T23:24:01.305Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Tue Oct 08 2013 16:24:01 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003eeae\u003c/li\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eleviw\u003c/li\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-tue-oct-08-2013-16-24-01-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6832150536372178863"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6832150536372178863"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6832150536372178863"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-tue-oct-08-2013-16-24-01-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6761041423579270243"},"published":{"$t":"2013-10-08T21:03:58.888Z"},"updated":{"$t":"2013-10-08T21:03:59.146Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-08T21:03:58.888Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Tue Oct 08 2013 14:03:58 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eeae\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eleviw\u003c/li\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-tue-oct-08-2013-14-03-58-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6761041423579270243"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6761041423579270243"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6761041423579270243"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-tue-oct-08-2013-14-03-58-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6570115251683176755"},"published":{"$t":"2013-10-08T16:39:07.346Z"},"updated":{"$t":"2013-10-08T16:39:07.470Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-08T16:39:07.346Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Tue Oct 08 2013 09:39:07 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eleviw\u003c/li\u003e\u003cli\u003eeseidel\u003c/li\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-tue-oct-08-2013-09-39-07-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6570115251683176755"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6570115251683176755"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6570115251683176755"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-tue-oct-08-2013-09-39-07-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4699652201841487598"},"published":{"$t":"2013-10-07T22:28:28.699Z"},"updated":{"$t":"2013-10-07T22:28:28.945Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T22:28:28.699Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Mon Oct 07 2013 15:28:28 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eeseidel\u003c/li\u003e\u003cli /\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-mon-oct-07-2013-15-28-28-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4699652201841487598"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4699652201841487598"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4699652201841487598"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-mon-oct-07-2013-15-28-28-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5813162991106100540"},"published":{"$t":"2013-10-07T22:05:50.148Z"},"updated":{"$t":"2013-10-07T22:05:50.214Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T22:05:50.148Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Mon Oct 07 2013 15:05:48 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eeseidel\u003c/li\u003e\u003cli\u003ejulietest\u003c/li\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-mon-oct-07-2013-15-05-48-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5813162991106100540"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5813162991106100540"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5813162991106100540"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-mon-oct-07-2013-15-05-48-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8331299781234784100"},"published":{"$t":"2013-10-07T21:57:48.085Z"},"updated":{"$t":"2013-10-07T21:57:48.128Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T21:57:48.085Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Mon Oct 07 2013 14:57:47 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eeseidel\u003c/li\u003e\u003cli /\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-mon-oct-07-2013-14-57-47-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8331299781234784100"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8331299781234784100"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8331299781234784100"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-mon-oct-07-2013-14-57-47-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3289128834195237337"},"published":{"$t":"2013-10-07T19:52:57.263Z"},"updated":{"$t":"2013-10-07T20:57:49.526Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T19:52:57.269Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcementspage","label":"announcementspage"}],"title":{"$t":"layout-test-contest-leaderboard"},"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\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/8455202019639247095"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3289128834195237337"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3289128834195237337"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3289128834195237337"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"gd$feedLink":{"href":"https://sites.google.com/feeds/content/chromium.org/dev?parent\u003d3289128834195237337"},"sites$pageName":{"$t":"layout-test-contest-leaderboard"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3605067771176737592"},"published":{"$t":"2013-10-07T20:55:08.901Z"},"updated":{"$t":"2013-10-07T20:55:08.963Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T20:55:08.901Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#announcement","label":"announcement"}],"title":{"$t":"Updated Leaderboard Mon Oct 07 2013 13:55:08 GMT-0700 (PDT)"},"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\"\u003eTop 5:\u003col\u003e\u003cli\u003erune\u003c/li\u003e\u003cli\u003eojan\u003c/li\u003e\u003cli\u003eadamk\u003c/li\u003e\u003cli\u003eeseidel\u003c/li\u003e\u003cli /\u003e\u003c/ol\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/3289128834195237337"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/layout-test-contest/layout-test-contest-leaderboard/updated-leaderboard-mon-oct-07-2013-13-55-08-gmt-0700-pdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3605067771176737592"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3605067771176737592"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3605067771176737592"}],"author":[{"name":{"$t":"Julie Parent"},"email":{"$t":"jparent@chromium.org"}}],"sites$pageName":{"$t":"updated-leaderboard-mon-oct-07-2013-13-55-08-gmt-0700-pdt"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},"published":{"$t":"2013-05-27T13:59:34.213Z"},"updated":{"$t":"2013-10-07T09:21:40.962Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T09:21:39.013Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Rendering and compositing out of process iframes"},"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\u003ch1 dir\u003d\"ltr\" style\u003d\"text-align:left;line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Summary\" /\u003e\u003cspan style\u003d\"background-color:transparent;color:rgb(74,134,232);font-family:Trebuchet MS;font-size:17px;white-space:pre-wrap;line-height:1.15;font-weight:normal\"\u003eSummary\u003c/span\u003e\u003c/h1\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis document provides a design for rendering and compositing out-of-process iframe (OOPIF) elements.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Contents\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;color:rgb(74,134,232);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eContents\u003c/span\u003e\u003c/h2\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;margin-left:18pt\"\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-Summary\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eSummary\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Contents\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eContents\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Background\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eBackground\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Out-of-process-iframes\"\u003e\u003cstrong\u003e1.2.1 \u003c/strong\u003eOut-of-process iframes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-A-very-brief-primer-on-Blink-rendering-and-painting\"\u003e\u003cstrong\u003e1.2.2 \u003c/strong\u003eA very brief primer on Blink rendering and painting\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-A-little-bit-about-compositing-and-the-GPU\"\u003e\u003cstrong\u003e1.2.3 \u003c/strong\u003eA little bit about compositing and the GPU\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-The-bercompositor\"\u003e\u003cstrong\u003e1.2.4 \u003c/strong\u003eThe Übercompositor\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Rendering-OOPIFs\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003eRendering OOPIFs\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e1.3.1 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Browser-process-changes\"\u003e\u003cstrong\u003e1.3.2 \u003c/strong\u003eBrowser process changes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Renderer-process-changes\"\u003e\u003cstrong\u003e1.3.3 \u003c/strong\u003eRenderer process changes\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Compositing\"\u003e\u003cstrong\u003e1.4 \u003c/strong\u003eCompositing\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cross-site-texture-stealing\"\u003e\u003cstrong\u003e1.4.1 \u003c/strong\u003eCross-site texture stealing\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Constraints\"\u003e\u003cstrong\u003e1.5 \u003c/strong\u003eConstraints\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Software-path-rendering\"\u003e\u003cstrong\u003e1.5.1 \u003c/strong\u003eSoftware path rendering\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Compositor-availability\"\u003e\u003cstrong\u003e1.5.2 \u003c/strong\u003eCompositor availability\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/p\u003e\u003cdiv\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Background\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;color:rgb(74,134,232);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBackground\u003c/span\u003e\u003c/h2\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Out-of-process-iframes\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOut-of-process iframes\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis is in support of the main OOPIF design work, for which a higher level description can be found at \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/oop-iframes\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://www.chromium.org/developers/design-documents/oop-iframes\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.\u003c/span\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-A-very-brief-primer-on-Blink-rendering-and-painting\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA very brief primer on Blink rendering and painting\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen an HTML resource is loaded into Blink, the parser tokenizes the document and builds a DOM tree based on the elements it contains. The DOM tree is a WebCore data structure that consists of objects with types that inherit from \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/dom/Node.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eWebCore::Node\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.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAs each node is added to the DOM tree, the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eattach()\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e method is called on it which creates an associated \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erenderer\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (an object with a type that inherits from \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/rendering/RenderObject.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eWebCore::RenderObject\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) and adds it to the render tree. Objects in the render tree roughly correspond to objects in the DOM tree, but there are many exceptions (some DOM nodes do not receive renderers, some will have more than one renderer, and many renderers are created that that do not have corresponding DOM nodes). The render tree is the primary data structure involved in the \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003elayout\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e phase of rendering, during which size and position are computed for all rendered elements.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDuring construction or modification of the render tree, some renderers will receive associated \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/rendering/RenderLayer.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eWebCore::RenderLayer\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 objects. Attaching a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eto a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderObject \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eindicates that the renderer has its own coordinate system, and therefore the content of the renderer and its descendants can (but won’t necessarily) be painted to a separate compositing layer. Each \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eis added to the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003etree, which has a sparse association with the render tree and is the primary data structure used for the painting phase of rendering.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe diagram below provides a basic illustration of the DOM tree, render tree, and \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003etree for the following HTML:\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;html\u0026gt;\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u0026lt;body\u0026gt;\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u0026lt;iframe src\u003d”\u003c/span\u003e\u003ca href\u003d\"http://www.example.org\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://www.example.org\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e”\u0026gt;\u0026lt;/iframe\u0026gt;\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u0026lt;/body\u0026gt;\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;/html\u0026gt;\u003c/span\u003e\u003c/p\u003e\u003cdiv style\u003d\"text-align:center\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1369666044574/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20rendering%20trees.png\" /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\" /\u003e\u003cbr /\u003e\u003cdiv style\u003d\"text-align:center\" /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMore details on rendering, and in particular the layout phase, can be found at \u003c/span\u003e\u003ca href\u003d\"https://www.webkit.org/blog/114/webcore-rendering-i-the-basics/\" style\u003d\"text-decoration:none\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://www.webkit.org/blog/114/webcore-rendering-i-the-basics/\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.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe details of painting depend on whether accelerated compositing is used. This design uses the assumption that OOPIFs will always be rendered using GPU accelerated compositing in Chromium.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen accelerated compositing is in use, some \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayers\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e receive separate compositing layers, or \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ebacking surfaces\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, onto which their bitmaps will be painted. All compositing layers are provided to the compositor, where they are used to create the final rendered bitmap. In WebCore, compositing layers are represented and managed by the \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/rendering/RenderLayerBacking.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayerBacking\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 class.\u003c/span\u003e\u003c/p\u003e\u003cbr /\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayerBacking\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in turn corresponds to a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGraphicsLayer\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, the glue between WebCore rendering and platform compositing, instantiated in our case as \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/WebCore/platform/graphics/chromium/GraphicsLayerChromium.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eGraphicsLayerChromium\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. \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGraphicsLayers\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e are positioned into yet another sparse tree, this one used by the compositor.\u003c/span\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-A-little-bit-about-compositing-and-the-GPU\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA little bit about compositing and the GPU\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGraphicsLayer\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e internally manages a \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/third_party/WebKit/Source/Platform/chromium/public/WebLayer.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eWebLayer\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, which is a compositor container for a shared memory buffer between a renderer process and the GPU process. During the painting phase, each \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einstructs all of its associated \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderObjects \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eto paint into the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebLayer\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e buffer. The GPU process can output the bitmap texture to the screen.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDetails of how the different processes synchronize buffer usage and throttle rendering vary significantly by platform. The GPU often uses a double buffering system, in which two buffers are shared so that one buffer is being output to the screen while the other is being painted. When a paint is complete, the renderer issues a swap buffer command to the GPU to cause it to swap which buffer is being displayed, and which is available for paint. The renderer sends an IPC to the browser when a new buffer is available and expects an ACK for every such message. This ACK contains a previously sent buffer to be reused by the GPU and a sync point (location in the GPU command buffer), or a NULL buffer, if nothing is available to be recycled. Sync points are used to make sure the same buffer isn’t being rendered into and drawn out of. When an embedding compositor issues the last draw call that uses the child renderer’s image data to the GPU command buffer, it also inserts a sync point into the command stream and sends an ACK to the renderer with that number. Rendering into the recycled buffer is only allowed after the GPU processed all commands up to the sync point. Rendering is suspended until that happens.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe compositor uses a \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/cc/layers/texture_layer.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureLayer\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 to encapsulate textures that need to be shared between different processes. It also provides a management facility for \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureLayer\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e in \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/cc/resources/texture_mailbox.h\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureMailbox\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, which conveys ownership of the texture between processes. One process can make a texture available to another process by using the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eglProduceTextureCHROMIUM\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e GPU command buffer API for the appropriate mailbox, and then the next process takes ownership of the texture via the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eglConsumeTextureCHROMIUM\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e GPU command buffer API on the same mailbox.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMost of this information, and much much more, can be found at \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://www.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome\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.\u003c/span\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-The-bercompositor\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Übercompositor\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/chromium.org/document/d/1ziMZtS5Hf8azogi2VjSE6XPaMwivZSyXAIIp0GgInNA/edit\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eubercompositor\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 being developed to improve rendering performance on Aura, by integrating compositing of UI and web content in the browser process. Under the new architecture, child compositors in each rendering process supply \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ecompositor frames\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to the parent compositor which are then composited into the screen for display.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEach \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCompositorFrame \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003econtains a set of quads and associated texture references that are generated by a child compositor in a renderer process. Internally, \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureMailboxes\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e are used to transfer textures to the browser process.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhereas in the existing hardware path compositing mode the renderer sends a SwapBuffer message to the GPU to instruct it to display its uploaded texture to screen, in the ubercompositor architecture the renderer sends an IPC message directly to the browser containing the compositor frame. The parent compositor then interacts with the GPU process via IPC in order to do the final compositing.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Rendering-OOPIFs\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;color:rgb(74,134,232);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRendering OOPIFs\u003c/span\u003e\u003c/h2\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe full security advantage of OOPIFs is very difficult to achieve when the compositing of a browser tab’s contents is done by a renderer process, because the ability to use a texture in compositing implies read access to the pixels of that texture (see the Cross Site Texture Stealing section below). Therefore the primary design assumes the availability of ubercompositor. A prototype has been built using conventional hardware path compositing, and we are maintaining that parallel design with the expectation that we will want OOPIFs to be available on platforms without ubercompositor availability, despite the significantly reduced security properties.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe  following list enumerates the requirements for OOPIFs to paint:\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:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\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\"\u003eThe browser must enable accelerated compositing whenever an OOPIF is being rendered.\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;background-color:transparent;vertical-align:baseline\"\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\"\u003eNew browser process facilities must pass messages from the embedding renderer process to the iframe renderer process for sizing information, and from the iframe renderer process to the embedding renderer process with information on texture availability for compositing.\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;background-color:transparent;vertical-align:baseline\"\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\"\u003eNew renderer process facilities must receive identifying texture information (i.e. a texture mailbox name or ubercompositor frame) and associate it with a \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebLayer\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e that is attached to the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFrameView\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e object associated with the OOPIF’s \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFrame\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e object.\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderFrameBase\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, the WebCore renderer associated with frame and iframe elements, must be aware when it contains out-of-process rendered content and in that case receive its own \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer\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-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayerBacking\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\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;background-color:transparent;vertical-align:baseline\"\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\"\u003ethe \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayerBacking \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eassociated with \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderFrameBase \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emust set the contents of its graphics layer to the WebLayer.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen using hardware path compositing without ubercompositor, the renderer process for the out-of-process frame creates a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureMailbox\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. A \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderWidgetHostViewSubframe \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eobject in the browser process passes the mailbox name to the top-level frame renderer. This is illustrated in the diagram below. The right half of the diagram is mainly existing functionality that will require few changes. The left half contains some new and modified classes as well as new IPC messages.\u003c/span\u003e\u003c/p\u003e\u003cdiv style\u003d\"text-align:center;display:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20texture%20routing.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1369666242373/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20texture%20routing.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv style\u003d\"text-align:center\" /\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen using the ubercompositor, the renderer process for the subframe creates a compositor frame (a concept entirely distinct from HTML frames), which can contain many texture mailboxes. It passes the compositor frame directly to the browser process, which then relays it to the top-level frame renderer. The top-level frame renderer cannot access the textures that are stored in GPU memory, but can pass all of its compositor frames, including those obtained from the subframe renderer process, back to the browser process for the ubercompositor to composite them.\u003c/span\u003e\u003c/p\u003e\u003cdiv style\u003d\"text-align:center;display:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20compositor%20frame%20routing.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1369666382385/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20compositor%20frame%20routing.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv style\u003d\"text-align:center\" /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Browser-process-changes\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBrowser process changes\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRelevant changes to the representation of pages and frames in the browser process are described at \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/oop-iframes\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://www.chromium.org/developers/design-documents/oop-iframes\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.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIPC messages must be routed from the subframe renderer to the top-level frame renderer to notify it of changed texture buffers or compositor frames. Also, IPC messages must be routed from the top-level frame renderer to the subframe renderer with control information such as resizing.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEach \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eViewHost_*\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e message will be passed through the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderWidgetHostView \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efor its associated \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderFrame\u003c/span\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-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderWidgetHostView \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewill use the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebContents \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eto send the message to the destination \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderFrame \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(for messages originating from a subframe renderer, this is the top-level \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e; for messages destined to a subframe renderer, this will use \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGetRenderManager()-\u0026gt;current_host()\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e) and then dispatch the message to the proper recipient.\u003c/span\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-Renderer-process-changes\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderer process changes\u003c/span\u003e\u003c/h3\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:15px;font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e1. IPCs\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderView \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eregisters handlers for the new \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eViewMsg_BuffersSwapped\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e IPC message (in hardware path compositing) and \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eViewMsg_CompositorFramesSwapped \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(for ubercompositor). This handlers lazily instantiate a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSubframeCompositorHelper\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e object and proxies most of the handling to the helper. The new IPC messages convey information such as size, \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureMailbox\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e name, compositor frame data, and GPU routing information for the texture with the swapped out frame contents that was rendered by another process.\u003c/span\u003e\u003c/p\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:15px;font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e2. SubframeCompositorHelper\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:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSubframeCompositorHelper\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is a new class that is responsible for managing the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eand \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDelegatedRendererLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003einformation associated with a swapped out frame. It is attached to the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebKit::RenderFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for an out-of-process frame, and is created upon receipt of a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eViewMsg_BuffersSwapped\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eViewMsg_CompositorFramesSwapped \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIPC message. It performs the following tasks:\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:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\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\"\u003eCreate a local \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureLayer \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efor a received \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureMailbox \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ename, or a \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDelegatedRendererLayer \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efor a received compositor frame\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\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\"\u003eCreates a \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebLayer \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003econtaining a \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureLayer\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDelegatedRendererLayer, \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eand attaches the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebLayer \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eto the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFrameView \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efor the swapped out subframe\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\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\"\u003eManages the lifetime of the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureLayer\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDelegatedRendererLayer\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv style\u003d\"text-align:center;display:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20ogres%20are%20like%20onions.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1369666480704/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20ogres%20are%20like%20onions.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cdiv style\u003d\"text-align:center\" /\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:15px;font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003e3. FrameView and RenderIFrame\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-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebCore itself requires few modifications related to rendering. The main change is that for any cross-site iframe element, its associated \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderIFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emust always have a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayer\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eand \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayerBacking\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ecreated. This can be accomplished by modifying \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderPart::requiresAcceleratedCompositing()\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;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\"\u003eRenderIFrame::requiresLayer()\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to return true. Additionally, \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderCompositor::requiresCompositingForFrame()\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, which decides whether to create a new compositing layer for a frame renderer, must always return true for OOPIFs.\u003c/span\u003e\u003c/p\u003e\u003cbr /\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderIFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, since it inherits from \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebCore::RenderWidget\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, contains a pointer to a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebCore::Widget\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. The \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003em_widget\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e on any \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderIFrame\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eshould always point to a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFrameView\u003c/span\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-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSubframeCompositorHelper\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e attaches the layer to the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFrameView\u003c/span\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-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eto make it accessible during rendering: \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderCompositor\u003c/span\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-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eaccesses the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebLayer \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003evia \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFrameView::platformLayer()\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and assigns it as the content for the frame’s \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRenderLayerBacking\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Once this is done, the compositor will display the frame texture in the correct position.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Compositing\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;color:rgb(74,134,232);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCompositing\u003c/span\u003e\u003c/h2\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Cross-site-texture-stealing\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-site texture stealing\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAn important security requirement for OOPIFs is that even though cross-site frame contents are being composited with the content in the top-level frame, the top-level renderer process must not be able to read the pixels that are drawn within the frame. The ability to do this would allow a compromised renderer process access to cross-site content, which is contrary to \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/site-isolation\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ethe goals of the site isolation project\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.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe don’t believe this to be a feasible goal without the availability of ubercompositor. It would be very difficult, given the performance constraints of compositing,  to require that the top-level renderer process be able to composite using a given texture without being able to write that texture to an accessible memory buffer. In the ubercompositor model, compositing is done by the trusted browser process so this constraint no longer .\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAccess to the texture from a parent renderer process will be prevented by the GPU process, where a check will be added to the handler of the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eglConsumeTextureCHROMIUM\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e command buffer API so that a \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTextureMailbox\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e can be consumed only by the renderer process that initially created the texture, and by the browser process.\u003c/span\u003e\u003c/p\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Constraints\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;color:rgb(74,134,232);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eConstraints\u003c/span\u003e\u003c/h2\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:8pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Software-path-rendering\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSoftware path rendering\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOOPIFs will not be supported when software path rendering is enabled. Software compositing, when it becomes available, will allow OOPIFs to function on systems with graphics driver that do not support hardware-based compositing, but this will have the same security limitations as OOPIFs rendered under current hardware path compositing, which does not prevent cross-site texture stealing.\u003c/span\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-Compositor-availability\" /\u003e\u003cspan style\u003d\"font-family:Trebuchet MS;color:rgb(102,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCompositor availability\u003c/span\u003e\u003c/h3\u003e\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;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUbercompositor is limited to running on Aura, which currently only runs on ChromeOS. We expect Aura to be running on Windows and Linux before OOPIFs are enabled on stable without a flag. Until Aura is also ported to OS X, our implementation will rely on the current hardware-accelerated compositor and the software compositor.\u003c/span\u003e\u003c/p\u003e\u003cdiv\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/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/2708308332133640550"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1000056619549402598"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"}],"author":[{"name":{"$t":"Ken Buchanan"},"email":{"$t":"kenrb@chromium.org"}}],"sites$pageName":{"$t":"oop-iframes-rendering"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8424930829170373149"},"published":{"$t":"2013-10-07T02:34:12.133Z"},"updated":{"$t":"2013-10-07T02:34:12.139Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-10-07T02:34:12.133Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen Shot 2013-10-06 at 7.33.59 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8424930829170373149"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7257777504967824123"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-v8-profiling-timeline-plots/Screen%20Shot%202013-10-06%20at%207.33.59%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8424930829170373149"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8424930829170373149"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8424930829170373149"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8424930829170373149"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"UCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/385872135698932510"},"published":{"$t":"2010-02-01T22:30:37.529Z"},"updated":{"$t":"2013-09-26T21:19:38.436Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-26T21:19:36.505Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SPDY Protocol"},"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\u003e\u003ca href\u003d\"http://mbelshe.github.com/SPDY-Specification/\" rel\u003d\"nofollow\"\u003eDraft 4\u003c/a\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis is a placeholder. Not spec'd or implemented yet.  Expected changes:\u003c/li\u003e\u003cul\u003e\u003cli\u003eServer push of DNS records \u0026amp; certificates for better connection sharing\u003c/li\u003e\u003cli\u003eBetter compression\u003c/li\u003e\u003cli\u003eBetter prioritization\u003c/li\u003e\u003cli\u003eBetter flow control mechanisms\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft3-1\" style\u003d\"font-size:10pt\"\u003eDraft 3.1\u003c/a\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eAdds session-layer flow control.\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft3\"\u003eDraft 3\u003c/a\u003e\u003cbr /\u003eAdds flow control.\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2\"\u003eDraft 2\u003c/a\u003e\u003cbr /\u003eClarifies Server Push \u0026amp; improves stream cancellation semantics.\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft1\"\u003eDraft 1\u003c/a\u003e\u003cbr /\u003eOriginally published Nov 11, 2009.\u003c/li\u003e\u003c/ul\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/5048080902362104097"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/385872135698932510"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/385872135698932510"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/385872135698932510"}],"author":[{}],"sites$pageName":{"$t":"spdy-protocol"},"sites$revision":{"$t":"19"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4613809916716875531"},"published":{"$t":"2013-09-23T22:21:14.808Z"},"updated":{"$t":"2013-09-24T00:44:37.893Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-24T00:35:47.592Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Profile Chooser Menu"},"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\u003eThe profile chooser menu, also known as the avatar menu, is represented by different, platform-dependent views and models. The \u003cfont face\u003d\"courier new, monospace\"\u003eAvatarMenu\u003c/font\u003e class is used to retrieve items for the menu and responds to actions like switching, adding and editing profiles.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\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/developers/design-documents/profile-chooser-menu/Avatar%20Menu%20Classes.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1379983215512/developers/design-documents/profile-chooser-menu/Avatar%20Menu%20Classes.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-AvatarMenu\" /\u003e\u003cb style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003cfont size\u003d\"4\"\u003eAvatarMenu\u003c/font\u003e\u003c/b\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cp\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003eAvatarMenu\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e defines the Item struct and provides methods for retrieving these items and interacting with an item's associated profile. Most of its functions delegate tasks to either the \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003eProfileList\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e object or the \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003eAvatarMenuActions\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e object, both of which are created in \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003eAvatarMenu::AvatarMenu()\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e. The various Views use \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" size\u003d\"2\"\u003eAvatarMenu\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e to determine whether the menu should be shown, to access the menu items, and to respond to clicks on menu items or links.\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\" style\u003d\"background-color:transparent\"\u003e\u003cb\u003eProfileList\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eAvatarMenu\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e delegates generation of the profile list to the \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eProfileList\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e interface, which currently has two implementations. On desktop Chrome, \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eProfileListDesktop\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e simply exposes all of the profiles in LocalState for inclusion in the menu. \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eProfileListChromeOS\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e restricts the listed profiles to those that are associated with logged-in users, hiding the Default profile and profiles for users who are not logged into the session (including managed users); additionally, the menu items' \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eicon\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e fields are populated with \u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:arial,sans-serif\"\u003euser images instead of profile avatar icons. Both implementations rely on the \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eProfileInfoInterface\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:arial,sans-serif\"\u003e (\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eProfileInfoCache\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:arial,sans-serif\"\u003e), and \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eProfileListChromeOS\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:arial,sans-serif\"\u003e also uses \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eUserManager\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:arial,sans-serif\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"4\" style\u003d\"background-color:transparent\"\u003e\u003cb\u003eAvatarMenuActions\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eThe \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eAvatarMenuActions\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e interface controls behavior such as adding and editing profiles, as well as determining whether these links should be shown. As of this writing, \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eAvatarMenuActionsDesktop\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e allows for adding and editing profiles through the Settings sub-page, as well as signing out of a profile, while \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eAvatarMenuActionsChromeOS\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e disallows editing (i.e., returns false from \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eShouldShowEditProfileLink\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e) and only lets the Add Profile link be shown if the right conditions are met with respect to the user's type and other users on the machine. Currently, \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003eAvatarMenuActions\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:arial,sans-serif\"\u003e implementations use the \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eBrowser\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e object; in the future, this dependency should be removed by delegating actions like AddNewProfile and EditProfile.\u003c/font\u003e\u003c/span\u003e\u003c/p\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/profile-chooser-menu"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4613809916716875531"},{"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/4613809916716875531"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4613809916716875531"}],"author":[{"name":{"$t":"Michael Giuffrida"},"email":{"$t":"michaelpg@chromium.org"}}],"sites$pageName":{"$t":"profile-chooser-menu"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/446321086506066862"},"published":{"$t":"2013-09-24T00:22:27.804Z"},"updated":{"$t":"2013-09-24T00:40:15.512Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-24T00:40:15.512Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Avatar Menu Classes.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/446321086506066862"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4613809916716875531"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/profile-chooser-menu/Avatar%20Menu%20Classes.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/446321086506066862"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/446321086506066862"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/446321086506066862"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/446321086506066862"}],"author":[{"name":{"$t":"Michael Giuffrida"},"email":{"$t":"michaelpg@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7737852694122413723"},"published":{"$t":"2008-12-06T00:09:44.021Z"},"updated":{"$t":"2013-09-24T00:24:40.116Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2008-12-08T23:27:20.899Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Find Bar"},"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-Background\" /\u003eBackground\u003c/h4\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eGoogle Chrome implements find for web pages using a \"Find Bar\" which appears from the top right (or top left, depending on language) corner of the browser window. The bar contains a text field for typing in search terms and some controls for advancing find selection and closing the bar.\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\"\u003eThis is a proposal for lifetime management of the Find Bar. At present, the Find Bar is created and owned by the WebContentsViewWin, and a unique one is maintained per Tab. The FindBar is implemented as a WidgetWin subclass called \u003cspan style\u003d\"font-weight:bold\"\u003eFindBarWin\u003c/span\u003e, which is a WS_CHILD of the frame.  Whenever the selected tab changes, if the newly selected Tab has a FindBar, it is made visible. Whenever a tab is dragged out of a window and into another, the FindBarWin associated with that Tab is re-parented to the new window.\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\"\u003eTo increase the flexibility of the TabContents/WebContents API and to enhance the consistency in how bits of Chrome browser UI are maintained, we have been moving the creation and ownership of bits of the Chrome browser UI out of the TabContents and other objects and into the BrowserView. (This has already been completed for the TabStrip, the browser toolbar, InfoBars, and some other objects). The BrowserView class has become the class that represents the contents of the window independent of frame type. For more information on this read the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/browser-window\"\u003eBrowser Window document\u003c/a\u003e. The general intent of this design approach is that the \"View\" in the MVC sense (the hierarchy of objects implementing the BrowserWindow interface) is able to initialize its state from the set of Model objects that back it, (Browser, TabStripModel, TabContents, etc). \u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-New-FindBar-Creation-and-Ownership\" /\u003eNew FindBar Creation and Ownership\u003c/h4\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eIn light of this transition, it made sense that the Find Bar, as a part of the Chrome Browser UI, be created and managed with the rest of the Browser UI. The logical place for this is the BrowserView class, which creates and lays out the toolbars, info bars, and other elements of the Browser Window. In this new world, an instance of the FindBarWin class is created for every BrowserView at the time it is added to the frame's Widget, and is maintained for the lifetime of that BrowserView.\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\"\u003eThe WebContents object is extended to provide a basic interface for finding (that drives the underlying RenderViewHost and WebKit) and also carries some state about the last search string the user entered, whether a find session is currently active for the tab, and the last set of Find results that were returned from WebKit (in the form of a FindNotificationDetails object held as a member variable).\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1228522262950/developers/design-documents/find-bar/FindBarTabSwitching.png\" /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eThe BrowserView implements the TabStripModelObserver interface, and so is notified of tab switches, additions and removals. Whenever the selected tab changes, the BrowserView tells its FindBarWin to change the WebContents it's active for (if the newly selected Tab is a WebContents). FindBarWin code initializes its UI from the state of the newly set WebContents so that the View is brought up to date with the Model.\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\"\u003eWhen it comes time to perform a find, the FindBar code (in FindBarWin and FindBarView) drives the WebContents it is attached to directly by starting a find session. The WebContents implements the RenderViewHostDelegate interface which includes an OnFindReply method which is called when the renderer process returns with find results. WebContents updates its last saved results and then notifies interested observers via the NOTIFY_FIND_RESULT_AVAILABLE notification:\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1228522247843/developers/design-documents/find-bar/FindBarGeneral.png\" /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eThe FindBarWin then updates its contained view (FindBarView) with the current result values from the WebContents. This change means that both the UI and the automation provider (used for UI tests for Find in Page) obtain their state from the same notification.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Layout\" /\u003eLayout\u003c/h4\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eThe Find Bar is always positioned attached to the lowest row in the \"visible toolbar\" of the Browser window. This means the Bookmark Bar if the Bookmark Bar is persistently visible across tabs, or the main toolbar if the Bookmark Bar is not persistently visible across tabs. This requires some work in Find Bar's positioning logic to identify the state of the parent BrowserView so it can position itself appropriately. With the old design, this was harder because the FindBarWin object didn't have direct access to the BrowserView so had to do a lot of work to figure out the bounds of various elements of the Browser UI and position relative to them. With the new design, there is a direct 1:1 mapping between the FindBarWin and its parent BrowserView. The BrowserView does Layout for all of its child views (including the toolbars the FindBarWin must layout relative to) and so under the new design the FindBarWin can just ask the BrowserView what its bounding box should be.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Tab-Drag-Drop\" /\u003eTab Drag \u0026amp; Drop\u003c/h4\u003e\u003cdiv\u003eWhen a Tab is detached from one window and dropped into a different one, a few things happen. In both the source and the target windows, a different tab is selected. In the source window, another tab becomes active and the Find Bar for that window is updated with the state of that tab, which might not have a find session active in which case it'll be hidden. In the target window, the dragged tab will cause that window's find bar to be initialized with the state of the tab that was inserted and selected. Native child windows are never reparented (and thus there are no focus manager transitions) under this design.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Prepopulate-State\" /\u003ePrepopulate State\u003c/h4\u003e\u003cdiv\u003eWhen the Find Bar appears, it is pre-filled with the string that was searched for last in that Tab. If there is no previous text the Find Bar shows no string. The ownership changes described here do not affect this behavior - every WebContents maintains a new find_text_ member that tracks the last text the user searched for. In the future, we want to change this such that if there is no last find string for a specific tab but there is for another tab, then we populate with that string instead. This proposal does not affect this behavior at this time however.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Long-Running-Find-Queries\" /\u003eLong Running Find Queries\u003c/h4\u003e\u003cdiv\u003eFind queries in long documents can take some time to execute. Handling the results from a find operation is contained entirely at the WebContents level. When a query is initiated from a particular WebContents that WebContents receives its results. When the WebContents receives the results it notifies interested observers, which may include the Find Bar UI, if that Tab is active. When the selected tab changes, the Find Bar code un-registers itself as an observer of find result notifications sourced from the last selected WebContents and registers itself as an observer of find result notification sourced from the new one. This ensures that the Find Bar only receives update notifications from the selected WebContents, even if a find operation is pending in multiple tabs. When the user switches back to another tab, the Find Bar will be initialized with the current result state of that tab and observe any future results in it for as long as that tab remains selected.\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/find-bar"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7737852694122413723"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7737852694122413723"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7737852694122413723"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"find-bar"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/846727922989658113"},"published":{"$t":"2013-09-23T06:21:55.209Z"},"updated":{"$t":"2013-09-23T06:23:08.831Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-23T06:23:07.073Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Screen Reader 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\"\u003eSee \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/assistive-technology-support\"\u003eAccessibility: Assistive technology support\u003c/a\u003e\u003ca href\u003d\"/\" /\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/screen-reader-support"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/846727922989658113"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/846727922989658113"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/846727922989658113"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"screen-reader-support"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5890258080063263598"},"published":{"$t":"2010-04-13T21:40:38.474Z"},"updated":{"$t":"2013-09-14T23:06:53.698Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-14T23:06:51.829Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Recovery 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\"\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-Design-goals\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eDesign goals\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Entering-recovery-mode\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eEntering recovery mode\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recovery-website\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eRecovery website\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recovery-installer\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eRecovery installer\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Types-of-data-on-a-recovery-storage-device\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eTypes of data on a recovery storage device\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recovery-kernel\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eRecovery kernel\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recovery-root-filesystem\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003eRecovery root filesystem\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Recovery-data\"\u003e\u003cstrong\u003e6.3 \u003c/strong\u003eRecovery data\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-OS-kernel-rootfs\"\u003e\u003cstrong\u003e6.3.1 \u003c/strong\u003eChromium OS kernel+rootfs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Chromium-OS-firmware\"\u003e\u003cstrong\u003e6.3.2 \u003c/strong\u003eChromium OS firmware\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Network-configuration\"\u003e\u003cstrong\u003e6.3.3 \u003c/strong\u003eNetwork configuration\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-Types-of-recovery-storage-device\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eTypes of recovery storage device\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Single-recovery-storage-device\"\u003e\u003cstrong\u003e7.1 \u003c/strong\u003eSingle recovery storage device\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Network-recovery-storage-device\"\u003e\u003cstrong\u003e7.2 \u003c/strong\u003eNetwork recovery storage device\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Developer-mode\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eDeveloper mode\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Network-recovery\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eNetwork recovery\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-Overview\" /\u003eOverview\u003c/h2\u003e\r\n\u003cp\u003eThis document describes how recovery mode works in a Chromium-based OS. It assumes the firmware has already booted in recovery mode, and is now searching removable media (a USB key or an SD card) for a valid recovery image.\u003c/p\u003e\r\n\u003cp\u003eIn this document, the term \"recovery storage device\" (or \"RSD\") refers to a removable drive containing Chromium OS recovery software. In contexts other than that phrase, the term \"device\" refers to a Chromium OS-based device such as a netbook.\u003c/p\u003e\r\n\u003cp\u003eFor background and other relevant information, see the following documents:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://dev.chromium.org/chromium-os/chromiumos-design-docs/firmware-boot-and-recovery\" title\u003d\"Firmware Boot \u0026amp; Recovery\"\u003eFirmware Boot and Recovery\u003c/a\u003e: how the firmware gets into recovery mode.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/developer-mode\"\u003eDeveloper Mode\u003c/a\u003e: how developer mode works, including the developer switch.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://www.chromium.org/chromium-os/chromiumos-design-docs/filesystem-autoupdate\"\u003eFile System/Autoupdate\u003c/a\u003e: how normal updates work.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://dev.chromium.org/chromium-os/chromiumos-design-docs/verified-boot\" title\u003d\"Firmware Verified Boot\"\u003eFirmware Verified Boot\u003c/a\u003e: how kernel images are signed.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/disk-format\"\u003eDisk Format\u003c/a\u003e: disk drive format, used for both the Chromium OS device and the recovery storage device.\u003c/li\u003e\r\n\u003cli\u003eBoot Process (forthcoming): how kernel images are loaded into RAM and executed.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Design-goals\" /\u003eDesign goals\u003c/h2\u003e\r\n\r\n\u003cp\u003eThe recovery software can vary by use case to satisfy a variety of different goals.\u003c/p\u003e\r\n\u003cp\u003eFor the average user:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eOnly need to support one device model.\u003c/li\u003e\r\n\u003cli\u003eDownload the minimum amount of data.\u003c/li\u003e\r\n\u003cli\u003eShould be a way to build a recovery device ahead of time; using this recovery device for a restore should not require the network.\u003c/li\u003e\r\n\u003cli\u003eMinimal interaction required.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\r\n\u003cp\u003eFor the developer:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eSupport loading other operating systems.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eFor manufacturing or corporate settings:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eSupport a range of device models.\u003c/li\u003e\r\n\u003cli\u003eCentralized management of images to be pushed; updating the image should not require re-flashing many RSDs.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eSecurity:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eContent stored locally on the storage device should be used in preference to that on the network.\u003c/li\u003e\r\n\u003cli\u003eUse secure transport to network image server.\u003c/li\u003e\r\n\u003cli\u003eImages are signed (see the \u003ca href\u003d\"http://dev.chromium.org/chromium-os/chromiumos-design-docs/verified-boot\"\u003eFirmware Verified Boot\u003c/a\u003e document)\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003e\r\nSimplicity \u0026amp; Robustness:\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003ePush complexity from the firmware to the recovery kernel+rootfs, where a full Linux-like environment is available.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Entering-recovery-mode\" /\u003eEntering recovery mode\u003c/h2\u003e\r\n\u003cp\u003eFor detailed information about entering recovery mode, see the \u003ca href\u003d\"http://dev.chromium.org/chromium-os/chromiumos-design-docs/firmware-boot-and-recovery\"\u003eFirmware Boot and Recovery\u003c/a\u003e document. This section is only a brief summary.\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eRecovery mode can be triggered:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eAutomatically by the Chromium OS firmware or software, if it determines that the system is corrupt and that the backup firmware/software is also corrupt.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eManually, by the user pressing a Recovery Mode button during boot.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eIn either case, if a storage device is present and it contains a signed recovery image, then the firmware doesn't display anything; it assumes the recovery image will display relevant information and tell the user what is going on. \u003c/p\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cp\u003eIf a storage device is not present, or does not contain a valid recovery image, then the firmware needs to get the user started on the recovery process. To do this, it will display a screen which conveys the following information to the user:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eYour netbook has booted into recovery mode.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eDon't panic!\u003c/li\u003e\r\n\u003cli\u003eGo to a URL specific to the device model for more instructions: (insert model-specific URL here; the exact URL is still under development - for example, http://chromeos.google.com/recovery/\u003ci\u003ehardware_model_ID\u003c/i\u003e or http://goo.gl/recovery/\u003ci\u003ehardware_model_ID\u003c/i\u003e)\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eThat information needs to be accessible in many languages, since we won't know ahead of time what language the user is speaking, and the firmware which displays the screen is non-interactive (does not have access to the keyboard).  One way to do this is to use just a pictograph and a URL.  It is crucial to instill the need for the user to go to another computer to visit the URL specified on the screen.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Recovery-website\" /\u003eRecovery website\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eFor devices shipping with Google Chrome OS, the recovery website will be a Google-hosted website which provides instructions and installers for creating RSDs.\u003c/p\u003e\r\n\u003cp\u003e\r\nInstructions will be customized for each device model. For example, if a particular netbook model does not have wired networking, the instructions for that model won't suggest plugging in a network cable. The types of valid external storage devices and their physical locations on the netbook can also be customized per model.\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eThe recovery website will ask the user to get an appropriate storage device, then download a recovery installer (see below) to finish the recovery. It should also download a small config file with the model number of the netbook to be recovered, so that the recovery installer can use that to fetch the right recovery data. \u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Recovery-installer\" /\u003eRecovery installer\u003c/h2\u003e\r\n\u003cp\u003eThis is a small program which helps a user create a RSD.\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eSince the installer needs to run on any computer, we need multiple versions of it (Windows, Mac, Linux, Chromium OS). The Chromium OS installer will be part of the default Chromium OS install image, so that any Chromium OS device can be used to create a RSD for any other Chromium OS device.\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eThe installer will do the following:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003col\u003e\u003cli\u003ePrompt the user to choose a target storage device to use as the RSD.\u003c/li\u003e\r\n\u003cli\u003eVerify the storage device is large enough.\u003c/li\u003e\r\n\u003cli\u003eDownload the appropriate recovery software (recovery kernel + recovery root filesystem) and save it to the RSD.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eDownload the appropriate recovery data (Chromium OS firmware + kernel + rootfs + recovery configuration data) and save it to the RSD.\u003c/li\u003e\r\n\u003cli\u003ePrompt the user to remove the storage device and plug it into the netbook.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003cp\u003e\r\nFor more information about the recovery software and data, see the \"Types of Data\" section elsewhere in this document.\u003c/p\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cp\u003eThe following features for the recovery installer are optional for version 1.0, and may be included in future versions:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eIf the target storage device is big enough for the recovery software, but too small to fit both the recovery software and recovery data, the installer could help the user set up network recovery mode (see below).\u003c/li\u003e\r\n\u003cli\u003eIt could offer to back up the existing contents of the storage device before creating the RSD, then restore those contents to the storage device after the recovery is done.\u003c/li\u003e\r\n\u003cli\u003eIt could detect the language setting on the source computer, then automatically use that language for all displays and prompts during recovery.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eOne potential starting point for a recovery installer is \u003ca href\u003d\"http://unetbootin.sourceforge.net/\" rel\u003d\"nofollow\"\u003eUNetbootin\u003c/a\u003e. It already makes recovery / installer images for several OSes, and runs on Windows and Linux.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Types-of-data-on-a-recovery-storage-device\" /\u003eTypes of data on a recovery storage device\u003c/h2\u003e\r\n\r\n\u003cp\u003e\r\nThe following types of data may be present on a RSD. For information on which kinds of data appear on each type of RSD, see the \"Types of recovery storage device\" section, below.\u003c/p\u003e\r\n\r\n\u003cp\u003eFor more information on GUID partition tables and Chromium OS partition types, see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/disk-format\"\u003eDisk Format\u003c/a\u003e.\u003c/p\u003e\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Recovery-kernel\" /\u003eRecovery kernel\u003c/h3\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eThis is a Chromium OS kernel partition, signed by the same authority as the firmware on the device. It boots the netbook into a more usable / interactive state for the rest of recovery mode.\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cp\u003eFor Google Chrome OS devices, the kernel is signed by Google. The user will download the recovery kernel from the Google recovery website.\u003c/p\u003e\r\n\u003cp\u003eA different recovery kernel is needed for each processor architecture (x86, ARM).\u003c/p\u003e\r\n\u003cp\u003eSince boot speed is not important, we don't need to optimize the kernel for variants of each processor architecture; we can compile for the lowest common feature set.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Recovery-root-filesystem\" /\u003eRecovery root filesystem\u003c/h3\u003e\r\n\u003cp\u003eThis is a Chromium OS rootfs partition, signed by the same authority as the recovery kernel.\u003c/p\u003e\r\n\u003cp\u003eA recovery root filesystem can support a range of models with compatible processor architecture; drivers for multiple types of display and storage can be included. Alternately, if over time the diversity of Chromium OS devices makes the size of the filesystem prohibitively large, we can produce multiple images, each applicable to a subset of devices. In the latter case, the model-specific URL provided by the recovery mode firmware will point the user to the correct image for that device.\u003c/p\u003e\r\n\u003cp\u003eTo determine and/or verify which set of recovery data (Chromium OS kernel, rootfs and firmware) is appropriate for the netbook to be recovered, the read-only firmware on the netbook will supply an API for the recovery image to discover the netbook's model number. (See the (forthcoming) System SKU Reporting Specification.) \u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Recovery-data\" /\u003eRecovery data\u003c/h3\u003e\r\n\u003cp\u003eThis data partition contains data for the recovery. It may contain rootfs image(s), firmware image(s), and/or network configuration.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Chromium-OS-kernel-rootfs\" /\u003eChromium OS kernel+rootfs\u003c/h4\u003e\r\n\u003cp\u003eThis is a full Chromium OS kernel+rootfs image.\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eAll images are signed to protect against accidental or intentional corruption.\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eIt may be a Google-signed image provided by the Google Chrome OS update server.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eAlternately, it may be a developer-signed image. See Developer Mode below.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eImages will have a header that provides the following information: \u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eChromium OS version\u003c/li\u003e\r\n\u003cli\u003eSigning authority (Google or developer)\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eIf multiple versions of an image are available from the same location (for example, the data partition on the RSD), the newer version should take precedence.\u003c/p\u003e\r\n\r\n\u003cp\u003e\r\nImages signed by the same authority as the firmware take precedence over images signed with other authorities.  On a Google Chrome OS device, if both a Google-signed image and a developer-signed image are available from the same location (for example, the data partition on the RSD), the Google-signed image should take precedence. This protects normal users. The developer documentation on the Chromium OS website will provide instructions for developers to construct an RSD without a Google-signed image, so that they can load their own OS.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Chromium-OS-firmware\" /\u003eChromium OS firmware\u003c/h4\u003e\r\n\u003cp\u003eThis is firmware for a Chromium OS device.\u003c/p\u003e\r\n\u003cp\u003eIt has the same information about versions and signing authority in the filename and/or header as the rootfs, and the same rules of precedence apply if multiple firmware files are present. \u003c/p\u003e\r\n\u003cp\u003eThe firmware is likely to be included inside the Chromium OS rootfs.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Network-configuration\" /\u003eNetwork configuration\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eThis is configuration data for downloading recovery data over the network. This includes:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eorder in which to attempt network interfaces (default: wired, then wireless)\u003c/li\u003e\r\n\u003cli\u003eWiFi SSID and WPA key, to support loading recovery data over WiFi (no default; if not present and attempting wireless, prompt user)\u003c/li\u003e\r\n\u003cli\u003enetwork configuration (gateway, DNS, etc.) (default: use DHCP)\u003c/li\u003e\r\n\u003cli\u003ehostname or IP address of recovery server (default: Google's update server)\u003c/li\u003e\r\n\u003cli\u003essh keys for recovery server, to prevent attackers from presenting a simulated server (default: whatever keys we use to sign communication with our update server)\u003c/li\u003e\r\n\u003cli\u003eshould the image downloaded from the server be stored to the RSD's data partition for future re-use, or not? (default: yes)\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Types-of-recovery-storage-device\" /\u003eTypes of recovery storage device\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eA recovery storage device is a USB key or SD card containing one or more recovery kernels and recovery root filesystems, and data to support the recovery.\u003c/p\u003e\r\n\u003cp\u003e(Other kinds of external storage devices may be usable in the future.)\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eDepending on the contents of the RSD:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eIt may support only one model of netbook, or multiple models.\u003c/li\u003e\r\n\u003cli\u003eIt may load recovery data (rootfs + firmware) from the RSD itself, or over the network.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp\u003eThe following subsections describe some typical types of RSDs.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Single-recovery-storage-device\" /\u003eSingle recovery storage device\u003c/h3\u003e\r\n\u003cp\u003eThis is the most common type of RSD. It contains a single bootable recovery image, and a single set of recovery data. It is self-contained; using it to recover a device does not require access to the network. This is the type of RSD created by a recovery installer. It is the least flexible RSD, since it supports only a single device model.\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/recovery-mode/srjy2ox0dbMkVTv25qW2QdA.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1271194914265/chromium-os/chromiumos-design-docs/recovery-mode/srjy2ox0dbMkVTv25qW2QdA.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Network-recovery-storage-device\" /\u003eNetwork recovery storage device\u003c/h3\u003e\r\n\u003cp\u003eThis type of RSD loads the Chromium OS software and firmware from a server, rather than storing it directly on the card.\u003c/p\u003e\r\n\u003cp\u003eThe recovery software identifies the target device, then downloads matching recovery data from the server.  This allows a single RSD to support multiple target device models.\u003c/p\u003e\r\n\u003cp\u003eThe server may be the main Google Chrome OS server provided by Google, or a local server. This is suitable for a larger corporate, commercial, or manufacturing environment. Upgrading the recovery data for a netbook model only requires updating the server, not multiple RSDs. A new model can also be supported without upgrading the RSDs, as long as the network recovery software supports the new model's hardware.\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/recovery-mode/sk78RvI_UcGGddwNUBzsAcA.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1271194947844/chromium-os/chromiumos-design-docs/recovery-mode/sk78RvI_UcGGddwNUBzsAcA.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\r\n\u003cp\u003eFuture versions of this specification may allow a PXE boot style implementation, where the PXE code lives in the recovery kernel instead of the firmware.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Developer-mode\" /\u003eDeveloper mode\u003c/h2\u003e\r\n\r\n\u003cp\u003eA developer can use recovery mode to load their own OS image onto a Google Chrome OS device. To do this, all they need to do is make a RSD which contains developer-signed recovery data in place of the Google-signed recovery data.\u003c/p\u003e\r\n\r\n\u003cdiv\u003e\r\n\u003cp\u003eSee the Developer Mode design document (forthcoming) for more details. Key points:\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eThe device's developer mode switch must be turned on before developer-signed images can be loaded.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eIf the kernel on the RSD is signed with a different key than the kernel on the destination device, there is a 5-minute delay, during which time the user must interact with the screen and keyboard, and sound is played. This makes it more difficult to discreetly reprogram a device, protecting both users and developers.\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eFor i18n, the developer mode screens must be displayed in the proper language. If the language is not detected/set by the recovery installer, then recovery needs to have a language selection screen during startup.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Network-recovery\" /\u003eNetwork recovery\u003c/h2\u003e\r\n\u003cp\u003eIf appropriate recovery data for the target netbook is not present on the RSD, the recovery software on the RSD can attempt to download the recovery data from a server on the network.\u003c/p\u003e\r\n\u003cp\u003eTo deter spoofing attacks, communication with the server should be done over a secure channel (such as sftp).\u003c/p\u003e\r\n\u003cp\u003eThe default behavior is to contact the Google Chrome OS update server, using wired networking in preference to wireless. This can be overridden via a network configuration file on the RSD.\u003c/p\u003e\r\n\r\n\u003cp\u003eNetwork recovery is useful during manufacturing, to load the initial rootfs onto the drive. This procedure would look something like this:\u003c/p\u003e\r\n\r\n\u003col\u003e\u003cli\u003eAs each assembled netbook is ready for programming, a tech\u003c/li\u003e\r\n\u003col\u003e\u003cli\u003etakes an RSD from a bucket and plugs it into the netbook;\u003c/li\u003e\r\n\u003cli\u003eplugs the netbook into external power (and possibly wired network);\u003c/li\u003e\r\n\u003cli\u003epowers on the netbook.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cli\u003eRecovery mode launches, because the netbook's drive has no bootable image.\u003c/li\u003e\r\n\u003cli\u003eThe network configuration file on the RSD points to a manufacturing server. The correct image for the netbook is loaded from the server.\u003c/li\u003e\r\n\u003cli\u003eWhen the netbook is done recovering, the tech unplugs the RSD and tosses it back in the bucket.\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\r\n\u003cp\u003e\r\nNetwork recovery is also useful in corporate environments. Tech support can maintain a single server with all appropriate images; each tech stop location only needs a few generic RSDs to support all the models of netbooks. To deploy a new image, only the server needs to be changed.\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/recovery-mode"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5890258080063263598"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5890258080063263598"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5890258080063263598"}],"author":[{"name":{"$t":"Kan Liu"},"email":{"$t":"kanliu@chromium.org"}}],"sites$pageName":{"$t":"recovery-mode"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4054188271514436561"},"published":{"$t":"2013-09-14T00:35:04.279Z"},"updated":{"$t":"2013-09-14T00:47:30.223Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-14T00:47:28.396Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Embedding Flash Fullscreen in the Browser Window"},"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\u003ch1 dir\u003d\"ltr\" style\u003d\"text-align:left;line-height:1;margin-top:12pt;margin-bottom:12pt\"\u003e\u003ca name\u003d\"TOC-Author:-Yuri-Wiitala-miu-chromium.org-\" /\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Verdana;white-space:pre-wrap;line-height:1;font-size:10pt;font-weight:normal\"\u003eAuthor: Yuri Wiitala (miu@chromium.org)\u003c/span\u003e\u003c/h1\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:12pt\"\u003e\u003ca name\u003d\"TOC-Objective\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Verdana;color:rgb(61,133,198);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eObjective\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEnhance the [Pepper] Flash fullscreen user experience in Chromium to match the HTML5 fullscreen experience.  This would provide users with a single, consistent fullscreen-mode experience, with Flash fullscreen gaining the improved window/desktop management behaviors of HTML5 fullscreen.  For example, on Mac, one cannot switch to other apps from Flash fullscreen, but this action is intelligently handled in the HTML5 fullscreen case.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSide note: Later on, we seek to improve the fullscreen UX further by introducing a new \"Fullscreen in Tab\" concept for tab capture/screencasting (\u003c/span\u003e\u003ca href\u003d\"http://crbug.com/256870\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://crbug.com/256870\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e).  While a user is \"casting,\" fullscreen content is being displayed on a remote screen.  Therefore, the local screen should be usable for other tabs or applications.  The changes proposed in this document are a necessary prerequisite for this.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:24px;font-family:Verdana;color:rgb(61,133,198);background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eBackground\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrently, Flash fullscreen is implemented in the \"content\" component where a raw, platform-dependent fullscreen window is created.  Some minimal focus/keyboard control logic is added to support exit and mouse-lock.  The entire stack assumes the Flash plugin handles the user permissions with respect to allowing fullscreen and/or mouse-locking, and so blindly allows all requests.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFullscreen mode is initiated by the render process, which is proxying the request from the Pepper Flash process.  It sends a \"create\" message followed immediately by a \"show\" message.  Once the fullscreen window is shown, a resize message is sent back to the renderer as a signal that painting may begin.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe control flow for entering and exiting Flash fullscreen is as follows:\u003c/span\u003e\u003c/p\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/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser.png.1379119228467.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1379119228990/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser.png.1379119228467.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOn the other hand, the Browser (user-initiated, \"F11\") and Tab/HTML5 (renderer-initiated) fullscreen modes are controlled by the browser UI implementation in the \"chrome\" component, one abstraction level higher.  The browser uses FullscreenController to manage the window sizing and show \"permissions balloons\" for both modes, and handles the transitions of switching in-between or in-and-out.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo engage fullscreen mode for an HTML5 element, the renderer sends a \"toggle\" message to the browser process.  Unlike Flash fullscreen, no new widgets are created.  FullscreenController instructs the browser window to expand to fill the screen, and this causes the tab content view to be resized via the layout process.  Then, the renderer process receives a resize message signalling that fullscreen mode is on.  The originating HTML5 element (e.g., a video element), will then be resized to fill the content area.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe control flow for entering and exiting HTML5 fullscreen is as follows:\u003c/span\u003e\u003c/p\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/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser%20%281%29.png.1379119292169.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1379119292389/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser%20%281%29.png.1379119292169.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThus, there exist two separate fullscreen control/view implementations in Chromium that operate independently and at different component layers.  There actually exists a conflict, should a page choose to initiate HTML5 fullscreen during Flash fullscreen or vice versa.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:12pt\"\u003e\u003ca name\u003d\"TOC-Observations-and-Goals\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Verdana;color:rgb(61,133,198);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eObservations and Goals\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFortunately, there are key similarities between the implementations of Flash fullscreen and HTML5 fullscreen that suggests the former can be merged into the machinery of the latter.  First, renderer-side, both send one or more messages to the browser process to engage fullscreen mode, and both expect an asynchronous ViewMsg_Resize message to confirm and receive the fullscreen dimensions.  Second, browser-side, the messages from the renderer are handled by delegating to the same WebContentsImpl instance to initialize and kick-off.  Finally, the browser process sends one or more ViewMsg_Resize messages to notify the renderer of \"screen size\" changes, and a ViewMsg_Close to shut down rendering of the widget.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn the past, developing for the Pepper Flash plugin required overcoming very temperamental compatibility issues.  Since one permeating goal is to ensure Flash fullscreen does not break, no changes will be made that could be observable by the renderer process (and, by proxy, the pepper flash plugin).  This means no changes to IPC messaging, with the ordering and content of the messages being exactly the same as in the current implementation.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf we are to proceed, one UX issue to resolve is the \"Press Esc to Exit Fullscreen\" message rendered by the Pepper Flash plugin: Ideally, for consistency, this would be removed in favor of the balloon pop-up shown by FullscreenController.  If this is not possible, then the balloon pop-up should not be displayed for Flash.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:12pt\"\u003e\u003ca name\u003d\"TOC-Design\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Verdana;color:rgb(61,133,198);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDesign\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA three-part change to the existing design is proposed.  First, the Flash \"fullscreen\" render widget will become embedded within the browser window.  More specifically, it will replace the normal tab content view in the view hierarchy and participate in layout like any other widget.  The owner and creator of the widget will remain the same and, from the renderer's perspective, Flash will still be painting into its own dedicated \"fullscreen\" widget.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSecond, the FullscreenController will be used to manage the the sizing/expansion of the browser window for all fullscreen modes, including Flash, and will treat Flash fullscreen in the same way as HTML5 fullscreen.  As an embedded widget within the browser window, the Flash fullscreen widget will become expanded to fill the entire screen during the layout process.  FullscreenController itself will need only small tweaks: Just as for HTML5 fullscreen, it will be tasked to decide whether the fullscreen and mouse-lock privileges are allowed, but will instead treat Flash fullscreen mode as fully-privileged by default.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFinally, WebContentsImpl will be modified to invoke the new \"embedded widget\" code paths for startup and shutdown (described in detail below).  Use of the new code paths versus the old will be switchable via a new WebContentsDelegate method, EmbedsFullscreenWidget().  This method will declare whether the browser implements embedded Flash fullscreen and whether it is enabled/disabled via command-line flags.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe control flow for entering and exiting embedded Flash fullscreen is as follows (additions/changes in \u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(153,0,0);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ered\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e):\u003c/span\u003e\u003c/p\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/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser%20%282%29.png.1379119349348.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1379119349755/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser%20%282%29.png.1379119349348.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Entering-Embedded-Flash-Fullscreen-Mode\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEntering Embedded Flash Fullscreen Mode\u003c/span\u003e\u003c/h2\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebContentsImpl drives this process, being the delegate of the RenderViewHostImpl which receives the \"show\" message from the renderer.  Instead of showing the window it created as a raw, fullscreened window, the behavior of ShowCreatedFullscreenWidget() changes to the following:\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-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eToggle the Browser into fullscreen mode via the same code path as for HTML5 fullscreen.  This triggers FullscreenController's logic which will cause the BrowserWindow to expand and re-layout for full-screen.  In addition, the \"Allow/Exit\" balloon pop-up will be shown, if appropriate.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eInvoke WebContentsObserver::DidShowFullscreenWidget() for all observers.  This will be received by WebView (or TabContentsController for Mac), which is the child view within BrowserWindow that contains the tab content.  WebView will alter its child window hierarchy to embed the Flash fullscreen widget within itself and, therefore, within the fullscreened BrowserWindow.  WebView accesses the Flash fullscreen widget via a new WebContents::GetFullscreenRenderWidget() method.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Exiting-Embedded-Flash-Fullscreen-Mode\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eExiting Embedded Flash Fullscreen Mode\u003c/span\u003e\u003c/h2\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eExiting must be considered from two possible originators.  When the exit is requested by the Flash widget itself, RenderWidgetHostImpl::Shutdown() will be invoked in the browser process, which in turn calls WebContentsImpl::RenderWidgetDeleted().  From here, two steps are taken:\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-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eToggle the Browser out of fullscreen mode.  FullscreenController performs the same actions as it would for coming out of HTML5 fullscreen, restoring the original size and layout of the BrowserWindow.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eInvoke WebContentsObserver::DidHideFullscreenWidget() for all observers.  WebView receives this and responds by re-attaching the normal tab content view in its child window hierarchy.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen the exit originates from the Browser UI (e.g., user action in the \"Allow/Exit\" balloon):\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-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFullscreenController takes the BrowserWindow out of fullscreen mode, just like HTML5 fullscreen mode.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFullscreenController invokes RenderViewHostImpl::ExitFullscreen().  Again, this is just like HTML5 fullscreen mode.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:decimal;font-family:Verdana;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt this point, RenderViewHostImpl notices a Flash fullscreen widget is active, and invokes its RenderWidgetHostImpl::Shutdown() method.  As described above, shutting down the widget will cause the DidHideFullscreenWidget() notification to be sent to WebView, restoring the normal tab content view in the browser window.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Other-Considerations\" /\u003e\u003cspan style\u003d\"font-size:17px;font-family:Trebuchet MS;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOther Considerations\u003c/span\u003e\u003c/h2\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWindows 8 Metro Snap mode\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: When entering Flash fullscreen mode, the FullscreenController will no-op.  However, WebView will still receive the DidShowFullscreenWidget() notification, allowing it to correctly embed the Flash fullscreen widget within itself, all properly laid out within the Metro-Snapped browser window.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eKiosk (Fullscreen App) mode\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Just like Windows 8 Metro Snap mode, the FullscreenController will no-op and WebView will correctly embed the Flash fullscreen widget.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eContent Shell and non-Chromium applications\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e that use src/content/ as a library: By default, the non-embed Flash fullscreen code path will be used.  The key to this is the new WebContentsDelegate::EmbedsFullscreenWidget() method, whose default implementation returns false.  The method is only overridden to return true for the Chromium browser on supported platforms.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:10pt;margin-bottom:12pt\"\u003e\u003ca name\u003d\"TOC-Work-Plan\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Verdana;color:rgb(61,133,198);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWork Plan\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePrototyping/Feasibility of Design: \u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eCompleted\u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (\u003c/span\u003e\u003ca href\u003d\"http://crrev.com/23656002\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-family:Verdana;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://crrev.com/23656002\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Verdana;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;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation for Aura, Windows and Mac; disabled by default, behind feature flag: M31 (\u003ca href\u003d\"http://crrev.com/23477051\"\u003ehttp://crrev.com/23477051\u003c/a\u003e).\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation for GTK: M32 (with M31 as a stretch goal).\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Verdana;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLaunch goal: Tested, UI review, and enabled by default for M32.\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4054188271514436561"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4054188271514436561"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4054188271514436561"}],"author":[{"name":{"$t":"Yuri Wiitala"},"email":{"$t":"miu@chromium.org"}}],"sites$pageName":{"$t":"embedding-flash-fullscreen-in-the-browser-window"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6521730031961532981"},"published":{"$t":"2013-09-14T00:42:29.569Z"},"updated":{"$t":"2013-09-14T00:42:29.755Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-14T00:42:29.569Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Design Doc- Flash Fullscreen in Browser (2).png.1379119349348.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6521730031961532981"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4054188271514436561"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser%20(2).png.1379119349348.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6521730031961532981"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6521730031961532981"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6521730031961532981"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6521730031961532981"}],"author":[{"name":{"$t":"Yuri Wiitala"},"email":{"$t":"miu@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7106668488160928460"},"published":{"$t":"2013-09-14T00:41:32.320Z"},"updated":{"$t":"2013-09-14T00:41:32.389Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-14T00:41:32.320Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Design Doc- Flash Fullscreen in Browser (1).png.1379119292169.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7106668488160928460"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4054188271514436561"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser%20(1).png.1379119292169.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7106668488160928460"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7106668488160928460"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7106668488160928460"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7106668488160928460"}],"author":[{"name":{"$t":"Yuri Wiitala"},"email":{"$t":"miu@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4034292923494741637"},"published":{"$t":"2013-09-14T00:40:28.770Z"},"updated":{"$t":"2013-09-14T00:40:28.990Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-14T00:40:28.770Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Design Doc- Flash Fullscreen in Browser.png.1379119228467.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4034292923494741637"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4054188271514436561"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/embedding-flash-fullscreen-in-the-browser-window/Design%20Doc-%20Flash%20Fullscreen%20in%20Browser.png.1379119228467.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4034292923494741637"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4034292923494741637"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4034292923494741637"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4034292923494741637"}],"author":[{"name":{"$t":"Yuri Wiitala"},"email":{"$t":"miu@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3397836293170246713"},"published":{"$t":"2013-09-13T17:02:50.685Z"},"updated":{"$t":"2013-09-13T17:02:50.749Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-09-13T17:02:50.685Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"output.png.1379091770284.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3397836293170246713"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3206081733549777770"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/gesture-recognizer/output.png.1379091770284.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3397836293170246713"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3397836293170246713"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3397836293170246713"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3397836293170246713"}],"author":[{"name":{"$t":"Tim Dresser"},"email":{"$t":"tdresser@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5722798529266330735"},"published":{"$t":"2013-04-29T17:28:53.223Z"},"updated":{"$t":"2013-08-30T18:26:32.211Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-29T17:29:04.527Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GS Offloader"},"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 style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e is a crucial part of the chrome os lab infrastructure as it is in charge of ensuring that the drones don't run out of disk space. When we run jobs on the drone, we store their job results on the drone and each one generates at least some amount of data. However due to the number of tests we run and the fact that crash logs can cause the amount of data to increase greatly, disk space on our drones can be eaten up rather quickly. But we can't simply delete the job results as we may need it in the future when bugs occur or we discover infrastructure problems.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e solves this problem by running on its own on the drones and offloads the test result data to google storage for permanent storage. In a brief overview: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e monitors the results directory of tests and special tasks and for each folder in the results directory it checks if the corresponding job is completed. If so the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e will make system level calls to send this data to google storage. In general it will be using gsutil but \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003ersync\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eing to another host is an option as well.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOriginally, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e offloaded both the job results and the special task results within the same loop. It was found that we would frequently spend a while offloading special task results, which are quite small, while job results, which are much larger, would pile up. Thus, we could either try to prioritize directories by size, or just run two instances of \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, one for special tasks and one for job results. The latter is far simpler, so it's what we currently have. Thus, we run two copies of \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, and the code path for each is slightly different but follows the same type of logic.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e's main thread loops over the results directory and for each folder it uses the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eis_job_complete\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e module to determine if it should offload the directory. \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eis_job_complete\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e makes an RPC call to check if that job has been marked as completed. If so the folder is queued up to be offloaded by the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e's offloading threads.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe actual offloading takes place as a system level call to \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egsutil\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. This means that the system running\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e needs its \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e~/.boto\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e file setup correctly in order for it to work, as that's where the credentials to access google storage are held. The call follows the format of \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egsutil -m cp -eR -a project-private [folder to offloader] gs://chromeos-autotest-results/[folder to offloader relative path to results]\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIf offloading is going too slowly, (ie. nagios alerts are being sent out about the drives filling up, and the problem has been tracked down to there being too many job results stored locally) you can take advantage of the multi-threading by restarting \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e to run with more offloading threads until most of the results are gone. By default, it only runs with one \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egsutil\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e command at a time. This can be done by running \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003esudo stop gs_offloader; sudo start gs_offloader PARALLELISM\u003d5\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e to have \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e have up to 5 parallel invocations of \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egsutil\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e running at once.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDue to the fact that gsutil calls can hang for hours we have a built-in timeout of 3 hours. This timeout is implemented by surrounding the subprocess call we make to kick off gsutil with a \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eSIGALRM\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e timer. This works by setting the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eSIGALRM\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e timer to 3 hours, kicking off gsutil with \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003esubprocess.Popen\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e and then waiting on the kicked off process. If the timeout occurs before Popen returns then we know we hit a timeout and log the error and send out an email warning the lab team.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eSince we always have the chance of the gsutil call failing we wanted to ensure we properly capture stdout and stderr for the process call. Therefore we redirect both to temp files in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e/tmp \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eso if there is a failure we have the data and email it out. And if not we can simply delete it. The emailer code is the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eemail_manager\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e used by the scheduler in order to reduce the number of email clients we use for our team.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIt's worthwhile to note that \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e is designed to be an extremely long-running process. This means that it'll likely be subjected to, and should properly handle, unusual events such as the results database being truncated, cautotest or cautotest-mysql moving to a different host, or other services being down/unavailable. The term 'thread' has also been used here lightly, the current implementation actually uses a wrapper around multiprocessing in chromite to do the parallelism, as the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eSIGALRM \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003etimer doesn't play well with python threading.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIn conclusion, the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egs_offloader\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e monitors our result repositories and sends the data to google storage for permanent storage. Without it our machines would fill up and the lab would go down making it a crucial piece of the lab infrastructure.\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/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/gs-offloader"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5722798529266330735"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5722798529266330735"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5722798529266330735"}],"author":[{}],"sites$pageName":{"$t":"gs-offloader"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3740145594917216428"},"published":{"$t":"2013-07-01T18:33:30.645Z"},"updated":{"$t":"2013-08-30T18:24:25.609Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-30T20:07:23.763Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Autotest Keyvals"},"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.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eJob keyvals are key/value pairs, used to cache/exchange data about jobs between different services in autotest, via the database. There are two keyvals tables, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eafe_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e tko_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Both tables have a \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ejob_id\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e column for keyvals to be foreign keyed to a job. The\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e job_id\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e can be a suite job id if jobs are queued by a suite run, or test job id if the job is queued directly from atest/run_remote_test/autoserv.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eThe initial job keyvals get specified as part of the arguments to the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003ecreate_job\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e RPC and entered into the database (into the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eafe_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e table). Then, before we go to run a job, we pull the keyvals out of the database and write them to a file. This is done by a class named \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eTaskWithJobKeyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e that is a mixin that gets included for the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eAgent\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003es representing job runs. The parsing of these keyvals back into the database happens when the scheduler kicks off \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003etko/parse.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e to parse job results during the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003ePARSING\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e phase. \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003etko/parse.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e calls \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003etko/db.py:insert_job()\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e, which contains the call to \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eupdate_job_keyvals()\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e which does the actual j\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eo\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eb keyval \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ewriting. Th\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eese get inserted into \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003etko_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e, so the initial keyvals are always in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eafe_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e, and the final results in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003etko_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);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.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eafe_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e stores the a job's suite and build information. \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003etko_job_keyvals\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003e stores the test result information, including: \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003euser that requested the job\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003ejob start/end time (job_started, job_queued, job_finished)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003eperf keyvals, which are up to individual tests to create as they see fit. The use and lifecycle of perf keyvals is explained in detail on \u003c/span\u003e\u003cspan style\u003d\"text-decoration:underline;font-size:13px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-keyvals/perf-keyvals\"\u003ea separate webpage\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);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.15;margin-top:4pt;margin-bottom:0pt;margin-right:11pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImportantly, the tko_job_keyvals entry for a suite job stores a dictionary between hashed test names and job_id-owner. After a suite job is finished, run_suite uses this dictionary to find out the job url for a particular test. The reason for this is that when a suite is started, all keyvals are keyed by suite job id. The test job id is set only after the test job is started.  After a test job has finished, autoserv creates logs a keyval (for the test’s job id) with the hashed test name as the key and job_id-owner as the value. run_suite pulls the keyval from tko_job_keyval table and maps the test job to its result page, which is the test job page, rather than suite job page.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);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/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-keyvals"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3740145594917216428"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3740145594917216428"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3740145594917216428"}],"author":[{"name":{"$t":"Aviv Keshet"},"email":{"$t":"akeshet@chromium.org"}}],"sites$pageName":{"$t":"autotest-keyvals"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7031740100850513229"},"published":{"$t":"2013-04-15T22:07:21.996Z"},"updated":{"$t":"2013-08-30T18:22:36.107Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-15T22:08:07.861Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"AFE RPC Infrastructure"},"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 style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:23pt;margin-bottom:23pt\"\u003e\u003ca name\u003d\"TOC-Infrastructure\" /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap;line-height:1.575\"\u003eInfrastructure\u003c/span\u003e\u003c/h1\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOur RPCs are served by apache running on cautotest using django's ability to map python's functions to URLs. In \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/urls.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e we end up mapping \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e/rpc/\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e to \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/views.py:handle_rpc()\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e via the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003egenerate_patterns()\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e call in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/urls_common.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. The \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003ehandle_rpc\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e view very quickly bails out to the code in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/rpc_handler.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, which pulls all functions defined in  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/rpc_interface.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/site_rpc_interface.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, and then exposes them as RPCs.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAny changes done to the RPC infrastructure will require a restart of apache, since all of the python code is loaded only once when apache first starts.  This means that any updates to the code done after apache is started won’t be used or seen.  To solve this, one can gracefully restart apache by running \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003esudo /etc/init.d/apache2 reload\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.  Any CLs that you write that touch RPC-related code should include the line \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eDEPLOY\u003dapache \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eto indicate to whoever is pushing that this step needs to be done.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eData being sent and received by an RPC is serialized in json format, as can be seen in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/json_rpc/serviceHandler.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. The RPCs expect a JSON object of the form \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e{'id':int, 'method':string, 'params':[JSON]}\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. A response is sent back in the form \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e{'id':int, 'result':JSON, 'error':{'name':string, 'message':string, 'traceback':string}}\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAs a client, to call an RPC it is preferable to use the wrapper declared in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eautotest_lib.server.frontend.AFE\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. It automatically deduces the correct server from your global/shadow config, and wraps around the more bare client-side RPC interface in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/json_rpc/proxy.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:13pt;margin-bottom:13pt\"\u003e\u003ca name\u003d\"TOC-RPCs\" /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eRPCs\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWe use RPCs to provide a layer between database access and data querying. This allows use to enforce ACLs, centralize logic to ensure that the operation that is about to be done is sane, and to allow the underlying data representation to change without having to change code everywhere.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe RPCs that we have allow for create/get/update/delete operations to be done on most data that one would find important (hosts, labels, jobs, host queue entries, etc.). Very straightforward examples of these can be found by looking at the ./cli/atest source code.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIf you take a look at the functions defined in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003erpc_interface.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, you'll see that most of the get methods take an argument of \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efilter_data\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. This argument is then passed directly to the django models call, so everything that is allowed as a parameter on a django \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efilter()\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e call (ie.\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e__startswith\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003e__in\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, etc.) is valid to pass here. Slightly sadly though, this does mean that the RPCs do not completely abstract one from the underlying schema of the database tables.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTwo very notable RPCs are the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003ecreate_job\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e call in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003erpc_interface\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003ecreate_suite_job\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e in\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003esite_rpc_interface\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. This is the only place in autotest where jobs are created. Any special handling of job creation, such as parsing out METAVARs, or ensuring control file sanity, can be done at this point to enforce that only correctly formed control files will make it into the system.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe set of RPCs exposed doesn't have much functionality beyond just asking for a piece of data to be immediately returned or modified. This means that we have large parts of the system that sit and poll to see if an event has happened, instead of being able to wait for the completion of an event. Attempting to create a synchronous RPC, for example, one that creates a job, and returns once the job is done would be much more difficult, as everything goes down to MySQL in the end, and MySQL has no way to support notifying a piece of python code that a value has changed. (Or, at least, I don't know how to use triggers to do this.)\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIt should be noted that TKO has its own set of RPCs, generally used to access data in \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003etko_*\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e tables, uses of these don't come up quite as frequently in the code, but a notable case is \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003erun_suite.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e, which gets is information about the suite that ran by querying the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eget_detailed_test_view\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e TKO RPC.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.575;margin-top:0pt;margin-bottom:10pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTo add a new RPC, one would simply just add a new normal python function to \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003esite_rpc_interface.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e. The only restriction is that the return value of the function must be JSON serializable. It'd be a good idea to look at \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003efrontend/afe/rpc_utils.py\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e to see if there's any relevant functionality that'd be useful. Specifically, if you're just wrapping around a django model query, you can use the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Courier New;vertical-align:baseline;white-space:pre-wrap\"\u003eprepare_for_serialization\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e function to massage the returned django model objects into JSON.\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;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/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/afe-rpc-infrastructure"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7031740100850513229"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7031740100850513229"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7031740100850513229"}],"author":[{}],"sites$pageName":{"$t":"afe-rpc-infrastructure"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7075099386854145357"},"published":{"$t":"2013-04-01T15:59:56.635Z"},"updated":{"$t":"2013-08-30T18:06:12.109Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-30T12:59:06.575Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Collecting Stats for Graphite"},"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\u003ccenter /\u003e\r\n\u003ch1\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\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: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-Background\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eBackground\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Walkthrough\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eWalkthrough\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Timers\"\u003e\u003cstrong\u003e1.1.1 \u003c/strong\u003eTimers\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Counters\"\u003e\u003cstrong\u003e1.1.1.1 \u003c/strong\u003eCounters\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Gauge\"\u003e\u003cstrong\u003e1.1.1.2 \u003c/strong\u003eGauge\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Average\"\u003e\u003cstrong\u003e1.1.1.3 \u003c/strong\u003eAverage\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Raw\"\u003e\u003cstrong\u003e1.1.1.4 \u003c/strong\u003eRaw\u003c/a\u003e\u003c/li\u003e\u003c/ol\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-Gathering-stats-from-Whisper-via-the-Command-Line\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eGathering stats from Whisper via the Command Line\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Gathering-data-directly-from-Graphite.\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eGathering data directly from Graphite.\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Future-Work-Needed-Improvements\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eFuture Work/Needed Improvements\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/font\u003e\u003c/h1\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-2\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/h1\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eBackground\u003c/font\u003e\u003c/h2\u003e\r\n\u003cp\u003eWe have this amazing and fancy graph displaying utility called Graphite running on \u003ca href\u003d\"http://chromeos-stats/\" rel\u003d\"nofollow\"\u003echromeos-stats\u003c/a\u003e. It's beautiful. You all should use it. This doc is about how to get data into the system so that you can view it in Graphite.\u003c/p\u003e\r\n\u003cp\u003eThere are two different ways to get data into the system:\u003c/p\u003e\r\n\u003cp\u003eThe first is to write data to the raw backend of Graphite, which is called \u003cem\u003ecarbon\u003c/em\u003e. It accepts data in the format of \u003ccode\u003e\u0026lt;name\u0026gt; \u0026lt;value\u0026gt; \u0026lt;time\u0026gt;\u003c/code\u003e, and one can find a basic interface to sending data to carbon in \u003ccode\u003esite_utils.graphite.carbon\u003c/code\u003e.\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp\u003eThe second is to write data to a service which will calculate statistics over the data you're sending, and then forward it onto carbon. This service is called \u003cem\u003estatsd\u003c/em\u003e. It provides better information, as it will calculate min/mean/max, deviation, and provides a more intelligible interface. It also allows for better horizontal scaling in case we ever start logging a truely hilarious amount of stats. (Which we should!)\u003c/p\u003e\r\n\u003cp\u003eI would highly recommend using the statsd over carbon unless you have a specific reason to be sending data directly to carbon.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Walkthrough\" /\u003eWalkthrough\u003c/h2\u003e\r\n\u003cp\u003eWe have in \u003ccode\u003esite-packages\u003c/code\u003e a library named \u003ccode\u003estatsd\u003c/code\u003e. This has been wrapped for our purposes in a library located in \u003ccode\u003eautotest_lib.site_utils.graphite.stats\u003c/code\u003e, which does some connection caching, prepending of autotest server name, and a little other magic. The interface exposed is exactly the same as the one exposed by statsd, and therefore this doc should work as a guide for both. (But you should use the \u003ccode\u003esite_utils\u003c/code\u003e one!)\u003c/p\u003e\r\n\u003cp\u003eThis guide serves to be copy-paste-able, so you should be able to take any snippet out of this doc and run it. Therefore, here's the import boilerplate you'll need when messing around with this code from within autotest:\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003eimport time\r\nimport common\r\nfrom autotest_lib.site_utils.graphite import stats\r\n\u003c/code\u003e\u003c/pre\u003e\r\n\u003cp\u003eIf you prefer, you can find all the code listed in this doc (as of when this was published) in \u003ca href\u003d\"https://gerrit.chromium.org/gerrit/#/c/45286/\"\u003eCL 45286\u003c/a\u003e.\u003c/p\u003e\r\n\u003cp\u003eAs you go through and add some stats, or mess with the code shown here, at some point you're going to want to see how the data is shown on Graphite. Navigate to \u003ca href\u003d\"http://chromeos-stats/\" rel\u003d\"nofollow\"\u003echromeos-stats\u003c/a\u003e. Drill down into \u003ccode\u003estats-\u0026gt;[stat type]-\u0026gt;[your hostname]-\u0026gt;[stat name]\u003c/code\u003e. Main thing to note here is that statsd dumps all of the stats under \u003ccode\u003estats/\u003c/code\u003e, so if you go looking at the root level for \u003ccode\u003e[your hostname]-\u0026gt;[stat name]\u003c/code\u003e, you won't find anything. :P\u003c/p\u003e\r\n\u003cp\u003e\u003ccode\u003e[your hostname]\u003c/code\u003e here means \"whatever value you have for \u003ccode\u003e[SERVER] hostname \u003d\u003c/code\u003e in your \u003ccode\u003eshadow_config.ini\u003c/code\u003e\".\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Timers\" /\u003eTimers\u003c/h3\u003e\r\n\u003cp\u003eThe first stat to examine is how to log how long a function takes to run. The easiest target for this is the scheduler tick. Let's define a fake scheduler tick function:\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003edef tick():\r\n time.sleep(10) # Sleeping is a very expensive computation\r\n\u003c/code\u003e\u003c/pre\u003e\r\n\u003cp\u003eAnd now we have a few different ways that we can get the runtime of this function.\u003c/p\u003e\r\n\u003cp\u003eWe can manually create a timer, and call \u003ccode\u003estart()\u003c/code\u003e and \u003ccode\u003estop()\u003c/code\u003e at the beginning and end of the function:\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003edef tick_manual():\r\n timer \u003d stats.Timer('testing.tick_manual')\r\n timer.start()\r\n time.sleep(3)\r\n timer.stop()\r\n\r\ntick_manual()\r\n# You should now see a point at 3000(ms) in stats/timers/\u0026lt;hostname\u0026gt;/testing/tick_manual\r\n\u003c/code\u003e\u003c/pre\u003e\r\n\u003cp\u003eWe can also take advantage of the decorator that is attached to the \u003ccode\u003eTimer\u003c/code\u003e object:\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003etimer \u003d stats.Timer('testing')\r\n@timer.decorate\r\ndef tick_decorator():\r\n time.sleep(5)\r\n\r\ntick_decorator()\r\n# You should now see a point at 5000(ms) in stats/timers/\u0026lt;hostname\u0026gt;/testing/tick_manual\r\n\u003c/code\u003e\u003c/pre\u003e\r\n\u003cp\u003eStatsd timers report their value in milliseconds, so if you report a value by hand using \u003ccode\u003esend()\u003c/code\u003e, you should probably report the time in milliseconds also.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Counters\" /\u003eCounters\u003c/h4\u003e\r\n\u003cp\u003eIf you're looking to keep track of how frequently something occurs, a counter is a good choice. Statsd receives the counter stat, tallies it over time, and flushes the value of events per second to carbon and resets the counter to zero once every ten seconds. With counters, there are no extra statistics that statsd can compute. The normal ones of min, max, std_dev, etc. make no sense in the context of counters.\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003e# We can increment a counter every time we get an rpc request.\r\ndef create_job():\r\n stats.Counter('testing.rpc.create_job').increment(delta\u003d1)\r\n # .increment() defaults to delta\u003d1, so it could have been omitted\r\n\r\nfor _ in range(0, 10):\r\n create_job()\r\n# You should now see 1 at stats/\u0026lt;hostname\u0026gt;/testing/rpc/create_job\r\n# 1 \u003d\u003d 10 events / 10 seconds\r\n\u003c/code\u003e\u003c/pre\u003e\r\n\u003cp\u003eThere also exists a \u003ccode\u003edecrement()\u003c/code\u003e on the counter object, but I'm not really sure when one would use it. If you're trying to keep a running tally, you should instead use a:\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Gauge\" /\u003eGauge\u003c/h4\u003e\r\n\u003cp\u003eIf you're looking to be able to send in a number, or if your stat doesn't really make sense as a timer or counter, then you should probably use a gauge. A gauge allows you to just report a number. The benefit of using a gauge over just sending raw data is that statsd will still compute the statistics about the stats you're sending like it normally does.\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003edef running_jobs():\r\n stats.Gauge('scheduler').send('running_jobs', 300)\r\n\r\nrunning_jobs()\r\n# You should now see 300 at stats/gauges/\u0026lt;hostname\u0026gt;/scheduler/running_jobs\r\n\u003c/code\u003e\u003c/pre\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Average\" /\u003eAverage\u003c/h4\u003e\r\n\u003cp\u003eValues submitted by an average are automatically averaged against the values in the same bucket at the end of the flush interval. The only use case I can think of for this is if you're trying to measure something in a gauge that's very flaky, which is messing up all of the statistics that are being calculated. However, I can't even think of an example to use in our codebase, so I'm just mentioning this for completeness.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Raw\" /\u003eRaw\u003c/h4\u003e\r\n\u003cp\u003eIf all else fails, and you don't want any fancy statsd features, you can get statsd to send your data to graphite \"pretty much unchanged\". Note that the prefixing of your hostname still does happen (assuming you didn't turn it off).\u003c/p\u003e\r\n\u003cp\u003eOne could use this to log the fact that something happened. Logging something so that there's an obvious spike when you're overlaying graphs doesn't need any sort of statistics calculated about it.\u003c/p\u003e\r\n\u003cpre\u003e\u003ccode\u003e# statsd automatically adds the current time to the data\r\ndef scheduler_initialized():\r\n stats.Raw('scheduler.init').send('', 100)\r\n\r\nscheduler_initialized()\r\n# 1 will now show up at the current time under stats/\u0026lt;hostname\u0026gt;/scheduler/init\u003c/code\u003e\u003c/pre\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Gathering-stats-from-Whisper-via-the-Command-Line\" /\u003e\r\nGathering stats from Whisper via the Command Line\u003c/h1\u003eStats can be queried directly from the command line using \u003ccode\u003ewhisper-fetch.py\u003c/code\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eFor example:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ewhisper-fetch.py --pretty /opt/graphite/storage/whisper/stats/timers/cautotest/verify_time/lumpy/mean.wsp \u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ewhisper-fetch can also output in JSON and you can specify the range of data you wish to view via the --from and --until command lines. The default is to look at a time slice of 24 hours. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Gathering-data-directly-from-Graphite.\" /\u003eGathering data directly from Graphite.\u003c/h1\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCreate the graph of the information you are interested and copy the URL. With the URL tack on \u0026amp;format\u003djson and you will receive json formatted output with time slice and data.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor example:\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"http://chromeos-stats/render/?width\u003d586\u0026amp;height\u003d308\u0026amp;_salt\u003d1367326398.143\u0026amp;target\u003dstats.timers.cautotest.scheduler.tick.mean\u0026amp;format\u003djson\" rel\u003d\"nofollow\"\u003ehttp://chromeos-stats/render/?width\u003d586\u0026amp;height\u003d308\u0026amp;_salt\u003d1367326398.143\u0026amp;target\u003dstats.timers.cautotest.scheduler.tick.mean\u0026amp;format\u003djson\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Future-Work-Needed-Improvements\" /\u003eFuture Work/Needed Improvements\u003c/h1\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eThere's an ability to set a value in a gauge, and then modify it. This provides a counter that isn't reset to zero at each flushing, and is good for, say, number of RPC connections open at one time.\u003c/li\u003e\r\n\u003cli\u003eThere's the ability to log events within Graphite that we currently have no API to do. This would allow us to log events like \"build for 3773.0.0 just came out\", providing better context to the rest of the stats.\u003c/li\u003e\u003cli\u003eUtilizing Events, like adding a new board into the mix. System crash, etc.\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/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/collecting-stats-for-graphite"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7075099386854145357"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7075099386854145357"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7075099386854145357"}],"author":[{}],"sites$pageName":{"$t":"collecting-stats-for-graphite"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2458070657671231489"},"published":{"$t":"2013-05-15T01:22:46.302Z"},"updated":{"$t":"2013-08-29T20:25:16.962Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-15T01:33:26.723Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Autotest Client Helper Libraries"},"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\"2\"\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\u003cspan style\u003d\"font-family:courier new,monospace;line-height:normal\"\u003eThis is a listing and brief explanation of the various h\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eelper methods available through autotest_lib.client.*\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace;line-height:normal\"\u003e. It is in no way comprehensive, and is only meant as an introduction to the topic\u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e:\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\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\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\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecros\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e|-audio\u003cbr /\u003e|-camera\u003cbr /\u003e|-cellular\u003cbr /\u003e|---pseudomodem\u003cbr /\u003e|-dhcp_test_data\u003cbr /\u003e|-i2c\u003cbr /\u003e|-rf\u003cbr /\u003e|-saft\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eauth_server \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- auth\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003edns_server \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- auth\u003cbr /\u003ehttpd \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- auth\u003cbr /\u003econstants \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- constants\u003cbr /\u003ecrash_test \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- crash programs, get dumps\u003cbr /\u003ecros_logging \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- logging\u003cbr /\u003e cros_ui \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- ui, session manager, login\u003cbr /\u003ecryptohome \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- cryptohome vaults\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003elogin \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- wait_for_(browser, window manager, ownership)\u003cbr /\u003enetwork \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- Modem, IP\u003cbr /\u003epkcs11 \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- chapsd, TPM\u003cbr /\u003epower_*\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- power\u003cbr /\u003estorage \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- storage devices\u003cbr /\u003esys_power \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- wakeup, suspend\u003cbr /\u003e\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\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\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ecommon_lib\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e|-cros\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;margin-left:36pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eautoupdater\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;margin-left:36pt;text-indent:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003edevserver\u003cbr /\u003e|-hosts (Autotest Host base classes)\u003cbr /\u003e|-perf_expectations\u003cbr /\u003e|-test_utils\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eautotemp \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- autotest temp dir creation helpers\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ebase_utils \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- ‘run’ and other system level helpers\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eerror \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003cspan\u003e    \u003cspan\u003e    \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e- different error classes\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003epexpect\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eutils\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont face\u003d\"courier new, monospace\"\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\"courier new, monospace\"\u003ebin\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e|-input\u003cbr /\u003e|-net\u003cbr /\u003e|-self-test\u003cbr /\u003e|---tests\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003ebase_utils \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- linux sysadmin helper: grep, disk, cpu, environ\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003esite_utils\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- systems level helper: ping hosts, board type.\u003cbr /\u003eutils \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- base+site utils\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003etest \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- main test class\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;margin-left:36pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eunit_test \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003e- main unit_test class\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\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/span\u003e\u003c/div\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/8590908504692658353"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-code-labs/autotest-client-tests/autotest-client-helper-libraries"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2458070657671231489"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2458070657671231489"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2458070657671231489"}],"author":[{}],"sites$pageName":{"$t":"autotest-client-helper-libraries"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3901069964121496217"},"published":{"$t":"2013-05-16T11:10:17.886Z"},"updated":{"$t":"2013-08-29T20:12:49.815Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-16T11:37:43.311Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Anatomy of test.test"},"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 document will go through the pieces of test.test that are available to use, describing what each does and when it could be used.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-Attributes\" /\u003eAttributes\u003c/h1\u003e\u003cdiv\u003e       job             backreference to the job this test instance is part of\u003c/div\u003e\u003cdiv\u003e       outputdir       eg. results/\u0026lt;job\u0026gt;/\u0026lt;testname.tag\u0026gt;\u003c/div\u003e\u003cdiv\u003e       resultsdir      eg. results/\u0026lt;job\u0026gt;/\u0026lt;testname.tag\u0026gt;/results\u003c/div\u003e\u003cdiv\u003e       profdir         eg. results/\u0026lt;job\u0026gt;/\u0026lt;testname.tag\u0026gt;/profiling\u003c/div\u003e\u003cdiv\u003e       debugdir        eg. results/\u0026lt;job\u0026gt;/\u0026lt;testname.tag\u0026gt;/debug\u003c/div\u003e\u003cdiv\u003e       bindir          eg. tests/\u0026lt;test\u0026gt;\u003c/div\u003e\u003cdiv\u003e       src             eg. tests/\u0026lt;test\u0026gt;/src\u003c/div\u003e\u003cdiv\u003e       tmpdir          eg. tmp/\u0026lt;tempname\u0026gt;_\u0026lt;testname.tag\u0026gt;\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-initialize-\" /\u003einitialize()\u003c/h1\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEverytime a test runs this function runs. For example, if you have iterations\u003d100 set this will run 100 times. Use this when you need to do something like ensure a package is there. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-setup-\" /\u003esetup()\u003c/h1\u003e\u003cdiv\u003esetup() runs the first time the test is set up. This is often used for compiling source code one should not need to recompile the source for the test for every iteration or install the same \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-run_once-\" /\u003erun_once()\u003c/h1\u003e\u003cdiv\u003eThis is called by job.run_test N times, where N is controlled by the interations parameter to run_test (Defaulting to one). it also gets called an additional time with profilers turn on, if any profilers are enabled.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch1\u003e\u003ca name\u003d\"TOC-postprocess_iteration-\" /\u003epostprocess_iteration()\u003c/h1\u003e\u003cdiv\u003eThis processes any results generated by the test iteration and writes them out into a keyval. It's generally not called for the profiling iteration, as that may have difference performance implications.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ewarmup()\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/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/anatomy-of-test-test"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3901069964121496217"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3901069964121496217"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3901069964121496217"}],"author":[{"name":{"$t":"Scott Zawalski"},"email":{"$t":"scottz@chromium.org"}}],"sites$pageName":{"$t":"anatomy-of-test-test"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7684745789362125784"},"published":{"$t":"2012-08-30T19:59:21.253Z"},"updated":{"$t":"2013-08-29T20:10:20.705Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-30T20:16:31.027Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Test Dependencies in Dynamic Suites"},"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-size:medium;font-weight:normal\"\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\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-DEPENDENCIES-in-autotest-control-files-today\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eDEPENDENCIES in autotest control files today\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-DEPENDENCIES-in-dynamic-suites\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eDEPENDENCIES in dynamic suites\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Scheduling-tests-on-appropriate-hosts\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eScheduling tests on appropriate hosts\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Determining-which-machines-to-reimage-for-a-suite\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eDetermining which machines to reimage for a suite\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-The-naive-algorithm-in-broad-strokes-\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eThe naive algorithm (in broad strokes)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-No-it-s-not-a-set-cover-problem\"\u003e\u003cstrong\u003e2.3.1 \u003c/strong\u003eNo, it’s not a set-cover problem\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-A-dead-stupid-first-pass-read:-what-we-ve-implemented-so-far-\"\u003e\u003cstrong\u003e2.4 \u003c/strong\u003eA dead-stupid first pass (read: what we've implemented so far!)\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/b\u003e\u003c/div\u003e\u003cb style\u003d\"font-weight:normal\"\u003eNot all tests can be run on all machines.  Currently, the dynamic suite infrastructure has no way to deal with this issue.  Our intent is to use the existing autotest control file DEPENDENCIES field to express what a test needs in order to be able to run.  Any label in use in the autotest lab is valid in a test’s DEPENDENCIES list.\u003c/b\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-DEPENDENCIES-in-autotest-control-files-today\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDEPENDENCIES in autotest control files today\u003c/span\u003e\u003c/h1\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrently, it seems that DEPENDENCIES in control files are parsed in only when tests are imported for use via the web front end, and they (may be) honored when tests are scheduled via that method.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDependencies can also be specified when running a test via the create_job() RPC exposed by the AFE. \u003c/span\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-DEPENDENCIES-in-dynamic-suites\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDEPENDENCIES in dynamic suites\u003c/span\u003e\u003c/h1\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere are two, related, issues here.  One is how individual tests will declare the things they need from a host in order to run, and how the dynamic suite infrastructure will schedule these tests on appropriate machines.  The second, more complex issue, is how the dynamic suites code will ensure that -- for a given suite -- it reimages a set of hosts that will enable all tests in the suite to be scheduled.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Scheduling-tests-on-appropriate-hosts\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eScheduling tests on appropriate hosts\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAs the dynamic suite code is already parsing each individual test control file it intends to run, it will not be too hard for it to add the contents of DEPENDENCIES to the metahost spec that it already builds up when scheduling tests with the create_job() RPC.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Determining-which-machines-to-reimage-for-a-suite\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDetermining which machines to reimage for a suite\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere are several parameters that will inform dynamic suites’ decision about which machines to reimage for a suite:\u003c/span\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003ethe board being tested,\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003ethe number of machines the suite asks to use, and\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003ethe collective dependencies of all tests in the suite.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThese criteria introduce some new potential failure modes for suites:\u003c/span\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003ethere is at least one test with unsatisfiable dependencies\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eWe should just fast-fail the suite, because we're not going to be able to complete it.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eall dependencies are satisfiable, but not by the number of machines requested\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eall dependencies can be satisfied by \u0026lt; num machines, but none of the remaining machines satisfy any tests in the suite\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003econsider a bluetooth test suite that wants two machines, but we have only one machine with bluetooth\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere are also some resource efficiency concerns here:\u003c/span\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eMachines with rare labels, or label combos, should be avoided if possible\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eThe only i5 lumpy with a Y3400 modem and swedish keyboard should not be used when an i5 wifi-only lumpy from any region will do\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eOne test in a suite with a rare label should not lead to the suite monopolizing all hosts with that label\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003ea suite that asks for 4 machines and has 15 tests that will run anywhere and one that requires GOBI2K should grab 1 GOBI2K device and 3 wifi-only ones.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ol\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-The-naive-algorithm-in-broad-strokes-\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe naive algorithm (in broad strokes)\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere’s a set of machines in the lab, each of which is described by a set of labels  There’s also a suite (read: set) of tests, each of which is described by a set of labels (read: dependencies).  For a given N, we need to find a set of N machines such that the dependencies of each test in the suite are satisfied by some machine in the set.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe difficulty is that we want to use ‘rare’ machines only if we really need them.  If we weight hosts somehow, this should allow us to build a scoring function that we can use in a simulated annealing or hill-climbing kind of approximation algorithm.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-No-it-s-not-a-set-cover-problem\" /\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\"\u003eNo, it’s not a set-cover problem\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt first blush, this problem felt to me like a set-cover problem.  Merge all the dependencies of all tests in the suite into a single, de-dup’d list, and then find the smallest number of devices whose label sets covered the whole she-bang.  The problem is that this algorithm could provide a solution that leaves some tests unsatisfied.  Consider the following example:\u003c/span\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ctable style\u003d\"border:none;border-collapse:collapse;width:624px\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"*\" /\u003e\u003ccol width\u003d\"*\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eTest Dependencies\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHost Labels\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[RPM, BT, GOBI3K]\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[RPM, BT, GOBI3K]\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[RPM, BT, i5]\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"border:1px solid rgb(0,0,0);padding:7px\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e[RPM, i5]\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis algorithm would merge the test deps into [RPM, BT, GOBI3K, i5], and determine that choosing both hosts would successfully cover.  The problem is that the second test cannot be run in this testbed, as no machine meets all its dependencies.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-A-dead-stupid-first-pass-read:-what-we-ve-implemented-so-far-\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA dead-stupid first pass (read: what we've implemented so far!)\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSince we only have tests with a single dependency these days, we’re going to start by gathering all the deps of all the tests in the suite, de-duping them, and finding \u0026lt;\u003d N machines to satisfy those deps.  We may try to be smart about how we pad out the machines to reach N, if we can.  If we have 10 Gobi3K tests and 2 Gobi2K tests, and N \u003d\u003d 3, then we might try to get 2 Gobi3K devices and 1 Gobi2K, for example.  If we can satisfy all tests with \u0026lt; N devices, and cannot pad to reach N total devices, we’ll WARN, but continue to run the suite.\u003c/span\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/3327849403326279945"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/test-dependencies-in-dynamic-suites"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7684745789362125784"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7684745789362125784"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7684745789362125784"}],"author":[{}],"sites$pageName":{"$t":"test-dependencies-in-dynamic-suites"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1241086401598414282"},"published":{"$t":"2009-11-19T17:03:34.561Z"},"updated":{"$t":"2013-08-28T00:44:41.791Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-28T00:44:40.422Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Source Code Management"},"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-Background\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBackground\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-Design-objectives\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eDesign objectives\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Detailed-design\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eDetailed design\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Version-control-system\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eVersion control system\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Package-database\"\u003e\u003cstrong\u003e5.2 \u003c/strong\u003ePackage database\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Sample-metadata.google-for-busybox\"\u003e\u003cstrong\u003e5.3 \u003c/strong\u003eSample README.chromium for busybox\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Commit-log-metadata\"\u003e\u003cstrong\u003e5.4 \u003c/strong\u003eCommit log metadata\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Code-review\"\u003e\u003cstrong\u003e5.5 \u003c/strong\u003eCode review\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Checkout-management\"\u003e\u003cstrong\u003e5.6 \u003c/strong\u003eCheckout management\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-References-and-links\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eReferences and links\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Git-tutorial\"\u003e\u003cstrong\u003e6.1 \u003c/strong\u003eGit tutorial\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Git-documentation\"\u003e\u003cstrong\u003e6.2 \u003c/strong\u003eGit documentation\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\u003ch2\u003e\u003ca name\u003d\"TOC-Abstract\" /\u003eAbstract\u003c/h2\u003e\r\n\r\n\u003cul\u003e\r\n\u003cli\u003eChromium OS is an open source project with the goal of keeping good relationships and communication with upstream sources. Chromium OS is thus structured to upstream code early and often.\u003c/li\u003e\r\n\u003cli\u003eChromium OS will use Git as its version control system, Rietveld for code reviews and gclient for package checkout management.\u003c/li\u003e\u003c/ul\u003e\r\n\r\nThis document outlines the Chromium OS process for managing the upstream bits that make up the Chromium OS Linux distribution.\r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003e\r\n Background\r\n \u003c/h2\u003e\r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003cdiv\u003e\r\nChromium OS is an open-source project, built for people who spend most of their time on the web. Chromium OS is currently made up of 190 or so open-source packages.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Requirements\" /\u003e\r\n Requirements\u003cbr /\u003e\r\n \u003c/h2\u003e\r\n \r\n \u003cb\u003eSources hosted by us.\u003c/b\u003e\r\nUpstream mirrors can be rearranged: sources can be moved, removed, or modified. We also need the sources locally since we need\r\nthem in order to build.\u003cbr /\u003e\r\n \u003cbr /\u003e\r\n \u003cb\u003eOne format.\u003c/b\u003e\r\nThe upstream sources may be stored in any number of version control\r\nsystems (VCS). Or they may not even be stored in a VCS and instead be\r\navailable as a tarball, .deb, or .rpm. For our hosted sources, we'd\r\nlike to have them stored in one VCS format. This may require import from a VCS into our VCS. Alternatively, we could store sources in their native VCS but this would require our developers to work with multiple VCSs.\u003cbr /\u003e\r\n \u003cb\u003e\u003cbr /\u003e\r\n Avoid patch files.\u003c/b\u003e\r\nPatch files are difficult to maintain and difficult to keep in sync\r\nwith upstream. We plan to keep a copy of the entire upstream source tree\r\nin a VCS.\u003cbr /\u003e\r\n \u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"text-align:left\"\u003e\r\n \u003cb\u003eSimple upstreaming.\u003c/b\u003e We want to upstream early\r\nand often to minimize the set of changes we have to maintain. We\r\nalso want a good partnership with upstream. \u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cb\u003eSimple tracking.\u003c/b\u003e It needs to\r\nbe easy to track what bits we've added to open-source components. It\r\nshould also be easy to track the upstream status of our changes: Has the patch been sent upstream? Has it been accepted, rejected, or accepted in modified form?\u003c/div\u003e\r\n\r\n \r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Design-objectives\" /\u003e\r\n Design objectives\u003cbr /\u003e\r\n \u003c/h2\u003e\r\n \r\n\u003cp\u003e\r\n \u003cb\u003eUpstream package database.\u003c/b\u003e\r\nWe need a database that stores metadata about each package we are\r\nusing: homepage, upstream repository information, upstream bugs\r\ndatabase location, mailing list, license, upstream submission process,\r\nand so on. Examples: \u003ca href\u003d\"https://admin.fedoraproject.org/pkgdb/acls/name/acpid\" title\u003d\"fedora\" rel\u003d\"nofollow\"\u003efedora\u003c/a\u003e, \u003ca href\u003d\"http://packages.debian.org/source/lenny/acpid\" title\u003d\"debian\" rel\u003d\"nofollow\"\u003edebian\u003c/a\u003e, \u003ca href\u003d\"https://launchpad.net/ubuntu/+source/acpid\" title\u003d\"ubuntu\" rel\u003d\"nofollow\"\u003eubuntu\u003c/a\u003e, \u003ca href\u003d\"http://packages.gentoo.org/package/sys-power/acpid\" title\u003d\"gentoo\" rel\u003d\"nofollow\"\u003egentoo\u003c/a\u003e.\r\n \u003c/p\u003e\r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n \r\n\u003cp\u003e\r\n \u003cb\u003eDistributed Version Control System (DVCS).\u003c/b\u003e Without a \u003ca href\u003d\"http://en.wikipedia.org/wiki/Distributed_revision_control\" title\u003d\"DVCS\" rel\u003d\"nofollow\"\u003eDVCS\u003c/a\u003e,\r\ndistributed development (working with upstream) is difficult. With a\r\nDVCS, cloning, merging, and pulling in upstream changes are common\r\noperations. For a traditional VCS, cloning an upstream repository\r\ninvolves initially using rsync to copy the upstream repository\r\n(assuming such access is given) and then special scripts to handle\r\nfuture pulls.\u003cbr /\u003e\r\n \u003c/p\u003e\r\n \r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003cp\u003e\r\n \u003cb\u003eEach package in its own repository.\u003c/b\u003e\r\nPulling multiple upstream trees into one monolithic tree is difficult.\r\nIt would also make it nearly impossible to use a DVCS. We want to make\r\nit easy to work with upstream, easy to track ancestry of our code, and\r\neasy to track what patches we've applied.  This is hard to do with a\r\nmonolithic repository. With a repository per package, a simple\r\ninvocation of the VCS tool's diff will do.\u003cbr /\u003e\r\n \u003c/p\u003e\r\n \r\n \r\n\u003cp\u003e\r\n \u003cb\u003eOne DVCS tool.\u003c/b\u003e\r\nWe could mirror each upstream repository locally in its native VCS but\r\nthen we wouldn't be able to use a DVCS where upstream is not. Also, it\r\nwould force our developers to have to deal with many different VCS\r\ntools. We could write our own wrapper library but that's extra\r\ndevelopment effort we should be able to avoid.  Instead, we should just\r\nmirror in our one DVCS format, sources which are managed upstream with\r\na different DVCS.\u003cbr /\u003e\r\n \u003c/p\u003e\r\n \r\n \r\n\u003cp\u003e\r\n \u003cb\u003eA DVCS with good import/export capability.\u003c/b\u003e\r\nMany of the most popular DVCS tools support import and export to other\r\nbackends. The DVCS will support checkin and checkout of code to and\r\nfrom a different backend. Often the import/export is seamless enough\r\nthat the workflow for dealing with a different backend is not much\r\ndifferent from the normal workflow.\u003cbr /\u003e\r\n \u003c/p\u003e\r\n \r\n \r\n\u003cp\u003e\u003cb\u003eCommit log metadata.\u003c/b\u003e\r\nFor some modules, we will be merging in patches from different sources.\r\nFor such patches, we will annotate the commit log with metadata which\r\ndocuments the original source.\u003cbr style\u003d\"color:rgb(0,0,0)\" /\u003e\r\n \u003c/p\u003e\r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003cp\u003e\r\n \u003c/p\u003e\r\n \r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Detailed-design\" /\u003e\r\n Detailed design\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Version-control-system\" /\u003e\r\n Version control system\r\n \u003c/h3\u003e\r\n\u003cp\u003eOut of all the available DVCS tools,\r\nGit implements our design objectives best. Also, of the projects we use which use a\r\nDVCS, most use Git.\u003c/p\u003e\r\n\u003cp\u003eOur process for managing source repositories will be as follows:\u003cbr /\u003e\r\n \r\n\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003e\r\n We will host a Git repository for all source components which we are modifying.Whenever a new package or dependency is added, a new Git repository will be created.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003e\r\n For upstream Git sources, our repository will be a clone of upstream.\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n For upstream sources not stored in Git, we'll create an additional Git repository.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\r\n The import repository will be named \u003ci\u003e\u0026lt;project\u0026gt;\u003c/i\u003e-import.\r\n \u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\r\n For example, project foo would be: foo-import\r\n \u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\r\n Our Git repository will be \"based\" on the import.\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n We will automatically re-sync the import repository with upstream on a regular basis (for example, daily).\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\r\nFor sources which are not hosted in a VCS upstream, we'll create an\r\nadditional Git repository. Typically this will come from a tarball, deb\r\npackage, or rpm package. \u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\r\n The repository will contain the unpackaged source tree.\u003c/li\u003e\r\n\u003cli\u003e\r\n Any patches held in the package will be applied as subsequent changes in Git.\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n Future upstream releases will be committed to this repository in the same way.\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n The repository will be named: \u003ci\u003e\u0026lt;project\u0026gt;\u003c/i\u003e-import\r\n \u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\r\n For example, project bar would be: bar-import\r\n \u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\r\n Our repository will be \"based\" on the import.\r\n \u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eWe will create a branch off of a recent stable upstream release and make our changes there.\u003c/li\u003e\r\n\u003cli\u003eTo make future syncing easier, and to make it easier to separate out our bits from upstream, we will \u003ca href\u003d\"http://www.gitready.com/intermediate/2009/01/31/intro-to-rebase.html\" title\u003d\"rebase\" rel\u003d\"nofollow\"\u003erebase\u003c/a\u003e.\r\nRebasing is a best-practice for managing upstream sources. For example,\r\nthe Ubuntu kernel is regularly rebased against\r\nupstream. The alternative, merging commits from upstream, results in\r\nlocal changes being interleaved with upstream. Rebasing creates a clean\r\nhistory with local changes appearing after upstream commits. \u003c/li\u003e\r\n\u003c/ol\u003e\r\nThe diagram below shows the flow of code between repositories.\r\nRepositories above the top dashed-line are upstream-hosted, the\r\nrepositories between the dashed-lines are Google-hosted, and the\r\nrepositories below the lower dashed-line are the user's local checkout.\u003cbr /\u003e\r\n \u003cbr /\u003e\r\nWhere upstream is non-Git, we'll create a local Git import tree: \"bar\r\nsvn import\" and \"bash .deb import\" above. The Google repository will be\r\na Git repository based on a particular upstream tag of the upstream Git\r\nrepository (or our Git import if upstream is not using Git).\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/source-code-management/repo-arch.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/1258650215944/chromium-os/chromiumos-design-docs/source-code-management/repo-archpng\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n \r\n\u003cdiv style\u003d\"text-align:left\"\u003e\r\n \u003c/div\u003e\r\n \r\n\u003cdiv style\u003d\"text-align:left\"\u003e\r\n \u003c/div\u003e\r\n \r\n\u003cdiv style\u003d\"text-align:left\"\u003e\r\n \r\n \u003c/div\u003e\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Package-database\" /\u003e\r\n Package database\r\n \u003c/h3\u003e\r\n Initially, we will store a README.chromium file in the root directory of the package which will contain the following fields in shell parseable format:\u003cbr /\u003e\r\n \r\n\u003col\u003e\u003cli\u003e\r\n DESCRIPTION: one-line description of the package\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n HOMEPAGE: URL to upstream page (possibly a freshmeat.net page)\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n UPSTREAM_REPO: URL for upstream repository\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n LOCAL_GIT_REPO: git url for our Git repository\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n UPSTREAM_BUGSDB: URL for upstream bug database\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n LOCAL_BUGSDB: URL for our bug database for this package\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n LICENSE: name of license (we'll need a license database somewhere)\u003cbr /\u003e\r\n \u003c/li\u003e\r\n\u003c/ol\u003e\r\n \r\n \r\n Eventually, we may move to a more sophisticated web-hosted package database like \u003ca href\u003d\"https://launchpad.net/\" title\u003d\"Launchpad\" rel\u003d\"nofollow\"\u003eLaunchpad\u003c/a\u003e.\r\nIn a web-hosted package database, we could also display derived\r\ninformation like: current Chromium OS version, upstream latest version, and so on.\u003cbr /\u003e\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Sample-metadata.google-for-busybox\" /\u003e\r\n Sample README.chromium for busybox\u003cbr /\u003e\r\n \u003c/h3\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eDESCRIPTION\u003d\"Utilities for embeddded systems\"\u003c/span\u003e\u003cbr style\u003d\"font-family:Courier New\" /\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eHOMEPAGE\u003d\"http://www.busybox.net\"\u003c/span\u003e\u003cbr style\u003d\"font-family:Courier New\" /\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eUPSTREAM_REPO\u003d\"git://git.busybox.net/busybox\"\u003c/span\u003e\u003cbr style\u003d\"font-family:Courier New\" /\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eLOCAL_GIT_REPO\u003d\"https://chromium.googlesource.com/external/busybox\"\u003c/span\u003e\u003cbr style\u003d\"font-family:Courier New\" /\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eUPSTREAM_BUGSDB\u003d\"https://bugs.busybox.net/\"\u003c/span\u003e\u003cbr style\u003d\"font-family:Courier New\" /\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eLOCAL_BUGSDB\u003d\"http://tracker.chromium.org/busybox\"\u003c/span\u003e\u003cbr style\u003d\"font-family:Courier New\" /\u003e\r\n \u003cspan style\u003d\"font-family:Courier New\"\u003eLICENSE\u003d\"GPL-2\"\u003c/span\u003e\u003cdiv\u003e\u003cfont face\u003d\"'Courier New'\"\u003eLICENSE_FILE\u003d\"LICENSE\"\u003cbr /\u003e\u003c/font\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"\u0026amp;apos;Courier New\u0026amp;apos;\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Commit-log-metadata\" /\u003eCommit log metadata\r\n \u003c/h3\u003e\r\nWe want to track where our sources are coming from. The mechanism for\r\ndoing this will be to recommend that the following metadata be included\r\nas part of the commit log:\u003cbr /\u003e\r\n \r\n\u003cul\u003e\u003cli\u003e\r\n Source: Where did this change come from? Google? Ubuntu? kernel.org?\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\n Commit ID: Git commit id / SVN log number / patch number in package\r\n \u003c/li\u003e\r\n\u003cli\u003e\r\nTested status: Leaning on people to describe how they tested a checkin\r\nhas proved to be extremely effective \"social engineering\" in other\r\nprojects \u003c/li\u003e\r\n\u003cli\u003e Upstream status: Tracking upstream status is more\r\ndifficult as the status will evolve over time. This data may need to\r\nbe in a separate database, but tying the database into the DVCS will\r\nnot be simple to keep consistent over Git rebases (which change Git\r\ncommit IDs).\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"text-align:left\"\u003e\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Code-review\" /\u003e\r\n Code review\r\n \u003c/h3\u003e\r\n Our current code review tool, \u003ca href\u003d\"http://code.google.com/appengine/articles/rietveld.html\" title\u003d\"Rietveld\"\u003eRietveld\u003c/a\u003e, already supports Git change uploads via \u003ca href\u003d\"http://code.google.com/p/rietveld/source/browse/trunk/static/upload.py\" title\u003d\"update.py\"\u003eupdate.py\u003c/a\u003e. For making it easier to do Git code reviews with Rietveld, we will be using \u003ca href\u003d\"http://groups.google.com/group/codereview-discuss/browse_thread/thread/d9f65d04165e274f/b8740b9beab78e4c\" title\u003d\"git-cl\"\u003egit-cl\u003c/a\u003e, . There is\r\nalso an open-source tool designed specifically for Git code reviews: \u003ca href\u003d\"http://source.android.com/submit-patches/workflow\" title\u003d\"gerrit\"\u003egerrit\u003c/a\u003e. It is a \u003ca href\u003d\"http://code.google.com/p/gerrit/wiki/Background\" title\u003d\"fork of reitveld\"\u003efork of reitveld\u003c/a\u003e.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Checkout-management\" /\u003e\r\n Checkout management\u003cbr /\u003e\r\n \u003c/h3\u003e\r\n We are using \u003ca href\u003d\"http://code.google.com/p/gclient/\" title\u003d\"gclient\"\u003egclient\u003c/a\u003e\r\nfor package checkout management.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-References-and-links\" /\u003e References and links\u003cbr /\u003e\r\n \u003c/h2\u003e\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Git-tutorial\" /\u003e\r\n Git tutorial\u003cbr /\u003e\r\n\u003c/h3\u003e\r\n \u003ca href\u003d\"http://www-cs-students.stanford.edu/%7Eblynn/gitmagic/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://www-cs-students.stanford.edu/~blynn/gitmagic/\u003c/a\u003e\u003cbr /\u003e\r\n \r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Git-documentation\" /\u003e\r\n Git documentation\r\n \u003c/h3\u003e\r\n \u003ca href\u003d\"http://git-scm.com/documentation\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://git-scm.com/documentation\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/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/source-code-management"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1241086401598414282"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1241086401598414282"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1241086401598414282"}],"author":[{}],"sites$pageName":{"$t":"source-code-management"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7049331210487161529"},"published":{"$t":"2013-08-26T17:26:46.944Z"},"updated":{"$t":"2013-08-26T17:46:43.066Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-26T17:46:40.526Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"cscope/emacs: example Linux 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\"\u003e\u003cdiv\u003eThis is a simple recipe for being setting up jump-to-file (for #includes) and jump-to-declaration (for symbol names) in emacs, on gprecise (should work on most posix systems).\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eInstall cscope: \u003c/span\u003e\u003ccode style\u003d\"background-color:transparent;font-size:10pt\"\u003esudo apt-get install -y cscope cscope-el\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003ePlace the attached cscope-update script in the directory containing \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\" style\u003d\"background-color:transparent;font-size:10pt\"\u003e\u003ccode\u003e.gclient\u003c/code\u003e\u003c/font\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003e (parent of \u003c/span\u003e\u003ccode\u003esrc/\u003c/code\u003e\u003cfont size\u003d\"2\"\u003e).\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:10pt\"\u003eRun \u003ccode\u003e./cscope-update\u003c/code\u003e after each \u003ccode\u003egclient sync\u003c/code\u003e\u003c/span\u003e to update the cscope database\u003c/li\u003e\u003cli\u003eLoad the attached \u003ccode\u003ecscope.el\u003c/code\u003e from your \u003ccode\u003e.emacs\u003c/code\u003e; note you'll probably want to edit this with your own client roots in \u003ccode\u003eami-src-root-for-buffer\u003c/code\u003e.\u003c/li\u003e\u003cli\u003eWhile browsing source, hit meta-. (period) to jump to the file \u003ccode\u003e#include\u003c/code\u003ed at point or to the declaration of the symbol at point.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cbr /\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/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/cscope-emacs-example-linux-setup"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7049331210487161529"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7049331210487161529"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7049331210487161529"}],"author":[{"name":{"$t":"Ami Fischman"},"email":{"$t":"fischman@chromium.org"}}],"sites$pageName":{"$t":"cscope-emacs-example-linux-setup"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1237847209525089173"},"published":{"$t":"2013-08-26T17:38:25.645Z"},"updated":{"$t":"2013-08-26T17:38:25.722Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-26T17:38:25.645Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"cscope.el"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1237847209525089173"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7049331210487161529"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/cscope-emacs-example-linux-setup/cscope.el"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1237847209525089173"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1237847209525089173"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1237847209525089173"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1237847209525089173"}],"author":[{"name":{"$t":"Ami Fischman"},"email":{"$t":"fischman@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5054157611947435334"},"published":{"$t":"2013-08-26T17:27:30.751Z"},"updated":{"$t":"2013-08-26T17:27:31.027Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-26T17:27:30.751Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"cscope-update"},"summary":{},"content":{"type":"application/x-shellscript","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5054157611947435334"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7049331210487161529"},{"rel":"alternate","type":"application/x-shellscript","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/cscope-emacs-example-linux-setup/cscope-update"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5054157611947435334"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5054157611947435334"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5054157611947435334"},{"rel":"edit-media","type":"application/x-shellscript","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5054157611947435334"}],"author":[{"name":{"$t":"Ami Fischman"},"email":{"$t":"fischman@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/461412142450806966"},"published":{"$t":"2013-06-20T01:10:19.992Z"},"updated":{"$t":"2013-08-23T17:29:09.034Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-23T17:29:07.116Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"[Deprecated] Instructions for API launch engineers"},"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-API-launch-no-longer-utilizes-launch-engineers.\" /\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;font-weight:normal\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development\"\u003eAPI launch\u003c/a\u003e no longer utilizes launch engineers.\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/instructions-for-api-shepherds"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/461412142450806966"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/461412142450806966"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/461412142450806966"}],"author":[{"name":{"$t":"Jeffrey Yasskin"},"email":{"$t":"jyasskin@chromium.org"}}],"sites$pageName":{"$t":"instructions-for-api-shepherds"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1152044076531353486"},"published":{"$t":"2013-08-12T18:02:40.017Z"},"updated":{"$t":"2013-08-20T18:31:21.479Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-20T18:31:19.436Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Blink ScrollbarThemes"},"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\u003eScrollbarTheme class hierarchy\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    ScrollbarTheme\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    |--- ScrollbarThemeMacCommon\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    |    |--- ScrollbarThemeMacNonOverlayAPI\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    |    \\--- ScrollbarThemeMacOverlayAPI\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    |--- ScrollbarThemeNonMacCommon\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    |    |--- ScrollbarThemeAuraOrGtk\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    |    \\--- ScrollbarThemeWin\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    \\--- ScrollbarThemeOverlay\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eScrollbarThemeOverlay is used by Android and optionally by Aura or GTK+.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFuture work:\u003c/div\u003e\u003cdiv\u003e- Perhaps try to consolidate the various overlay scrollbar classes so Mac and non-Mac can share.\u003c/div\u003e\u003cdiv\u003e- Once Windows switches to Aura, we can remove ScrollbarThemeWin and ScrollbarThemeNonMacCommon.\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/blink-scrollbarthemes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1152044076531353486"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1152044076531353486"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1152044076531353486"}],"author":[{"name":{"$t":"Tony Chang"},"email":{"$t":"tony@chromium.org"}}],"sites$pageName":{"$t":"blink-scrollbarthemes"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2854230225563429661"},"published":{"$t":"2013-08-20T16:16:19.579Z"},"updated":{"$t":"2013-08-20T16:16:19.625Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-20T16:16:19.579Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot from 2013-08-20 09:14:59.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2854230225563429661"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/312343428971785383"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/perf-sheriffs/bisecting-performance-regressions/Screenshot%20from%202013-08-20%2009:14:59.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2854230225563429661"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2854230225563429661"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2854230225563429661"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2854230225563429661"}],"author":[{"name":{"$t":"Simon Hatch"},"email":{"$t":"simonhatch@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1526495016132281575"},"published":{"$t":"2013-06-04T21:03:25.264Z"},"updated":{"$t":"2013-08-20T02:20:01.312Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-20T02:19:59.423Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"GFX test notes"},"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-GPU-Rendering-Benchmarks\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-benchmarks\"\u003eGPU Rendering Benchmarks\u003c/a\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChromium has some \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-benchmarks\"\u003eGPU Rendering Benchmarks\u003c/a\u003e which use the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/telemetry\"\u003eTelemetry\u003c/a\u003e framework.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe \u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003esmoothness\u003c/code\u003e test loads a set of 25 very common web pages, uses Telemetry to scroll them, and then measures some performance metrics.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eTo run the test, you first need to \u003ca href\u003d\"https://code.google.com/p/chromium/wiki/UsingGit\"\u003echeck out the full Chromium source\u003c/a\u003e, and\u003cspan style\u003d\"font-size:10pt\"\u003e a \u003c/span\u003e\u003cb style\u003d\"font-size:10pt\"\u003eChrome OS Test Image.\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecd chromium/src\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003etools/perf/run_measurement --browser\u003dcros-chrome-guest --remote\u003d${remote_ip} smoothness tools/perf/page_sets/top_25.json --allow-live-sites\u003c/code\u003e\u003cbr /\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eFor the Google and Facebook site tests, you can to provide credentials in a ~/.telemetry-credentials file:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003ecp tools/telemetry/examples/credentials_example.json ~/.telemetry-credentials\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003evi \u003c/code\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003e~/.telemetry-credentials\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eAdd Google and Facebook credentials\u003cspan style\u003d\"font-size:10pt\"\u003e, but \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ethe example file format has a bug: \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ethere should be a ',' between the \"google\" and \"facebook\" blocks.\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\"\u003eThe previous example tested using live sites.  There are times where it is preferable to test using pre-cached site data.  Telemetry lets you do that using a \"web page replay\" tool which captures a snapshot of a set of webpages (.wpr).\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eSeveral such snapshots have already been captured, such as the \"top_25\" test set which we are running here.  Since the page contents are copyright of the respective web page owners, however, they are not available as part of the publicly available chromium source tree.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eHowever, if you have access to the Chrome (src-internal) tree, you can check out the repository containing test data and run the test withough \"--allow-live-sites\":\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\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial;font-size:small\" /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial;font-size:small\"\u003e\u003ccode\u003e# Prerequisite: To access the pre-recorded page sets, first set up a chrome src-internal password if not already set.\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(34,34,34);font-family:arial;font-size:small\"\u003e\u003ccode\u003e# See: \u003ca href\u003d\"https://www.googlesource.com/new-password\"\u003ehttps://www.googlesource.com/new-password\u003c/a\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003ecd chromium/src/tools/perf\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cdiv\u003e\u003ccode\u003egit clone https://chrome-internal.googlesource.com/chrome/tools/perf/data\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003ecd chromium/src\u003c/code\u003e\u003c/div\u003e\u003cdiv\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/run_measurement --browser\u003dcros-chrome-guest --remote\u003d${remote_ip} smoothness tools/perf/page_sets/top_25.json\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eThe \u003ccode\u003erun_measurement\u003c/code\u003e, is useful for running arbitrary measurements on different page sets.  However, the performance bots run their benchmarks, using the \u003ccode\u003erun_benchmark\u003c/code\u003e script.  The equivalent benchmark to the above rrun_measurement example is:\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003ecd src/tools/perf\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e./run_benchmark run --browser\u003dcros-chrome-guest --remote\u003d${remote_ip} smoothness_top25\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe scripts \u003ccode\u003erun_benchmark\u003c/code\u003e/\u003ccode\u003erun_measurement\u003cfont color\u003d\"#000000\" face\u003d\"Arial, Verdana, sans-serif\"\u003e both launch the python script \u003c/font\u003e\u003c/code\u003e\u003ccode\u003etest_runner.py\u003c/code\u003e, which in turn starts up a local \u003ccode\u003ewebpagereplay.py\u003c/code\u003e server.\u003c/div\u003e\u003cdiv\u003eBeware that the \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace;font-size:10pt\"\u003ewebpagereplay.py\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e will fail to start if \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e contains the line \"nameserver 127.0.0.1\":\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e \u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003ewebpagereplay.ReplayNotStartedError: Web Page Replay failed to start. Log output:\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003ednsproxy.DnsProxyException: Invalid nameserver: 127.0.0.1 (causes an infinte loop)\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eThis can happen when running on a laptop running Ubuntu 12.04+, since by default Ubuntu 12.04 uses the \u003ccode\u003eresolvconf\u003c/code\u003e which uses a local \u003ccode\u003ednsmasq\u003c/code\u003e server to do actual dns resolution.  Thus, the \u003ccode\u003enameserver\u003c/code\u003e in \u003ccode\u003e/etc/resov.conf\u003c/code\u003e will be 127.0.0.1.  To temporarily work around this, first fetch the real dns nameserver using \u003ccode\u003enm-tool\u003c/code\u003e, and use this value to manually update the \u003ccode\u003enameserver\u003c/code\u003e entry in \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e.  Note that any manual changes to \u003ccode\u003e/etc/resolv.conf\u003c/code\u003e will get overwritten by the system at boot - or whenever \u003ccode\u003eresolvconf\u003c/code\u003e gets run.\u003c/div\u003e\u003cdiv\u003e  \u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Testing-without-Vsync\" /\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTesting without Vsync\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIn \u003c/span\u003e\u003ccode\u003e/sbin/session_manager_setup.sh\u003c/code\u003e, add the following to the chrome parameter list: \u003cspan style\u003d\"font-size:medium\"\u003e\u003ccode\u003e--disable-gpu-vsync\u003c/code\u003e\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\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Experimental-WebGL-autotests\" /\u003eExperimental WebGL autotests\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-WebGLManyPlanetsDeep\" /\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eWebGLManyPlanetsDeep\u003c/span\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./run_remote_tests.sh --board\u003d${board} --remote\u003d${remote_ip} graphics_WebGLManyPlanetsDeep\u003c/code\u003e\u003c/div\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\"\u003eExample results on mali 2013-wk20 w/ kernel/chromeos-3.4:\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLManyPlanetsDeep/graphics_WebGLManyPlanetsDeep   avg_fps                       42.5563759729\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLManyPlanetsDeep/graphics_WebGLManyPlanetsDeep   avg_render_time               0.00651348182884\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eExample results on mali 2012-wk45 w/ kernel/chromeos-3.4:\u003c/span\u003e\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\u003egraphics_WebGLManyPlanetsDeep/graphics_WebGLManyPlanetsDeep   avg_fps                       59.1172358698\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLManyPlanetsDeep/graphics_WebGLManyPlanetsDeep   avg_render_time               0.00622212837838\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-WebGLAquarium\" /\u003eWebGLAquarium\u003c/h3\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e./run_remote_tests.sh --board\u003d${board} --remote\u003d${remote_ip} graphics_WebGLAquarium\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003emali-2012_wk45 on 3.4 on daisy @ CPU\u003d1.4 MHz GPU\u003d533MHz\u003c/b\u003e\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\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0001_fishes                         34.7671616056\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0010_fishes                         38.0083871349\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0050_fishes                         36.1185803129\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0100_fishes                         33.5180697395\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0250_fishes                         29.4186162358\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0500_fishes                         21.4609046677\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_1000_fishes                         14.0662410091\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0001_fishes                 0.0115492735466\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0010_fishes                 0.0120682393055\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0050_fishes                 0.0137373693937\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0100_fishes                 0.0159920819915\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0250_fishes                 0.0222824848304\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0500_fishes                 0.0312746594998\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_1000_fishes                 0.0478747122113\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003emali-2013_wk20 on 3.4 on daisy @ CPU\u003d1.4 MHz GPU\u003d533MHz\u003c/b\u003e\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\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0001_fishes                         26.237068422\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0010_fishes                         28.0702920668\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0050_fishes                         27.0979309871\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0100_fishes                         26.2101456206\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0250_fishes                         23.3153728582\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_0500_fishes                         21.0018305341\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_fps_1000_fishes                         15.375419297\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0001_fishes                 0.0117292154996\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0010_fishes                 0.0115656813221\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0050_fishes                 0.0134754876296\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0100_fishes                 0.0157825582097\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0250_fishes                 0.0217831682377\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_0500_fishes                 0.0322741695138\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003egraphics_WebGLAquarium/graphics_WebGLAquarium   avg_render_time_1000_fishes                 0.0508704025854\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Restoring-OOBE-to-make-Telemetry-happy\" /\u003eRestoring OOBE to make Telemetry happy\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTelemetry gets confused if it cannot figure how to log in to the machine.  This can happen, for instance, if you've logged in as another user and telemetry can't find the OOBE (Out Of Box Experience).  \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTo fix this, try restoring the oobe:\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cdiv style\u003d\"line-height:16px;margin-bottom:6px;word-wrap:break-word;word-break:break-word\"\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cdiv style\u003d\"line-height:16px;margin-bottom:6px;word-wrap:break-word;word-break:break-word\"\u003e\u003cdiv\u003e\u003ccode\u003esudo pkill -9 chrome \u0026amp;\u0026amp; rm -rf /home/chronos/Local\\ State /home/chronos/.oobe_completed \u0026amp;\u0026amp; restart ui\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:center\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif;font-size:11px;color:rgba(0,0,0,0.298039)\" /\u003e\u003c/div\u003e\u003cdiv style\u003d\"overflow:hidden;display:inline-block;padding-top:6px;height:13px\"\u003e\u003cdiv style\u003d\"display:inline-block;margin:0px 3px\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Enable-tracing-in-mali-ddk\" /\u003eEnable tracing in mali-ddk\u003c/h2\u003e\u003cdiv\u003e\u003col start\u003d\"1\" style\u003d\"color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cli style\u003d\"line-height:17px\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eAdd --no-sandbox to chrome start in /sbin/sesssion_manager_startup.sh\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"line-height:17px\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eChange –enable-gpu-sandbox  to –disable-gpu-sandbox\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"line-height:17px\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eDisable self.lCCFlags.append('-pedantic') in bldsys/toolchain_abstr.py for trace defines to build.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"line-height:17px\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eChange the #if 0 to #if 1 in cros/cros_tracing.h\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"line-height:17px\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eChange the cros_trace_enabled to 1 in cros/cros_tracing.c\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"line-height:17px\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eEach time you boot the board, run this to enable the Mali tracing:\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003echmod a+wx /sys\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003echmod a+wx /sys/kernel\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003echmod a+wx /sys/kernel/debug\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003echmod a+wx /sys/kernel/debug/tracing/\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003echmod a+wx /sys/kernel/debug/tracing/trace_marker\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003e \u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:12pt;font-family:Times New Roman,serif\"\u003eThen include cros/cros_tracing.h in any files with functions you want to trace and add:\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003eCROS_TRACE_ENABLE();\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:1em 0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif\"\u003e\u003cspan style\u003d\"margin:0px;padding:0px;border:0px;vertical-align:baseline;font-size:10pt;font-family:Courier New\"\u003eCROS_TRACE_BLOCK(\"trace block title\");\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-valgrind-on-the-gpu-process\" /\u003eUsing valgrind on the gpu-process\u003c/h2\u003eChromium OS includes an ebuild for valgrind. \u003cbr /\u003eSo you can just gmerge it to your target:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003egmerge valgrind\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003eThen you just do \u003ccode\u003evalgrind myprog\u003c/code\u003e.\u003c/div\u003e\u003cdiv\u003eF\u003cspan style\u003d\"font-size:10pt\"\u003eor the gpu process, you need to pass a flag to chrome \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eto give it the gpu launcher.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eAdd the following in in \u003ccode\u003esession_manager_setup.sh\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e--gpu-launcher\u003d\"usr/bin/valgrind --trace-children\u003dyes --error-limit\u003dno\"\u003c/code\u003e\u003c/div\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":"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/gfx-test-notes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1526495016132281575"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1526495016132281575"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1526495016132281575"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$pageName":{"$t":"gfx-test-notes"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"XSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3608254532122143885"},"published":{"$t":"2012-05-31T00:44:39.221Z"},"updated":{"$t":"2013-08-08T08:46:30.215Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-08T08:46:28.657Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SystemInfo Extension 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cp style\u003d\"margin:0px;font-family:arial,sans-serif;background-color:rgba(255,255,255,0.92)\"\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eIntel Open Technology Center\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cp style\u003d\"margin:0px;font-family:arial,sans-serif;background-color:rgba(255,255,255,0.92)\"\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"mailto:hongbo.min@intel.com,\" target\u003d\"_blank\"\u003ehongbo.min@intel.com,\u003c/a\u003e \u003ca href\u003d\"mailto:ningxin.hu@intel.com\" target\u003d\"_blank\"\u003eningxin.hu@intel.com\u003c/a\u003e, \u003ca href\u003d\"mailto:james.p.ketrenos@intel.com\" target\u003d\"_blank\"\u003ejames.p.ketrenos@intel.com\u003c/a\u003e\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\u003cp style\u003d\"margin:0px;font-family:arial,sans-serif;background-color:rgba(255,255,255,0.92)\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003eThis API is intended to provide extension with a set of interfaces to get hardware devices information, such as CPU and memory status, OS information, disk storage and network state etc.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"margin:0px;font-family:arial,sans-serif;background-color:rgba(255,255,255,0.92)\"\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp style\u003d\"margin:0px;font-family:arial,sans-serif;background-color:rgba(255,255,255,0.92)\"\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial,sans-serif\"\u003eThe followings are some typical usage cases of SystemInfo API but not limited to these:\u003c/span\u003e\u003c/p\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eAn extension or packaged app can query the number of processors to determine the optimal number of WebWork to be created.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eAn extension or packaged app can decide which binary should be downloaded and used according to the CPU architecture, e.g. NaCl module.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eAn extension can check if there is enough storage space to a huge file before downloading it from Internet.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eAn extension or packaged app can popup a media gallery app if the new storage attached is a MTP-compatible device.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eA packaged app is allowed to create app window on the external display with display information.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4 style\u003d\"margin:0px;font-family:arial,sans-serif;background-color:rgba(255,255,255,0.92)\"\u003e\u003ca name\u003d\"TOC-SystemInfo-in-W3C\" /\u003eSystemInfo in W3C\u003cspan style\u003d\"font-family:Arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/h4\u003e\u003cp\u003eThe SysApps Working Group is working on defining a set of System-Level API for web application, including \u003ca href\u003d\"http://device-capabilities.sysapps.org/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eDevice Capabilities API\u003c/a\u003e. The purpose is the same as SystemInfo extension API which allows web app to access system information.\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Design-and-Considerations\" /\u003eDesign and Considerations\u003cbr /\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Namespace-and-Permission\" /\u003eNamespace and Permission\u003cbr /\u003e\u003c/h3\u003e\u003cp style\u003d\"margin:0px;background-color:rgba(255,255,255,0.92)\"\u003e\u003cfont face\u003d\"Arial, sans-serif\" size\u003d\"2\"\u003eThe namespace for SystemInfo API is \u003ccode\u003echrome.system\u003c/code\u003e, and currently has the following categories:\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003echrome.system.cpu\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003echrome.system.storage\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003echrome.system.memory\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003echrome.system.display\u003c/span\u003e\u003c/li\u003e\u003cli\u003e…\u003c/li\u003e\u003c/ul\u003e\u003cp style\u003d\"margin:0px;background-color:rgba(255,255,255,0.92)\"\u003e\u003cfont face\u003d\"Arial, sans-serif\" size\u003d\"2\"\u003eObviously, the \u003ccode\u003echrome.system\u003c/code\u003e\r\n namespace can be easily extended in future if a new system level API is\r\n introduced. The corresponding permission is also simple and \r\nstraightforward:\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003esystem.cpu\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003esystem.storage\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003esystem.memory\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003esystem.display\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Implementation-Notes\" /\u003eImplementation Notes\u003c/h3\u003e\u003cp\u003eThe design goals of the new SystemInfo extension API introduction are:\u003c/p\u003e\u003col\u003e\u003cli\u003eNo need to pay the additional overhead if an extension or packaged app won't need to query system information at,  e.g. no extra memory footprint at runtime.\u003c/li\u003e\u003cli\u003eEfficiently handle too-frequent querying operation. Although it seems a corner case since few app will query the same information repeatly, we take it into consideration to avoid such an exception and make Chrome much robust.\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003eA base class \u003ccode\u003eSystemInfoProvider \u003c/code\u003eis abstracted away for every system information retrieval. It will:\u003cbr /\u003e\u003col\u003e\u003cli\u003eMaintain a callback queue for the incoming query request;\u003c/li\u003e\u003cli\u003ePost the query operation to non-UI thread. The logic of how to query the requested information is implemented in each derived class of \u003ccode\u003eSystemInfoProvider\u003c/code\u003e;\u003c/li\u003e\u003cli\u003eForward the query result to each callback in the queue once the query is completed\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003eIn order to satisfy the minimal overhead required by design goal, each app using the API won't pay for what it don't use, the lifetime of each concrete \u003ccode\u003eSystemInfoProvider \u003c/code\u003eimplementation is\u003cbr /\u003e\u003col\u003e\u003cli\u003eCreated on demand. This mean the instance should be only created when it is needed\u003c/li\u003e\u003cli\u003eSingleton instance. All apps using this API can share one InfoProvider.\u003c/li\u003e\u003c/ol\u003e\u003cp\u003eCurrently, we have \u003ccode\u003eCpuInfoProvider \u003c/code\u003efor \u003ccode\u003esystem.cpu\u003c/code\u003e API set implementation, \u003ccode\u003eStorageInfoProvider \u003c/code\u003efor \u003ccode\u003esystem.display\u003c/code\u003e, \u003ccode\u003eDisplayInfoProvider \u003c/code\u003efor \u003ccode\u003esystem.display\u003c/code\u003e, and \u003ccode\u003eMemoryInfoProvider \u003c/code\u003efor \u003ccode\u003esystem.memory\u003c/code\u003e.\u003cbr /\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Extension-API-IDL\" /\u003eExtension API IDL\u003cbr /\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-CPU-Info-API\" /\u003eCPU Info API\u003c/h3\u003e\u003cp\u003e\u003ccode\u003e  dictionary CpuInfo {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The number of logical processors.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long numOfProcessors;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The architecture name of the processors.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString archName;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The model name of the processors.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString modelName;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  callback CpuInfoCallback \u003d void (CpuInfo info);\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  interface Functions {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Queries basic CPU information of the system.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void getInfo(CpuInfoCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Storage-Info-API:\" /\u003eStorage Info API:\u003c/h3\u003e  \u003ccode\u003eenum StorageUnitType {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The storage has fixed media, e.g. hard disk or SSD.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    fixed,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The storage is removable, e.g. USB flash drive.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    removable,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The storage type is unknown.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    unknown\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  dictionary StorageUnitInfo {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The unique storage id. It will use the transient ID.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString id;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The name of the storage unit.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString name;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The media type of the storage unit.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    StorageUnitType type;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The total amount of the storage space, in bytes.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Default value is 0 if query operation fails.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    double capacity;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  enum EjectDeviceResultCode {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The ejection command is successful -- the application can prompt the user\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // to remove the device.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    success,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The device is in use by another application. The ejection did not\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // succeed; the user should not remove the device until the other\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // application is done with the device.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    in_use,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // There is no such device known.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    no_such_device,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The ejection command failed.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    failure\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  callback StorageInfoCallback \u003d void (StorageUnitInfo[] info);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  callback EjectDeviceCallback \u003d void (EjectDeviceResultCode result);\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ccode\u003e  callback \u003c/code\u003e\u003ccode\u003eGetAvailableCapabilityCallback \u003d void (double availableCapability);\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003ccode\u003e  interface Functions {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Get the storage information from the system. The argument passed to the\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // callback is an array of StorageUnitInfo objects.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void getInfo(StorageInfoCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // Ejects a removable storage device.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Note: We plan to move this function into a namespace that indicates it\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // that modifies the state of the system rather than just gathering\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // information.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void ejectDevice(DOMString id, EjectDeviceCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  interface Events {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Fired when a new removable storage is attached to the system.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void onAttached(StorageUnitInfo info);\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // Fired when a removable storage is detached from the system.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void onDetached(DOMString id);\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ccode\u003e    // Get the available capability, in bytes\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void  getAvailableCapacity(DOMString id, GetAvailableCapabilityCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Memory-Info-API\" /\u003eMemory Info API\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ccode\u003e  dictionary MemoryInfo {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The total amount of physical memory capacity, in bytes.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    double capacity;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The amount of available capacity, in bytes.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    double availableCapacity;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  callback MemoryInfoCallback \u003d void (MemoryInfo info);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  interface Functions {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Get physical memory information.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void getInfo(MemoryInfoCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Display-Info-API\" /\u003eDisplay Info API\u003c/h3\u003e\u003c/div\u003e\u003ccode\u003e  dictionary Bounds {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The x-coordinate of the upper-left corner.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long left;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The y-coordinate of the upper-left corner.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long top;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The width of the display in pixels.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long width;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The height of the display in pixels.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long height;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  dictionary Insets {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The x-axis distance from the left bound.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long left;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The y-axis distance from the top bound.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long top;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The x-axis distance from the right bound.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long right;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The y-axis distance from the bottom bound.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long bottom;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  dictionary DisplayUnitInfo {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The unique identifier of the display.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString id;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The user-friendly name (e.g. \"HP LCD monitor\").\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString name;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Identifier of the display that is being mirrored on the display unit.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // If mirroring is not in progress, set to an empty string.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Currently exposed only on ChromeOS. Will be empty string on other\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // platforms.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString mirroringSourceId;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // True if this is the primary display.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    boolean isPrimary;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // True if this is an internal display.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    boolean isInternal;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // True if this display is enabled.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    boolean isEnabled;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The number of pixels per inch along the x-axis.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    double dpiX;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The number of pixels per inch along the y-axis.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    double dpiY;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The display's clockwise rotation in degrees relative to the vertical\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // position.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Currently exposed only on ChromeOS. Will be set to 0 on other platforms.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long rotation;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The display's logical bounds.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    Bounds bounds;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The display's insets within its screen's bounds.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Currently exposed only on ChromeOS. Will be set to empty insets on\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // other platforms.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    Insets overscan;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The usable work area of the display within the display bounds. The work\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // area excludes areas of the display reserved for OS, for example taskbar\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // and launcher.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    Bounds workArea;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  dictionary DisplayProperties {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // If set and not empty, starts mirroring between this and the display with\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // the provided id (the system will determine which of the displays is\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // actually mirrored).\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // If set and not empty, stops mirroring between this and the display with\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // the specified id (if mirroring is in progress).\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // If set, no other parameter may be set.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    DOMString? mirroringSourceId;\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // If set to true, makes the display primary. No-op if set to false.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    boolean? isPrimary;\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // If set, sets the display's overscan insets to the provided values. Note\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // that overscan values may not be negative or larger than a half of the\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // screen's size. Overscan cannot be changed on the internal monitor.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // It's applied after \u0026lt;code\u0026gt;isPrimary\u0026lt;/code\u0026gt; parameter.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    Insets? overscan;\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // If set, updates the display's rotation.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Legal values are [0, 90, 180, 270]. The rotation is set clockwise,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // relative to the display's vertical position.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // It's applied after \u0026lt;code\u0026gt;overscan\u0026lt;/code\u0026gt; paramter.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long? rotation;\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // If set, updates the display's logical bounds origin along x-axis. Applied\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // together with \u0026lt;code\u0026gt;boundsOriginY\u0026lt;/code\u0026gt;, if \u0026lt;code\u0026gt;boundsOriginY\u0026lt;/code\u0026gt;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // is set. Note that, when updating the display origin, some constraints\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // will be applied, so the final bounds origin may be different than the one\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // set. The final bounds can be retrieved using $ref:getInfo.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The bounds origin is applied after \u0026lt;code\u0026gt;rotation\u0026lt;/code\u0026gt;.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // The bounds origin cannot be changed on the primary display. Note that is\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // also invalid to set bounds origin values if \u0026lt;code\u0026gt;isPrimary\u0026lt;/code\u0026gt; is\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // also set (as \u0026lt;code\u0026gt;isPrimary\u0026lt;/code\u0026gt; parameter is applied first).\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long? boundsOriginX;\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // If set, updates the display's logical bounds origin along y-axis.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // See documentation for \u0026lt;code\u0026gt;boundsOriginX\u0026lt;/code\u0026gt; parameter.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    long? boundsOriginY;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  callback DisplayInfoCallback \u003d void (DisplayUnitInfo[] displayInfo);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  callback SetDisplayUnitInfoCallback \u003d void();\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  interface Functions {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Get the information of all attached display devices.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void getInfo(DisplayInfoCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e    // Updates the properties for the display specified by |id|, according to\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // the information provided in |info|. On failure, $ref:runtime.lastError\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // will be set.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // |id|: The display's unique identifier.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // |info|: The information about display properties that should be changed.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    //     A property will be changed only if a new value for it is specified in\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    //     |info|.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // |callback|: Empty function called when the function finishes. To find out\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    //     whether the function succeeded, $ref:runtime.lastError should be\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    //     queried.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void setDisplayProperties(\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e        DOMString id,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e        DisplayProperties info,\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e        optional SetDisplayUnitInfoCallback callback);\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e  interface Events {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    // Fired when anything changes to the display configuration.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    static void onDisplayChanged();\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  };\u003c/code\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/systeminfo"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3608254532122143885"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/5"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3608254532122143885"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3608254532122143885"}],"author":[{}],"sites$pageName":{"$t":"systeminfo"},"sites$revision":{"$t":"24"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3802131794343929931"},"published":{"$t":"2013-08-01T21:16:46.376Z"},"updated":{"$t":"2013-08-01T21:16:46.383Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-08-01T21:16:46.376Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"graphics.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3802131794343929931"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9026127630943746559"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chromium-graphics/graphics.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3802131794343929931"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3802131794343929931"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3802131794343929931"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3802131794343929931"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7188591051749519867"},"published":{"$t":"2011-11-08T00:22:53.980Z"},"updated":{"$t":"2013-07-31T17:27:09.852Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-31T17:27:07.732Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Blink Accessibility"},"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\u003eIf you're working on Blink code, here are some things to know about accessibility.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn Blink, accessibility is off by default. When an operating system's native accessibility services access web content, Blink is switched into accessibility mode, which creates a cache of a tree of AccessibilityObjects. For the most part, the tree of AccessibilityObjects mirrors the render tree, but there are some exceptions.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote: this document needs to be updated to reflect the changes after the WebKit -\u0026gt; Blink fork.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ecore/accessibility/ contains a generic implementation of accessibility, and then the mac/, win/, etc. directories contain platform-specific subclasses or wrappers for this - classes that implement the platform accessibility API for each node in the accessible tree. However, Chromium doesn't use any of these platform-specific ports - instead Chromium uses a thin wrapper, defined in WebKit/chromium/public/WebAccessibilityObject.h, that shuttles the information to the browser process. The accessibility APIs are implemented in Chromium's main browser process.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen adding implementations of new HTML tags, make sure they're handled properly in WebCore/accessibility - is a new subclass needed? Is there a role that covers this element?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen adding new features to the shadow DOM of an existing control, make sure the shadow DOM nodes have proper accessibility annotations, like labels or titles. Make sure anything you add is keyboard-accessible.\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/7789018718369490338"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/accessibility/webkit-accessibility"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7188591051749519867"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7188591051749519867"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7188591051749519867"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"webkit-accessibility"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8763662932890915460"},"published":{"$t":"2010-11-17T02:28:10.758Z"},"updated":{"$t":"2013-07-30T17:22:34.162Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-12-14T00:58:36.819Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Crypto"},"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\u0026lt;\u0026lt; UNDER CONSTRUCTION \u0026gt;\u0026gt;\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThis page covers crypto and related technologies such as SSL and certificates in Chromium. Most of the code is in the \"net\" module, with some crypto classes in the \"base\" module.\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Top-priorities\" /\u003eTop priorities\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003ePort SSLClientSocketNSS to use native crypto APIs for SSL client authentication on \u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d45369\"\u003eMac OS X\u003c/a\u003e and \u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d37560\"\u003eWindows\u003c/a\u003e.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ePending changelists: \u003ca href\u003d\"http://codereview.chromium.org/4670004/\"\u003e4670004\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003eRemaining work:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eRemove support for ssl_PlatformAuthTokenPresent and make it always return PR_TRUE.\u003c/li\u003e\r\n\u003cli\u003eGenerate an NSS patch.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d42073\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eImplement a password callback for NSS on Linux\u003c/a\u003e. This allows us to protect the private keys in the NSS key database with a password, and support smart cards.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ePending changelists: \u003ca href\u003d\"http://codereview.chromium.org/5686002/\"\u003e5686002\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d8470\"\u003eLoad the test root CA certificate temporarily on Windows\u003c/a\u003e. This eliminates the need to install the test root CA certificate on Windows to run the SSL unit tests.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ePending changelists: \u003ca href\u003d\"http://codereview.chromium.org/4646001/\"\u003e4646001\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d5552\"\u003eRegenerate the root CA and test certificates to have a long validity period\u003c/a\u003e.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ePending changelists: \u003ca href\u003d\"http://codereview.chromium.org/5535006/\"\u003e5535006\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d63357\"\u003eCache certificate verification results in memory\u003c/a\u003e.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ePending changelists: \u003ca href\u003d\"http://codereview.chromium.org/5386001/\"\u003e5386001\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eComplete \u0026lt;keygen\u0026gt; implementation.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d37142\"\u003eSupport for intermediate CAs as part of application/x-x509-user-cert\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d65541\"\u003eConfirmation UI for importing certificates\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d65543\"\u003eError UI for import failures\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d7065\"\u003eCache complete certificate chains in the HTTP cache\u003c/a\u003e.\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ePending changelists: \u003ca href\u003d\"http://codereview.chromium.org/4645001/\"\u003e4645001\u003c/a\u003e.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/ol\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Work-plan\" /\u003eWork plan\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u0026lt;\u0026lt; A nice dependency diagram to be added by Ryan Sleevi. \u0026gt;\u0026gt;\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:7176b4f5c5f1fba9\" class\u003d\"disabled\"\u003eSSL client authentication\u003c/a\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d29784\"\u003eImprove the SSL client authentication UI\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d37314\"\u003eRemember client certificate selection persistently\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d44075\"\u003eSupport European national ID cards\u003c/a\u003e.\u003c/li\u003e\r\n\u003cli\u003eImprove test coverage.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eA strategy towards FIPS 140-2 compliance.\u003c/li\u003e\r\n\u003cli\u003eClean up the crypto classes/API in base. The main issue is to standardize on one or two ways to represent a data buffer.\u003c/li\u003e\r\n\u003cli\u003eCombine regular certificate verification and EV certificate verification into one for NSS. Not sure if this is possible.\u003c/li\u003e\u003cli\u003eHave the NSS CERT_PKIXVerifyCert function report all certificate errors using the cert_po_errorLog output parameter.\u003c/li\u003e\r\n\u003c/ol\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/crypto"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8763662932890915460"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8763662932890915460"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8763662932890915460"}],"author":[{}],"sites$pageName":{"$t":"crypto"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"Xil7JmA1\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/380426731291280413"},"published":{"$t":"2009-04-22T07:53:02.631Z"},"updated":{"$t":"2013-07-30T00:44:09.715Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-30T00:44:07.179Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"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 /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Developers-making-extensions-see-Chrome-Extensions-Documentation\" /\u003e\u003cfont size\u003d\"4\"\u003eDevelopers making extensions, see \u003ca href\u003d\"https://developer.chrome.com/extensions/index.html\"\u003eChrome Extensions Documentation\u003c/a\u003e\u003c/font\u003e\u003c/h3\u003e\r\n\u003cdiv\u003ewhich includes reference documentation, samples, tutorials, FAQs, discussion groups and even videos.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cfont size\u003d\"4\"\u003eChromium developers, you probably want to:\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"padding-left:15px\"\u003e\r\n\u003cul\u003e\u003cli style\u003d\"text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works\" style\u003d\"font-size:16px\"\u003eLearn how the extension system was/is designed\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development\" style\u003d\"font-size:16px\"\u003ePropose a new Extension API\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003cdiv\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:gadget;maxDepth:6;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/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/extensions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/380426731291280413"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/380426731291280413"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/380426731291280413"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"extensions"},"sites$revision":{"$t":"97"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3154980797118060826"},"published":{"$t":"2012-09-18T22:46:22.388Z"},"updated":{"$t":"2013-07-29T18:19:17.717Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-29T18:19:14.522Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"chrome network debugging"},"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\"\u003echrome has several debugging tools:\u003cdiv\u003e\u003cul\u003e\u003cli\u003enetlog (chrome://net-internals -\u0026gt; events). see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/netlog\"\u003eNetLog: Chrome’s network logging system\u003c/a\u003e, or \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/net/base/net_log_event_type_list.h\"\u003ethe list of netlog events and their meanings\u003c/a\u003e\u003c/li\u003e\u003cli\u003echrome://net-internals/#chromeos -\u0026gt; controls to enable chromeos network debugging and to package up log files\u003c/li\u003e\u003cli\u003echrome://net-internals/#tests -\u0026gt; test loading a particular URL\u003c/li\u003e\u003cli\u003enetwork debugger app (in development; contact ebeach@)\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/4883777207799046826"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cros-network/chrome-network-debugging"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3154980797118060826"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3154980797118060826"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3154980797118060826"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"chrome-network-debugging"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6142323666888847283"},"published":{"$t":"2009-05-22T21:21:23.094Z"},"updated":{"$t":"2013-07-17T21:51:07.826Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-17T21:51:06.402Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Bug Reporting Guidlines for the Mac \u0026 Linux builds"},"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\u003cspan style\u003d\"text-decoration:underline\"\u003eIMPORTANT:\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:underline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003eIn order for the bug reports we receive to be most effective, we need to be able to go through them in a timely manner. That means keeping the number manageable. The primary enemy of this effort is duplicate bugs which waste everyone's time and clog up the system. Unlike some other public bug systems, we do not consider the number of duplicates as an indicator of priority, demand, or seriousness. As a result, there is little to be gained from filing a duplicate bug besides slowing down our ability to produce a great piece of software.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBefore you file any bug, search the bug tracker to see if your problem is a known issues (\u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dos:mac\u0026amp;sort\u003d-stars\" target\u003d\"_blank\"\u003eMac query\u003c/a\u003e, \u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dos:linux\u0026amp;sort\u003d-stars\" target\u003d\"_blank\"\u003eLinux query\u003c/a\u003e). You can safely assume that huge holes in functionality (such as fullscreen not working) are well known and there's no need to file a bug. If you find the bug is already there, feel free to star it so you can find it later and indicate to us another person is interested in its resolution. If and only if you can't find the bug in the database should you consider filing a new one.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have any questions about whether or not you should file your bug, feel free to visit #chromium on irc.freenode.net and ask the community. We'll be more than willing to help you out.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"text-decoration:underline\"\u003eSteps to take before filing a bug:\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:underline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e1. Try searching for the bug on the \u003c/span\u003e\u003ca href\u003d\"http://crbug.com\" rel\u003d\"nofollow\" style\u003d\"font-size:10pt\" target\u003d\"_blank\"\u003eChromium bug tracker\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e, someone may already have reported it.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e2. Try to formulate a reduction, i.e. the minimal set of steps to reproduce the problem.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"text-decoration:underline\"\u003eExample of a good bug report:\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"text-decoration:underline\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eChrome Version : 2.180.0.0\r\nURLs : http://www.someurl.com\r\nOther browsers tested:\r\n Safari 4: OK\r\n Firefox 3.x: OK\r\n IE 7: OK\r\n IE 8: OK\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e Chromium : FAIL\r\n\r\nWhat steps will reproduce the problem?\r\n1. Launch Chrome\r\n2. Load http://www.someurl.com\r\n3. Click on the picture of the elephant in the top right corner.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e4. All buttons in the Chrome UI turn pink.\r\n\r\nWhat is the expected result?\r\n\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eColor of Chrome UI shouldn't change.\r\n\r\nWhat happens instead?\r\n\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eMy UI Turns Pink.\r\n\r\nPlease provide any additional information below. Attach a screenshot if\r\npossible.\r\n\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:11px;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\"3\"\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003eSystem Configuration: Mac OS X 10.5.6 on a PowerMac with 4 gigs of RAM; I use the Swedish-language UI.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:11px;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\"3\"\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003eConsole Output:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:11px;white-space:pre-wrap\"\u003e\u003cdiv\u003e5/22/09 2:13:02 PM [0x0-0x12c92c8].com.google.Chrome[67080] LEAK: 27 CachedResource \u003c/div\u003e\u003cdiv\u003e5/22/09 2:13:02 PM [0x0-0x12c92c8].com.google.Chrome[67080] LEAK: 287 WebCoreNode \u003c/div\u003e\u003cdiv\u003e5/22/09 2:13:02 PM [0x0-0x12c92c8].com.google.Chrome[67080] Leak 1 JS wrappers. \u003c/div\u003e\u003cdiv\u003e5/22/09 2:13:03 PM [0x0-0x12c92c8].com.google.Chrome[67080] [67080:19971:1315528366186335:ERROR: /Users/Shared/foo/chrome/src/chrome/src/chrome/plugin/plugin_thread.cc(166)] Not implemented reached in bool \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eScreenshot attached.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cspan style\u003d\"text-decoration:underline\"\u003eWalkthrough - What's good about the above bug report:\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small;text-decoration:underline\"\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\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e1. It contains a clear detailed description of the steps needed to reproduce the bug from scratch, including URLs where appropriate. Be as specific as you can. Saying to \"click the link in the page\" when there are fifty links is unhelpful. When filing bugs about non-English sites, don't assume the developer understands the language of the webpage.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e2. Results in other browsers are noted.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e3. It explains what you saw happen and what you where expecting to see.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e4. Console output and system configuration are included, Console output in particular can be extremely helpful diagnosing an issue! (on OS X you can see the console output by opening /Applications/Utilities/Console.app).\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e5. A screenshot is attached showing the bug.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cspan style\u003d\"text-decoration:underline\"\u003eOther Important stuff:\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial;font-size:13px;font-weight:bold;text-decoration:underline\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOn OSX, If you've opted into stats reporting Crash dumps will be saved in \u003ccode\u003e~/Library/Application Support/Chromium/Crash Reports/\u003c/code\u003e please attach the files in this directory when filing reports for crashing bugs they can really help us in tracking down issues.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"text-decoration:underline\"\u003eI can't write code, how can I help?\u003c/span\u003e\u003c/span\u003e:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOne of the best ways people can contribute to an open source project is not by writing code but by helping manage bugs in the bug database. There are many activities that help immensely:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eFinding and marking duplicate bugs that have already been filed.\u003c/li\u003e\u003cli\u003eProviding reduced test-cases (HTML, JavaScript, etc) for web site bugs on complex pages\u003c/li\u003e\u003cli\u003eConfirming or denying that a bug has been fixed.  (Though if a bug has previously been reported and not yet marked fixed, saying \"STILL NOT FIXED\" doesn't add anything except some irritation for the poor people CCed on the bug.  If it had been fixed, the fixer probably would have marked it as such, no?  Don't add useless comments.)\u003c/li\u003e\u003cli\u003eConfirming or denying that a bug is valid or has enough information to be reproducible.\u003c/li\u003e\u003c/ul\u003eYou don't need a PhD in computer science to do any of these, and they make a huge difference to both engineering and QAs ability to effectively triage bugs.\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/3087306851372487833"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidlines-for-the-mac-linux-builds"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6142323666888847283"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6142323666888847283"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6142323666888847283"}],"author":[{"name":{"$t":"Jeremy Moskovich"},"email":{"$t":"jeremy@chromium.org"}}],"sites$pageName":{"$t":"bug-reporting-guidlines-for-the-mac-linux-builds"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5688801059132704406"},"published":{"$t":"2011-11-25T21:38:16.101Z"},"updated":{"$t":"2013-07-05T20:00:53.636Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-25T21:38:16.113Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Dependency Management"},"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\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/dependency-management"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5688801059132704406"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5688801059132704406"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5688801059132704406"}],"author":[{}],"sites$pageName":{"$t":"dependency-management"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/273836425333242993"},"published":{"$t":"2008-11-04T01:06:12.794Z"},"updated":{"$t":"2013-07-05T09:26:16.231Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-05T09:26:16.199Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"waterfall.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/273836425333242993"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1579474470863069457"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/chromium-build-infrastructure/tour-of-the-chromium-buildbot/waterfall.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/273836425333242993"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/273836425333242993"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/273836425333242993"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/273836425333242993"}],"author":[{"name":{"$t":"Pam Greene"},"email":{"$t":"pam@chromium.org"}}],"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1735362785781827953"},"published":{"$t":"2010-06-17T17:21:08.550Z"},"updated":{"$t":"2013-07-03T11:20:25.383Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-03T11:20:23.540Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Windows 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 style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent;font-family:Times New Roman\"\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\"\u003eThis tutorial is meant as an expedited way to get Chromium-based browsers deployed and configured on a Windows network, by deploying an MSI and applying group policy. For further configuration, please reference the other documentation at \u003ca href\u003d\"http://dev.chromium.org/administrators\"\u003ehttp://dev.chromium.org/administrators\u003c/a\u003e.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e1. Download the MSI.\u003c/span\u003e\u003c/b\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;font-family:Times New Roman\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\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\"\u003eDownload the \u003c/span\u003e\u003ca href\u003d\"http://www.google.com/chrome/eula.html?msi\u003dtrue\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eGoogle Chrome MSI\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:small\"\u003e.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e2.  Download the ADM / ADMX template.\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eYou can download the ADM template or ADMX template \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/policy-templates\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e3.  Configure the settings for your network.\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eOpen up the ADM or the ADMX template you downloaded with these steps:\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\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\"font-size:small\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eADM file import:\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cul style\u003d\"font-family:Times New Roman\"\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\"\u003eNavigate to \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\"\u003eStart \u0026gt; Run: gpedit.msc\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\"\u003eNavigate to \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\"\u003eLocal Computer Policy \u0026gt; Computer Configuration \u0026gt; Administrative Templates\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\"\u003eRight-click \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\"\u003eAdministrative Templates\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 select \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\"\u003eAdd/Remove Templates\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\"\u003eAdd the \u003cb\u003echrome\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e.\u003c/span\u003e\u003c/b\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\"\u003eadm\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 template via the dialog.\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\"white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eOnce complete, a Google / Chrome folder will appear under 'Administrative Templates' if it's not there already.\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eADMX file import:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eCopy the \u003cb\u003echrome.admx\u003c/b\u003e file to \u003cb\u003e%SystemRoot%\\PolicyDefinitions\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eCopy one or more of the language directories, for example \u003cb\u003een-US\u003c/b\u003e, to \u003c/span\u003e\u003c/font\u003e\u003cb style\u003d\"font-family:Arial;font-size:small;white-space:pre-wrap\"\u003e%SystemRoot%\\PolicyDefinitions\u003c/b\u003e\u003cspan style\u003d\"font-family:Arial;font-size:small;white-space:pre-wrap\"\u003e as well. You should copy all language folders which already exist under the PolicyDefinitions folder.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eNavigate to \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eStart \u0026gt; Run: gpedit.msc\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eNavigate to \u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eLocal Computer Policy \u0026gt; Computer Configuration \u0026gt; Administrative Templates\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eA Google / Chrome folder will appear under 'Administrative Templates' if it's not there already.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\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\"\u003eChange the configuration settings for the target group of users.  The policies you will be most interested in are:\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cul style\u003d\"font-family:Times New Roman\"\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:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eHome page\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 - This is the URL that users see when they first open the browser or click the “home” button.\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:bold;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eSend anonymous usage statistics and crash information.\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 turn off sending any crash information or anonymous statistics to Google, change this setting to be False.\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-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:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003eTurning off auto-updates\u003c/b\u003e - steps to turn off auto-update are \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/administrators/turning-off-auto-updates\"\u003ehere\u003c/a\u003e.\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\"\u003eA full 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/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eYou should then apply the policies to the target users / machines.  Depending on your network’s configuration, this may require time for the policy to propogate, or you may need to propogate those policies manually via administrator tools.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e4.  Push the MSI out to your network.\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eIf you are using SMS or other tools, use these to push out the Google Chrome MSI as you would any other installation bundle.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eOtherwise, you can run the MSI on the target machines directly, and silently, with this command:\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cp style\u003d\"font-family:Times New Roman;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Courier New;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\"\u003eMsiexec /q /I GoogleChrome.msi\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003e5.  Test your installation.\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eOn a target machine, launch Google Chrome.  The settings you applied in step 3 should be noticeable on the test machine.  Congratulations!\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eIf the policies have not propagated to the test machine / user, you may be able to run “gpupdate” to refresh policy settings.\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:small\"\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/7817060016656641064"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/administrators/windows-quick-start"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1735362785781827953"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1735362785781827953"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1735362785781827953"}],"author":[{}],"sites$pageName":{"$t":"windows-quick-start"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2328073105111683080"},"published":{"$t":"2009-07-06T18:06:33.067Z"},"updated":{"$t":"2013-07-02T11:31:10.856Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-23T18:54:31.484Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Creating and Using Profiles"},"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(This page deals with establishing entirely separate data directories for running parallel instances of the Chrome browser. To create separate user accounts within the same Chrome browser instance, please read about the \u003ca href\u003d\"http://www.chromium.org/user-experience/multi-profiles\"\u003emultiple accounts feature\u003c/a\u003e.)\u003c/i\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003eBy creating and using multiple profiles, you can do development — creating extensions, modifying the browser, or testing the browser — while still being able to use Google Chrome as your default browser. We recommend that you use the default profile for your everyday browsing.\u003cbr /\u003e\u003cbr /\u003eThe details of how to create and use a profile vary by platform, but here's the basic process:\u003cbr /\u003e\u003cul\u003e\u003cli\u003eCreate a folder to hold data for the new profile.\u003c/li\u003e\u003cli\u003eCreate a shortcut or alias that launches the browser, using the\u003cb\u003e --user-data-dir\u003c/b\u003e command-line argument to specify the profile's location.\u003c/li\u003e\u003cli\u003eWhenever you launch the browser, use the shortcut or alias that's associated with the profile. If the profile folder is empty, the browser creates initial data for it.\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Instructions:-Windows\" /\u003eInstructions: Windows\u003c/h3\u003e\u003cspan style\u003d\"border-collapse:separate;white-space:pre-wrap\"\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-To-create-a-profile\" /\u003eTo create a profile\u003c/h4\u003e\u003c/span\u003e\u003col\u003e\u003cli style\u003d\"list-style-type:decimal\"\u003eCreate a folder on your computer, say \u003cb\u003eC:\\chrome-dev-profile\u003c/b\u003e. This folder will hold the data for the new profile.\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal\"\u003eMake a copy of the Google Chrome shortcut on your desktop. (Right-click, then Copy.) Name the new shortcut something like \u003cb\u003eChrome\u003c/b\u003e\u003cb\u003e Development\u003c/b\u003e.\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal\"\u003eRight-click the \u003cb\u003eChrome Development \u003c/b\u003eshortcut, choose \u003cb\u003eProperties\u003c/b\u003e, and paste \u003cb\u003e--user-data-dir\u003dC:\\\u003c/b\u003e\u003cb\u003echrome-dev-profile\u003c/b\u003e at the end of the \u003cb\u003eTarget \u003c/b\u003efield. The result might look like this:\u003cbr /\u003e\u003cbr /\u003e\"C:\\Documents and Settings\\me\\Local Settings\\Application Data\\Google\\Chrome\\Application\\chrome.exe\" --user-data-dir\u003dc:\\chrome-dev-profile\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal\"\u003eStart Google Chrome by double-clicking the \u003cb\u003eChrome Development \u003c/b\u003eshortcut. This creates the profile data. \u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-To-use-the-profile\" /\u003eTo use the profile\u003c/h4\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px\"\u003eJust start Google Chrome by double-clicking the \u003cb\u003eChrome Development \u003c/b\u003eshortcut. Yep, it's that easy.\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-To-clear-the-profile\" /\u003eTo clear the profile\u003c/h4\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:13px\"\u003eYou might want to clear the profile if you're testing, and you want to start from scratch. Here's how:\u003cbr /\u003e\u003col\u003e\u003cli style\u003d\"list-style-type:decimal\"\u003eClose Google Chrome.\u003cbr /\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal\"\u003eDelete the contents of your profile folder — the folder you specified with \u003cspan style\u003d\"font-weight:bold\"\u003e--user-data-dir\u003c/span\u003e (for example, \u003cb\u003eC:\\chrome-dev-profile\u003c/b\u003e).\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Instructions:-Mac\" /\u003eInstructions: Mac\u003c/h3\u003eTo be provided. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/user-data-directory\"\u003eUser Data Directory\u003c/a\u003e for the default location.\u003cbr /\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Instructions:-Linux\" /\u003eInstructions: Linux\u003c/h3\u003eTo be provided. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/user-data-directory\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eUser Data Directory\u003c/a\u003e for the default location.\u003cbr /\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-size:15px\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\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/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-and-using-profiles"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2328073105111683080"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2328073105111683080"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2328073105111683080"}],"author":[{}],"sites$pageName":{"$t":"creating-and-using-profiles"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"WCl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"},"published":{"$t":"2010-11-15T19:22:59.693Z"},"updated":{"$t":"2013-07-01T15:22:02.468Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-01T15:21:45.646Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Multiple Chrome Users"},"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\"4\"\u003eOverview\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eThe multiple users feature allows the user to associate a set of preferences with a specific set of browser windows, rather than with an entire running instance of Chrome. Allowing different windows to run as different Chrome identities means that a user can have different open windows associated with different Google accounts, and correspondingly different sets of preferences, apps, bookmarks, and so on -- all those elements which are bound to a specific user's identity. Having multiple users in the Chrome browser also makes it easy to browse with separate identities without having to log in as separate users at the operating system level.\u003cdiv\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\" size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eSync and Multiple Users\u003c/b\u003e\u003c/font\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\"\u003eRight now, Chrome provides a way of associating a Google account with a Chrome profile through the sync mechanism -- if a user \"syncs\" their browser, the user's apps, autofill data, bookmarks, extensions, passwords, preferences, and themes will be associated with the logged-in Google account and stored off-client, where they become available to the user on any browser on which they connect to their synced account. Sync provides the basic mechanism for binding a Google account to the state of a Chrome browser, but provides no special consideration for different users: the model provides that a browser is either synced to an account or not synced, and syncing adds data, instead of modifying it. For example, if a user syncs to account A and then logs out and syncs to account B, the browser will contain bookmarks from both accounts.\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(153,153,153);display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eIn the multiple users model, the idea of syncing will need to adapt to the understanding that several distinct users (or, at least, identities) can be associated with a single browser instance -- and that creating a personal account for the browser need not necessarily establish an off-client repository to save its state. There are two main issues here:\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\"\u003e1. The user will be able to create a local account without enabling sync. This model can be seen as something like starting multiple Chrome instances with separate user-data-dir directories.\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\"\u003e2. The user can have a local account with sync enabled; this state replaces the current binary \"sync / not synced\" model. \u003cspan style\u003d\"font-size:medium\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important;text-align:left\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003cdiv style\u003d\"display:inline!important;text-align:left\"\u003eThe act of syncing binds the synced browser window to an identity; thus the \"sync\" state is naturally part of the multi-user model -- indeed, it's the fully enabled state, where a user has a local account bound to a synced account in the cloud. If a user is running a local account which is not connected with a Google account profile and chooses to sync, they will be connected to their sync account as their Chrome identity. If they choose to create a local account without enabling sync, they will always have the option to enable sync in the options menu.\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\" size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eThe First Account and Adding a New User\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003eUsers can take two actions to bind a browser window with a personalized account: \u003cbr /\u003e\u003col\u003e\u003cli\u003eThey can add a new user. This creates a separate user account, with separate preferences and state.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eThey can connect (or \"sync\") any user account to a synced Google account. This stores some of a user account's preferences and state in the cloud, where it can be synced to accounts on other machines.\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eThe First User Account:\u003c/b\u003e When users runs Chrome without connecting to their Google account, they are using a basic, un-synced browser -- the \"normal\" mode for the vast majority of users now. When the user comes from this state and connects to a Google account, the preferences, bookmarks, history, etc. in this basic account at the time of creation will populate the initial user data directory for the new account. That is, this basic, default account will now be connected to the chosen Google account. If the user chooses to create a new account, a fresh, empty account will be created. If the user chooses to sync this account to an existing Google account, then the user's preferences from the chosen account will populate the new account. In either case, the initial account will remain accessible to the user from the profile menu as the \"first user.\"\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e[\u003ci\u003eSide note\u003c/i\u003e: right now, browser sync works differently from this. If a user syncs to identity A, then stops syncing, and then syncs again with identity B, the browser will end up with all the bookmarks from both A and B. This reflects the basic binary sync model of \"sync/don't sync.\" If instead we have a model of multiple identities, following the sync model would mean that each new profile created would take bookmarks and settings from whichever identity is currently logged in -- leading to bloat, lack of control, and unwanted mixing of \"personalities.\"]\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eSign-in\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe user will be able to add a new Chrome user from from the preferences/options dialog:\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/signin_1.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1320164249955/user-experience/multi-profiles/signin_1.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\" size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\" size\u003d\"3\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eLaunching New Windows\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNew windows will take their identity from the identity of the last active window. Active identities persist across sessions; if a user quits Chrome and then starts it again, the identity of the windows opened will be taken from the last window open when the browser last ran Chrome. Tabs will not be allowed to move across account boundaries; that is, one won't be able to drag a window from the browser belonging to account Alice to a window belonging to account Bob\u003cfont color\u003d\"#999999\"\u003e.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eIncognito Mode\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEvery user account will have its own incognito mode. If an incognito window is launched, it takes its settings and preferences from the browser window which is currently active. We may need a special incognito mode UI to indicate which user the window is associated with; on the other hand, despite the fact that each incognito mode draws settings from a specific account, displaying the name of an account in an incognito browser window may give the wrong impression to users that their activities in this secret space are being associated with their identities.\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eSecurity\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBecause the data for all users which have been used for an instance of Chrome are associated with a single operating system identity, there is no expectation of special privacy. That is, there is no additional encryption of preferences and settings on the local machine other than that which already exists for user data directories in Chrome. Obviously, a password is needed to log in to a specific Chrome identity on the browser. However, no additional protection for the user data directories is planned. On Mac OS X, in fact, because passwords are stored in the commonly accessible keychain, it will be possible for a user in one account to access the passwords that have been stored on that machine by a user with another account.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eBackground Apps and Extensions\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn order to properly handle background apps, which can run even after all browser windows have closed, Chrome will have to load all extensions for all accounts associated with a given Chrome instance when Chrome is launched, and launch background apps even if the particular user associated with them is not currently loaded. Because background apps will be controllable from the operating system, control of these applications can be safely and reasonably given to the user at this level, outside of the browser. That is, if a background app is loaded for Alice and only Bob is logged in, Bob will be able to turn off the settings for this application from the OS, without having to log in as Alice in the Chrome browser.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eBrowser Window Identity UI\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEach browser window needs some visual tag to indicate that it is associated with a particular identity. This is accomplished with a personalizable avatar badge, in the spot usually occupied by the incognito spy. Once multiple users are set up for an instance of Chrome, the \"Users\" field in the personal settings menu is populated with a list of existing user accounts. Any user can add or delete accounts using this interface, and the avatar image and account name can be personalized through the settings page belonging to the account being edited.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/cupcake_2.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1320164750126/user-experience/multi-profiles/cupcake_2.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eUser Launch Menu\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cfont color\u003d\"#999999\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eThe identity tag on the browser frame provides the option to launch a new window connected to an existing user account (any account which has been used in this browser will be listed in a dropdown), as well as the option to create a new user account. In addition, there will be the option of editing the account belonging to this browser (this account will be tagged with a check mark in the dropdown menu). If a user is signed in to a syncing Google account, that account's name will be displayed in the dropdown menu.\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\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/profile_menu3.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1320182607973/user-experience/multi-profiles/profile_menu3.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eDisconnecting\u003c/font\u003e\u003c/b\u003e\u003cbr /\u003e\u003cbr /\u003eDisconnecting from an attached account will not result in any changes to the user's immediate browsing experience; the only change will be that alterations in the profile will not be synchronized with the profile state stored off-client.\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003eFor questions or comments, contact mirandac at google dot com.\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/1708653132560092830"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3372033770379792144"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"}],"author":[{}],"sites$pageName":{"$t":"multi-profiles"},"sites$revision":{"$t":"31"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"},"published":{"$t":"2011-08-02T17:38:49.319Z"},"updated":{"$t":"2013-07-01T11:24:18.988Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-07-01T11:24:17.363Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Rendering Architecture Diagrams"},"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 style\u003d\"color:rgb(68,68,68);line-height:21px\"\u003e\u003cdiv\u003eThe following sequence diagrams illustrate various aspects of Chromium's rendering architecture. \u003cspan style\u003d\"font-size:10pt\"\u003eThe first picture below shows how Javascript and CSS animations are scheduled using the requestAnimationFrame callback mechanism.\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cdiv\u003e\u003cfont color\u003d\"#444444\"\u003e\u003cspan style\u003d\"line-height:21px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(68,68,68);line-height:21px\"\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/rendering-architecture-diagrams/chromium-request-anim-frame.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"300\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1312306992102/developers/design-documents/rendering-architecture-diagrams/chromium-request-anim-frame.png?height\u003d300\u0026amp;width\u003d400\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(68,68,68);line-height:21px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(68,68,68);line-height:21px\"\u003eAfter the Javascript callback is executed or the CSS animations have been updated, the web contents view generally needs to be redrawn. The following (simplified) diagrams show the code execution flow during a repaint in the non-composited software rendering, composited software rendering and (threaded) composited GPU rendering modes. Note that the newer \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/impl-side-painting\"\u003emultithreaded (\"impl-side\") rasterization mode\u003c/a\u003e is not shown below.\u003c/span\u003e\u003cfont color\u003d\"#444444\"\u003e\u003cspan style\u003d\"line-height:21px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont color\u003d\"#444444\"\u003e\u003cspan style\u003d\"line-height:21px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(68,68,68);line-height:21px\"\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:60px\"\u003eNon-composited SW rendering\u003c/td\u003e\u003ctd style\u003d\"text-align:center;width:60px\"\u003e Composited SW rendering\u003c/td\u003e\u003ctd style\u003d\"text-align:center;width:60px\"\u003e Composited GPU rendering\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px\"\u003e \u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-non-composited-sw-rendering.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"165\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1312306838886/developers/design-documents/rendering-architecture-diagrams/chromium-non-composited-sw-rendering.png?height\u003d165\u0026amp;width\u003d200\" width\u003d\"200\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px\"\u003e \u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-composited-sw-rendering.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"400\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1312306873551/developers/design-documents/rendering-architecture-diagrams/chromium-composited-sw-rendering.png?height\u003d400\u0026amp;width\u003d243\" width\u003d\"243\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px\"\u003e \u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-composited-hw-rendering.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"400\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1312306909343/developers/design-documents/rendering-architecture-diagrams/chromium-composited-hw-rendering.png?height\u003d400\u0026amp;width\u003d245\" width\u003d\"245\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1572149545117752769"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"}],"author":[{"name":{"$t":"Sami Kyostila"},"email":{"$t":"skyostil@google.com"}}],"sites$pageName":{"$t":"rendering-architecture-diagrams"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/361818175711938067"},"published":{"$t":"2011-12-20T01:04:37.818Z"},"updated":{"$t":"2013-06-27T17:30:44.649Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T23:45:39.329Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Extension 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\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:6;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":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/903657469582497800"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/extension-system-changes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/361818175711938067"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/361818175711938067"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/361818175711938067"}],"author":[{}],"sites$pageName":{"$t":"extension-system-changes"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3554947047026088727"},"published":{"$t":"2010-12-08T00:21:03.598Z"},"updated":{"$t":"2013-06-27T07:12:25.882Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-27T07:12:23.862Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Host File 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\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-USB-stick-sneakernet-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eUSB stick (sneakernet)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-sshfs\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eUsing sshfs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-NFS\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eUsing NFS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-NFS-Mount\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eNFS Mount\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003eGetting access to files on your host from the target over a network is very useful. This page lists the ways that this is possible.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-USB-stick-sneakernet-\" /\u003eUSB stick (sneakernet)\u003cbr /\u003e\u003c/h2\u003eYou can put files (typically a full Chromium OS image build with \u003ccode\u003ebuild_image\u003c/code\u003e) onto a USB stick, insert it into the target, mount the device and access the files from there.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-sshfs\" /\u003eUsing sshfs\u003c/h2\u003eSince you can use ssh in user space, and we have a 'fuse' module to permit user space filesystems, we can use sshfs to mount directories:\u003cbr /\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e# Make sure fuse is loaded\u003c/code\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003esudo modprobe fuse\u003c/code\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e# Create location to mount build directory\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003emkdir /tmp/chrome\u003c/code\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e# Mount your dev directory\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003esshfs \u003c/code\u003e\u003c/font\u003e\u003ci\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003eusername\u003c/code\u003e\u003c/font\u003e\u003c/i\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e@\u003c/code\u003e\u003c/font\u003e\u003ci\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003emachine\u003c/code\u003e\u003c/font\u003e\u003c/i\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e:\u003c/code\u003e\u003c/font\u003e\u003ci\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e/path/to/chrome\u003c/code\u003e\u003c/font\u003e\u003c/i\u003e\u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e /tmp/chrome\u003cbr /\u003e\u003cbr /\u003e# Take a look\u003cbr /\u003els /tmp/chrome\u003cbr /\u003e\u003c/code\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eYou can hope for about 5MB/s over sshfs on a Cortex-A9 with USB Ethernet.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-NFS\" /\u003eUsing NFS\u003c/h2\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/network-based-development\"\u003ePlease see here\u003c/a\u003e for full details.\u003cbr /\u003e\u003cbr /\u003eNFS requires a lot more setup but has additional features. There are two ways to use NFS from your target:\u003cbr /\u003e\u003cul\u003e\u003cli\u003eNFS root - use an NFS mount as your root file system\u003c/li\u003e\u003cli\u003eNFS mount - boot as normal from a USB stick / SSD / eMMC, but then later mount a directory on your host machine\u003c/li\u003e\u003c/ul\u003eEach option has advantages and disadvantages which will be noted below. Both require a certain amount of setup on both the host and target. In NFS terms the host will be the \u003cb\u003eserver\u003c/b\u003e (containing the files which we want to export) and the target will be the \u003cb\u003eclient\u003c/b\u003e.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTransfer speed with NFS is faster than sshfs since CPU overhead is less, but is limited by the USB interface if you are using a 10/100 USB Ethernet dongle. With a Gigabit USB3 dongle it should operate much faster than ssh.\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-NFS-Mount\" /\u003eNFS Mount\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eIt is also possible to boot from USB or eMMC, but then later mount a filesystem on your host. This requires some user space utilities to enable portmap, etc. Please add documentation here if you do this.\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/1573047155342212031"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/debugging-tips/host-file-access"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3554947047026088727"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3554947047026088727"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3554947047026088727"}],"author":[{"name":{"$t":"Simon Glass"},"email":{"$t":"sjg@chromium.org"}}],"sites$pageName":{"$t":"host-file-access"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6929118346077327882"},"published":{"$t":"2012-06-21T18:37:15.981Z"},"updated":{"$t":"2013-06-24T23:38:46.097Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-24T23:38:44.333Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Salient Bug 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\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eFor reference, some bugs that may be useful to have an easy list for (usually for duping).  Feel free to edit this list as you feel moved.\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\u003e FTP directory listing fails with pt-br locale (Bug reports may consist of a single line description alluding to a FTP error)\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://crbug.com/177428\"\u003e177428\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:15px\"\u003e Auto-execution of JNLP files don't work\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:15px\"\u003e\u003ca href\u003d\"http://crbug.com/92846\"\u003e92846\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:15px\"\u003e Open With\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:15px\"\u003e\u003ca href\u003d\"http://crbug.com/333\"\u003e333\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:15px\"\u003e Downloads Interrupted by Sleep\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:15px\"\u003e\u003ca href\u003d\"http://crbug.com/110497\"\u003e110497\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:15px\"\u003e Can't download PDF as binary/octet-stream\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:15px\"\u003e\u003ca href\u003d\"http://crbug.com/104331\"\u003e104331\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:18px\"\u003e Downloading a URL already downloading but paused hangs\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:18px\"\u003e\u003ca href\u003d\"http://crbug.com/100529\"\u003e100529\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:15px\"\u003e Make MHTML a Save Page As ... format\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:15px\"\u003e\u003ca href\u003d\"http://crbug.com/120416\"\u003e120416\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e Downloads resumption/resume interrupted downloads\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://crbug.com/7648\"\u003e7648\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:15px\"\u003e Make pdf a Save Page As ... format\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:15px\"\u003e\u003ca href\u003d\"http://crbug.com/116749\"\u003e116749\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:16px\"\u003e Make a whole lot of things a Save Page As .. format\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:16px\"\u003e\u003ca href\u003d\"http://crbug.com/113888\"\u003e113888\u003c/a\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:522px;height:21px\"\u003e Mac circumvention of downloads warning dialog incorrect for last incognito window close\u003c/td\u003e\u003ctd style\u003d\"width:48px;height:21px\"\u003e\u003ca href\u003d\"http://crbug.com/88419\"\u003e88419\u003c/a\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e \u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003eDownloads fail with 'Insufficient Permissions' error\u003c/span\u003e\u003c/td\u003e\u003ctd\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d161793\"\u003e161793\u003c/a\u003e\u003c/span\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/5349576635245049343"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/network-bug-triage/downloads-bug-triage/salient-bug-list"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6929118346077327882"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6929118346077327882"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6929118346077327882"}],"author":[{"name":{"$t":"Randy Smith"},"email":{"$t":"rdsmith@chromium.org"}}],"sites$pageName":{"$t":"salient-bug-list"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/28438494237460916"},"published":{"$t":"2011-09-05T02:19:29.578Z"},"updated":{"$t":"2013-06-24T05:12:39.153Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-24T05:12:37.073Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Omnibox/IME Coordination"},"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\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Implementation-Status-Update\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation Status Update\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent;font-family:Arial;white-space:pre-wrap\"\u003eImplemented in M17 on Win\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent;font-family:Arial;white-space:pre-wrap\"\u003eImplemented in M18 on Chrome OS\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:medium;background-color:transparent;font-family:Arial;white-space:pre-wrap\"\u003eImplemented in M29 on Win (Views implementation, IMM32)\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Objective\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eObjective\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWe aim to fix the poor interaction between Chrome’s omnibox and the IME (Input Method Editor). The main problem is that IME windows overlap with the omnibox autocomplete results, as pictured below.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/omnibox-ime-coordination/imeomni.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1317029110924/developers/design-documents/omnibox-ime-coordination/imeomni.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003eThis looks unpolished and may be confusing and frustrating to the user.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Proposed-Solution-and-Plan\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eProposed Solution and Plan\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eOur proposal is to close the omnibox autocomplete popup window whenever the IME candidate window is open.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWe can easily detect the candidate window on Windows and Chrome OS, so we will implement this design on those platforms. It is likely not possible on Mac and Linux.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAfter this design is implemented, we can consider a more sophisticated one. We would most likely experiment on Chrome OS, as we have the most control on that platform. If we implement and enjoy very good reception, we can consider further effort to implement on other platforms.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBackground\u003c/span\u003e\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-Omnibox\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Omnibox\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBased on its current input, the omnibox pops up \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eautocomplete results\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e, suggestions that may come from browsing history, bookmarks, or Instant Suggest. There is also \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einline autocomplete\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e, which is an autocomplete result inserted into the text edit area itself. Inline autocomplete seems to be already disabled during IME composition as it would otherwise interfere with composition (see \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/64983\"\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\"\u003ehttp://crbug.com/64983\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(102,102,102);background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eand \u003c/span\u003e\u003ca href\u003d\"http://crbug.com/75651\"\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\"\u003ehttp://crbug.com/75651\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e).\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-IME\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe IME\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAn IME is used to input text in a more complex manner than the typical direct mapping of keystrokes to characters. For instance, Japanese has too many characters to fit on a keyboard. Using a Japanese IME, the user inputs a reading (“fujisan”) then converts them to the desired characters (“富士山”). The IME presents conversion candidates in a window and in general can present arbitrary UI elements that the application process has little control over.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eText that has been generated through the IME but not yet committed is called \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ecomposition text\u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e (or pre-edit text).\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-Problem\" /\u003e\u003cspan style\u003d\"font-size:12pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Problem\u003c/span\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIn Chrome as of M15, the IME’s UI elements are drawn over the omnibox autocomplete results, resulting in a poor user experience. Specific issues include the following:\u003c/span\u003e\r\n\u003cul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe autocomplete results can’t be seen, but are rendered as if the user is expected to make use of them.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe autocomplete results appear to be interactive but are not. IME handles keystrokes, so up/down arrows navigate through IME windows instead of autocomplete results.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe user cannot easily uncover a partially obscured autocomplete result that looks interesting. The correct method, pressing Enter, commits and dismisses the IME, but in practice this is not very intuitive, and requires the user to delete and retype the query if the suggestion is ultimately rejected. Instead of Enter, the user may try to use the mouse (but clicking immediately activates the result instead of making it visible) or hit Escape (this closes that particular IME window but also alters the composition text, so the results change).\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eNavigating through the IME candidates alters the autocomplete results, since the composition text changes. The user notices these results are updating as if they are useful but cannot use them. This feels unpolished.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIME and Omnibox Instant interaction may also be problematic. Instant is triggered immediately whenever the composition text is updated, which may feel noisy and sluggish to the user.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Requirements-and-Scale\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eRequirements and Scale\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIdeally, we would fix the current poor interaction on all platforms, but our solution is likely implementable only on Windows and Chrome OS.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWe would also prefer the solution to work for all IMEs and all languages. However, universal coverage is not an absolute requirement, and we can keep a solution that works for a large enough group of users and doesn’t introduce new problems to others.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIf we attempt a more sophisticated design, we would probably implement on Chrome OS first, with an eye to implementing on other platforms if it has good reception. Ideally, we wouldn’t have different behavior on each platform. But it may be the case that only Chrome OS can be saved, due to the control we have on that platform.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Alternatives-Considered\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAlternatives Considered\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWe considered several design alternatives. These included the following ideas:\u003c/span\u003e\r\n\u003col\u003e\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ePlace the autocomplete popup below the IME window\r\n\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e - This solves the overlap but can be unsightly as the IME window can be vertically large. Also, two focal points on screen (autocomplete results and IME candidates) is generally bad UX-wise. There are also questions like whether you switch between the two UI elements.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:11pt\"\u003ePlace IME window inside the autocomplete popup\r\n\u003c/span\u003e\u003cfont size\u003d\"2\"\u003e - This is about the same as 1.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eRemove IME panels\r\n \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e- This is invasive and may render some IMEs unusable.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:11pt\"\u003eIntegrate IME suggestions/candidates with autocomplete results\r\n\u003c/span\u003e\u003cfont size\u003d\"2\"\u003e - This is hard implementation-wise. Some IMEs might not expose their suggestions/candidates in a usable way. We'd have to handle the IME UI ourselves.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:11pt\"\u003eRequest IME use compact/horizontal mode\r\n\u003c/span\u003e\u003cfont size\u003d\"2\"\u003e - This is more of a wish as most IMEs don't have such a mode.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:11pt\"\u003eKeep autocomplete results always visible but greyed out during IME composition\r\n\u003c/span\u003e\u003cfont size\u003d\"2\"\u003e - Some people find this ugly. Also, same issues as 1.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:decimal;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-size:11pt\"\u003eUse inline autocomplete during IME composition but not autocomplete popup\r\n\u003c/span\u003e\u003cfont size\u003d\"2\"\u003e - This solves overlap but loses multiple autocomplete results.\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eHowever, these have both serious implementation difficulties and UX concerns. Implementation difficulties arise from the limited control over the IME which varies by platform. Furthermore, altering the IME’s native UX risks confusing and annoying the user.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThus the design and implementation costs are high. If we were to choose one of these solutions, we risk sinking much effort into a solution that might not be usable. Perhaps it would work only for some IMEs or break on future versions of IMEs. Or, it may be implemented and ultimately be poorly received by users.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAnother idea is to always close the autocomplete popup during IME composition. However, this is too aggressive. It would prevent users from making use of autocomplete during the input phase before character conversion (for Japanese, when inputting kana before converting to kanji/kana). It would also make little sense for IMEs which usually do not have a composition window open, such as Korean IMEs.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFor reference, Firefox and IE9 seem to always close their suggestions popup during IME composition, but we haven’t looked into this extensively.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Detailed-Design\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eDetailed Design\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eOn Windows, we can detect the candidate window using composition attributes or WM_IME_NOTIFY/IMN_OPENCANDIDATE and IMN_CLOSECANDIDATE messages. When the candidate window is open, we suppress the autocomplete popup. The autocomplete results should be fetched anyway, to be displayed immediately when the candidate window closes.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThis only detects the candidate window; some IMEs may display windows other than the candidate window, such as Google Japanese Input, which displays a suggestion window. But we are OK with allowing such popups, as they are not the common case, and removing them might be overly aggressive anyway.\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWe can also choose whether to enable or disable Instant Search during conversion.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-UMA-Metrics\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUMA Metrics\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWe believe our design is a better UX, but want some way to confirm this. At least, we must confirm that it is it rare that an autocomplete result is used while candidate window is open. Unfortunately, getting UMA metrics like the number of times an autocomplete result was selected is impossible, as Chrome's UI design is such that an item from the dropdown is always selected. We still need ideas for measuring the impact of our change.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Links\" /\u003e\u003cspan style\u003d\"font-size:18pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eLinks\u003c/span\u003e\u003c/h2\u003e\r\n\u003cul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d2924\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(0,0,153);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium bug 2924\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e - Don't let IME candidate window overwrite the autocomplete popup\u003c/span\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d38450\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(0,0,153);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium bug 38450\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e - Omnibox autocomplete behavior for Korean is less than optimal (related, but this design doc doesn’t affect this bug)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:11pt;font-family:Arial;background-color:transparent;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:11pt;background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d245578\"\u003eChromium bug 245578\u003c/a\u003e - IME candidate window overlaps Omnibox suggest.\u003c/span\u003e\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/omnibox-ime-coordination"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/28438494237460916"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/28438494237460916"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/28438494237460916"}],"author":[{"name":{"$t":"Yuzo Fujishima"},"email":{"$t":"yuzo@chromium.org"}}],"sites$pageName":{"$t":"omnibox-ime-coordination"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5297004078691664440"},"published":{"$t":"2012-11-17T06:44:47.718Z"},"updated":{"$t":"2013-06-22T22:30:03.516Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-22T22:30:03.506Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"arm-chromebook-inside.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5297004078691664440"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6973608406512395470"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook/arm-chromebook-inside.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5297004078691664440"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5297004078691664440"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5297004078691664440"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5297004078691664440"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8140962687200611645"},"published":{"$t":"2013-06-22T22:22:54.352Z"},"updated":{"$t":"2013-06-22T22:22:54.358Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-22T22:22:54.352Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"link-bottom-guts-labeled.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8140962687200611645"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5384573906228610929"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/chromebook-pixel/link-bottom-guts-labeled.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8140962687200611645"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8140962687200611645"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8140962687200611645"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8140962687200611645"}],"author":[{"name":{"$t":"David Hendricks"},"email":{"$t":"dhendrix@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1701569929619042383"},"published":{"$t":"2013-01-16T16:33:16.990Z"},"updated":{"$t":"2013-06-22T21:47:14.459Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-22T21:47:14.448Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-c7-top-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1701569929619042383"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6261796016295893248"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c7-chromebook/acer-c7-top-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1701569929619042383"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1701569929619042383"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1701569929619042383"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1701569929619042383"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"XCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5316491513754864417"},"published":{"$t":"2013-02-21T20:55:12.597Z"},"updated":{"$t":"2013-06-21T21:13:24.820Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-21T21:13:23.247Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Multi-desktop"},"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\"\u003eAura now makes it possible for the same browser process to render to multiple desktops simultaneously (e.g., Native Desktop and Metro Desktop on Windows 8).\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo enable this, the Chromium codebase had to be made multi-desktop aware (i.e., chrome::HostDesktopType parameters were added in several locations).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eSo... a bunch of methods now take chrome::HostDesktopType, but\u003cb\u003e how do you get the right HostDesktopType when you need to provide one?\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eThere are many ways:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you have a Browser: take its host_desktop_type() member.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you have a gfx::NativeView: use chrome::GetHostDesktopTypeForNativeView().\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you have a gfx::NativeWindow: use chrome::GetHostDesktopTypeForNativeWindow().\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you have a WebContents* w: you can use (2) passing in w-\u0026gt;GetNativeView()  OR you might be able to get a Browser with chrome::FindBrowserWithWebContents() and use (1)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf all else fails and you have absolutely NO way of getting desktop context (e.g., a background extension that wants to open a new window...): you can use chrome::GetActiveDesktop() to get the type of the last user-activated Chrome desktop, but be aware that this is inherently racy (i.e., the user can switch desktops at any time) -- \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you are in a test, it is OK to use GetActiveDesktop() since almost all tests run on a single desktop making \u003c/span\u003eGetActiveDesktop() constant.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eYou should almost never hardcode HOST_DESKTOP_TYPE_X constants.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIf you work on Chrome OS and your code is under ash/, please use HOST_DESKTOP_TYPE_ASH (this is the same as HOST_DESKTOP_TYPE_NATIVE on Chrome OS, but not on other platforms).\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003eMost of the methods mentioned above are found in src/chrome/browser/ui/host_desktop.h.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote: If you hardcode HOST_DESKTOP_TYPE_NATIVE it will \u003ci\u003elook\u003c/i\u003e like it's \u003ci\u003eworking\u003c/i\u003e if you're in a single-desktop environment (which most of you are), but what it will really do is: one day someone will trigger your feature from the Ash desktop (e.g., in Windows 8 Metro) and it will open a window/tab on the native desktop (invisible to the user who is immersed in the Ash environment)...\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/multi-desktop"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5316491513754864417"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5316491513754864417"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5316491513754864417"}],"author":[{"name":{"$t":"Gabriel Charette"},"email":{"$t":"gab@chromium.org"}}],"sites$pageName":{"$t":"multi-desktop"},"sites$revision":{"$t":"15"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1988136750431474473"},"published":{"$t":"2013-06-21T09:30:03.443Z"},"updated":{"$t":"2013-06-21T09:30:03.451Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-21T09:30:03.443Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"order-summary.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1988136750431474473"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1025202733608700098"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/using-requestautocomplete/order-summary.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1988136750431474473"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1988136750431474473"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1988136750431474473"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1988136750431474473"}],"author":[{"name":{"$t":"Jake Archibald"},"email":{"$t":"jakearchibald@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6351583067744792761"},"published":{"$t":"2013-01-18T23:36:24.167Z"},"updated":{"$t":"2013-06-21T00:33:56.497Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-21T00:33:56.486Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lumpy-internals.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6351583067744792761"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/lumpy-internals.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6351583067744792761"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6351583067744792761"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6351583067744792761"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6351583067744792761"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2818567293400915861"},"published":{"$t":"2013-06-19T21:48:58.973Z"},"updated":{"$t":"2013-06-19T22:19:08.521Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-19T22:19:07.158Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Pepper API Best Practices"},"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\"\u003eWhen appropriate, suffix enumeration constants with _PRIVATE.\u003c/font\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eTwo enum constants can't have the same name, so making a separate enum for\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003ePrivate constants causes trouble. Suffixing the constants with _PRIVATE makes\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eit clear which values are public and which are private. This also keeps names\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003efrom colliding.\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\"4\"\u003eUse primitive types in C interfaces when possible.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eIt's easier for users to deal with primitive types (int, double, etc.) than\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003ePP_Var. This is worth doing, even when trying to make an interface mirror a\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eJavaScript counterpart. If a string must be valid UTF-8, use PP_Var.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eBe extra careful with C++ interfaces.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-size:small\"\u003eWe don't have any mechanism today to provide multiple versions of a C++\u003c/div\u003e\u003cdiv style\u003d\"font-size:small\"\u003einterface to users. This means we must be even more forward-looking about what\u003c/div\u003e\u003cdiv style\u003d\"font-size:small\"\u003eis in those APIs, as libraries may come to depend on them.\u003c/div\u003e\u003cdiv style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eIn C++ implementations, always call the newest reasonable C interface.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eCode in ppapi/cpp/ should check for the available C versions and always call\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003ethe newest available version that works for the given parameters. This makes it\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003emore feasible to deprecate or remove a version of the C interface at some point\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003ein the future.\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\"4\"\u003eDon't pass structs by value.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eThis can cause API breakage because PNaCl may change calling conventions on\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003edifferent platforms.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eFollow existing reference counting conventions.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eWhen passing PP_Resource or PP_Var as an input parameter to an API, the API\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eshould not expect to be passed a reference. It should explicitly take a\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003ereference if it needs to.\u003c/font\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\"\u003eReturn values and output parameters must pass a reference back to the caller.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eThis includes output parameters for calls that return asynchronously via a \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eCompletionCallback.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eFollow existing PP_CompletionCallback conventions.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eFunctions that take a completion callback should:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- Return int32_t, which must be either a positive value or a value from\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e  ppapi/c/pp_errors.h\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- Take only 1 PP_CompletionCallback parameter.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e- Run the PP_CompletionCallback exactly once.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eUse the Enter* classes and TrackedCallback to ensure the behavior is\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003econsistent.\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\"4\"\u003eProvide all new PPP interfaces as a parameter to a PPB interface.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eLegacy PPP interfaces are exposed via the Plugin's GetInterface call and are\u003c/div\u003e\u003cdiv\u003eassociated with an interface string, much like PPB interfaces. This has two\u003c/div\u003e\u003cdiv\u003edrawbacks:\u003c/div\u003e\u003cdiv\u003e- It's hard to associate a particular version of a PPB interface with its\u003c/div\u003e\u003cdiv\u003ecorresponding PPP interface.\u003c/div\u003e\u003cdiv\u003e- We can only ever call the PPP interface on the main thread.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eDesign your API to be friendly as a porting layer for a more well-known API.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eOur FileIO API should make it easy to implement POSIX file operations.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eSimilarly, our sockets APIs should make it possible to implement BSD/POSIX\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003esockets.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-size:large\"\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/pepper-api-best-practices"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2818567293400915861"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2818567293400915861"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2818567293400915861"}],"author":[{"name":{"$t":"Justin TerAvest"},"email":{"$t":"teravest@chromium.org"}}],"sites$pageName":{"$t":"pepper-api-best-practices"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7533640312110703966"},"published":{"$t":"2011-05-10T20:24:05.701Z"},"updated":{"$t":"2013-06-18T18:42:55.646Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-18T18:42:53.614Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging a cellular modem"},"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-Communicating-directly-with-a-modem-with-the-AT-command-set\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eCommunicating directly with a modem with the AT command set\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-A-notable-exception:-Gobi-Modems\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eA notable exception:  Gobi Modems\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-minicom\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eUsing minicom\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Collecting-Additional-Logging\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eCollecting Additional Logging\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Testing-Download-Speeds\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eTesting Download Speeds\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-Communicating-directly-with-a-modem-with-the-AT-command-set\" /\u003eCommunicating directly with a modem with the AT command set\u003c/h2\u003e\r\n\u003cdiv\u003eMost modems support AT commands which control the modem and query for information.   On a Chromium OS device with the developer mode enabled, you can use the socat command to communicate with the modem.  You need a Chromium OS device with a test image installed (or you can use \u003ccode\u003egmerge socat\u003c/code\u003e if you are familiar with the dev server) .  For example:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eType \u003ccode\u003eCTRL+ALT+T\u003c/code\u003e to enter the crosh shell.\u003c/li\u003e\r\n\u003cli\u003eType \u003ccode\u003eshell\u003c/code\u003e to enter the bash shell.\u003c/li\u003e\r\n\u003cli\u003eFigure you which USB device to use with: \u003ccode\u003els /dev/ttyACM* /dev/ttyUSB*\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eStop modem manager if it is running: \u003ccode\u003esudo stop modemmanager\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eType \u003ccode\u003esudo socat - /dev/ttyACM1,crnl\u003c/code\u003e or \u003ccode\u003esudo socat - /dev/ttyUSB0 \u003c/code\u003eto communicate with the modem.\u003c/li\u003e\u003cli\u003eEnsure that the modem is enabled with the command:  \"\u003ccode\u003eAT+CFUN\u003d1\u003c/code\u003e\"\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003eFor example:\u003c/div\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\u003cfont color\u003d\"#9900ff\"\u003ecrosh\u0026gt;\u003c/font\u003e shell\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003echronos@localhost ~ $ \u003c/font\u003e\u003cfont color\u003d\"#38761d\"\u003esudo stop modemmanager\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003echronos@localhost ~ $\u003c/font\u003e \u003c/code\u003e\u003ccode\u003els /dev/ttyACM* /dev/ttyUSB*\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e/dev/ttyUSB0 /dev/ttyUSB1 /dev/ttyUSB2\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\" style\u003d\"background-color:rgb(238,238,238)\"\u003echronos@localhost ~ $\u003c/font\u003e \u003c/code\u003e\u003ccode\u003esocat - /dev/ttyUSB1\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eATZ\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eOK\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eAT+CFUN\u003d1\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eOK\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003eATI\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eManufacturer: Qualcomm Incorporated\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eModel: ......\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eRevision:....\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eESN: 0x80d...\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e+GCAP: +CIS707A, ....\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003echronos@localhost ~ $\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\nDepending on the modem, you can try different AT commands, e.g. \"\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eAT+CGMI\u003c/span\u003e\", \"\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eAT+CGSN\u003c/span\u003e\", etc. \u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-A-notable-exception:-Gobi-Modems\" /\u003eA notable exception:  Gobi Modems\u003c/h2\u003e\u003cp\u003e\u003cspan style\u003d\"font-size:14px;font-weight:normal\"\u003eWhile modems based on the Qualcomm Gobi chipset support AT commands, Chromium OS uses the Qualcomm connection management API to control these modems.\u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Using-minicom\" /\u003eUsing minicom\u003c/h2\u003e\r\n\u003cdiv\u003eOne can also use minicom to communicate with the modem.  This program is available in test images (or you can use  \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003egmerge socat\u003c/code\u003e if you are familiar with the dev server) .\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eType \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eCTRL-ALT-T\u003c/code\u003e to enter the crosh shell.\u003c/li\u003e\r\n\u003cli\u003eType \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eshell\u003c/code\u003e to enter the bash shell\u003c/li\u003e\r\n\u003cli\u003eFigure you which usb device to use with: \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003els /dev/ttyACM* /dev/ttyUSB*\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eStop modem manager if it is running: \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003esudo stop modem-manager\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eType \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003esudo minicom -s\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIgnore, \"WARNING: configuration file not found\"\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUse the down arrow key and enter to choose the menu \u003cb\u003eSerial port setup\u003c/b\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eType \u003ccode\u003eA\u003c/code\u003e to edit the \u003cb\u003eSerial Device\u003c/b\u003e, changing it to \u003ccode\u003e/dev/ttyACM1\u003c/code\u003e or \u003ccode\u003e/dev/ttyUSB1\u003c/code\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePress enter to return to the top level configuration menu\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUse the arrow keys and enter to select \u003cb\u003eExit\u003c/b\u003e which will exit configuration and let you communicate with the modem.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUse \u003ccode\u003eCTRL-A x\u003c/code\u003e to exit and\u003ccode\u003e CTRL-A z\u003c/code\u003e for help\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Collecting-Additional-Logging\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCollecting Additional Logging\u003c/font\u003e\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eRun the following crosh command to enable debug logging in modem manager at runtime (without restarting modem manager). \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(40,55,105);font-family:Droid Sans,serif;line-height:19px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"line-height:13px\"\u003e\u003cfont color\u003d\"#9900ff\" style\u003d\"font-family:monospace\"\u003ecrosh\u0026gt;\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e modem set-logging debug\u003c/span\u003e\u003c/div\u003e\u003c/span\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/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOn a Chromium OS device with the developer modem enabled, you can restart modem manager with debug logging enabled. \u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(40,55,105);font-family:Droid Sans,serif;line-height:19px\"\u003e\r\n\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\r\n\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003ecrosh\u0026gt;\u003c/font\u003e shell\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003echronos@localhost ~ $ \u003c/font\u003e\u003cfont color\u003d\"#38761d\"\u003esudo restart modemmanager MM_LOGLEVEL\u003dDEBUG\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Testing-Download-Speeds\" /\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eTesting Download Speeds\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv\u003eChromium images include the sftp client, and also wget and curl for downloading.  If you have a test build, it contains iperf too.  You will need to enable developer mode on the platform before you are able to access the shell. \u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eFlip the dev switch to enable developer mode.\u003c/li\u003e\u003cli\u003eReboot the system\u003c/li\u003e\u003cli\u003eWait for system to wipe stateful partition.\u003c/li\u003e\u003cli\u003eWhen booted, press \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eCTRL+ALT+F2\u003c/span\u003e (right arrow) to enter VT2 shell.\u003c/li\u003e\u003cli\u003eUse username chronos or root. No password necessary.\u003c/li\u003e\u003cli\u003eYou can now use \u003ca href\u003d\"http://www.openbsd.org/cgi-bin/man.cgi?query\u003dsftp\u0026amp;sektion\u003d1\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003esftp\u003c/a\u003e, \u003ca href\u003d\"http://curl.haxx.se/docs/manpage.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ecurl\u003c/a\u003e, \u003ca href\u003d\"http://www.gnu.org/software/wget/manual/wget.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ewget\u003c/a\u003e or \u003ca href\u003d\"http://iperf.sourceforge.net/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eiperf\u003c/a\u003e for testing performance.\u003c/li\u003e\u003c/ul\u003e\u003c/div\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/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/debugging-3g"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7533640312110703966"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7533640312110703966"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7533640312110703966"}],"author":[{}],"sites$pageName":{"$t":"debugging-3g"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5328028678726928405"},"published":{"$t":"2013-06-18T15:20:14.374Z"},"updated":{"$t":"2013-06-18T15:20:14.575Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-18T15:20:14.374Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"StabilityofthePNaClbitcodeABI.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5328028678726928405"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1724888447981675935"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/pnacl/stability-of-the-pnacl-bitcode-abi/StabilityofthePNaClbitcodeABI.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5328028678726928405"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5328028678726928405"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5328028678726928405"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5328028678726928405"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4299866200664770999"},"published":{"$t":"2011-03-14T22:39:03.374Z"},"updated":{"$t":"2013-06-18T10:01:43.558Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-18T10:01:41.363Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Mac Plugins"},"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\u003ch2 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eOverview\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThis document provides an overview of the Mac-specific aspects of implementation of Chromium’s plugin hosting. Except where noted, Chromium for Mac uses the same \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/plugin-architecture\"\u003eoverall architecture\u003c/a\u003e as Windows and Linux.\u003c/span\u003e\u003cbr /\u003e\u003ch2 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Platform-API-Handling\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003ePlatform API Handling\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eMuch of the complexity of the Mac plugin host implementation is in the drawing and event handling discussed below. There are a few specific areas common to all of them, relating to certain platform APIs that would not work correctly without special handling. Use of platform APIs in plugin is discouraged due to this, but some are very common and have no supported NPAPI equivalent, so must be supported.\u003c/span\u003e\u003cbr /\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Plugin-Created-Windows\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003ePlugin-Created Windows\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBecause plugins are in their own process, the window layer and activation for windows created by plugins is not correct. To work around this, Chromium uses DYLD_INSERT_LIBRARIES to hook Carbon window creation and activation calls, and swizzling to hook Cocoa window creation and activation calls. Chromium attempts to manage the process activation to match the window activation, so that plugin windows show on top of browser windows.\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Full-Screen-Windows\" /\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\"\u003eFull-Screen Windows\u003c/span\u003e\u003c/h4\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFull-screen windows are detected as a special case of plugin-opened windows, and cause the browser to request or relinquish full screen mode as appropriate, since this must be done from the foreground process.\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Limitations\" /\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\"\u003eLimitations\u003c/span\u003e\u003c/h4\u003e\u003cul style\u003d\"font-family:Times;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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eComplex plugin and browser window layering, in the case where a plugin creates multiple windows, may not be correct. In practice, this doesn’t appear to be a problem.\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eModal windows don’t currently prevent interaction with background windows, only bringing background windows forward.\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThere may be specific calls not caught by the current interposing/swizzling.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Cursors\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eCursors\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAs with full-screen mode, cursors must be managed from the foreground process. As a result, several Cocoa cursor calls are hooked, and the cursor information handed off to another process.\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Limitations1\" /\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\"\u003eLimitations\u003c/span\u003e\u003c/h4\u003e\u003cul style\u003d\"font-family:Times;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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eNot all cursor operations are currently handled.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Drawing-and-Event-Handling\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eDrawing and Event Handling\u003c/span\u003e\u003c/h2\u003e\u003ch2 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-There-are-two-event-models-and-four-drawing-models-on-the-Mac-and-Chromium-supports-all-but-the-oldest-of-each.-The-specific-details-of-each-implementation-are-explained-below.\" /\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\"\u003eThere are two event models and four drawing models on the Mac, and Chromium supports all but the oldest of each. The specific details of each implementation are explained below.\u003c/span\u003e\u003c/h2\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Carbon-Events\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eCarbon Events\u003c/span\u003e\u003c/h3\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003eThis event model is no longer support\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Cocoa-Events\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eCocoa Events\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Cocoa event model doesn’t provide a window reference to the plugin, so the out-of-process implementation is mostly straightforward. However, there are two wrinkles:\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-IME-Support\" /\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\"\u003eIME Support\u003c/span\u003e\u003c/h4\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eCocoa event model IME has extremely specific semantics, which did not mesh cleanly with WebKit’s IME at the time the code was written. As a result, plugin IME is handled explicitly in the browser process, with messages sent back and forth through the renderer process. In the future, it might be possible to move that support into Blink itself.\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-NPN_ConvertPoint\" /\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\"\u003eNPN_ConvertPoint\u003c/span\u003e\u003c/h4\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eNPN_ConvertPoint requires that browsers be able to map plugin coordinates to screen and window coordinates, so the plugin host is forced to track the location of the browser window. This function is poorly spec’d, however, and it’s unclear how it should behave in the presence of CSS transforms, so the implementation may need to move to one where the query is passed into the renderer and/or browser process, and answered there, instead of window location being tracked by the plugin process.\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h4\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-QuickDraw\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eQuickDraw\u003c/span\u003e\u003c/h3\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003eThis drawing model is no longer supported.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-CoreGraphics\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eCoreGraphics\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eCoreGraphics support is straightforward: plugins are provided a graphics port pointing to the shared buffer. Since plugins are only allowed to draw during a draw event in this model, tearing is not an issue.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUnlike Windows, where the page background must be provided to the plugin in order to allow the plugin to composite, CoreGraphics-based drawing preserves transparency data. As a result, transparent plugins on the Mac do not have the same double-buffer and synchronous drawing requirements that they do on Windows.\u003c/span\u003e\u003cbr /\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Core-Animation\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eCore Animation\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eSince the purpose of the Core Animation model is to provide hardware accelerated drawing, the normal plugin drawing system is bypassed (as with windowed plugins on other platforms). Instead, an IOSurface is shared between the plugin and gpu processes, and the plugin’s CALayer is drawn into that surface using CARenderer. On the gpu side, the contents of the IOSurface are composited into the page using a hardware-accelerated drawing mechanism.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBecause the IOSurface approach requires explicit action on the browser side when drawing is necessary, but CARenderer doesn’t provide a way to know when drawing is necessary, drawing is driven by a high-frequency timer on the plugin side. As a result, the invalidating Core Animation model described below was developed as an alternative. Use of the original Core Animation model in Chromium is discouraged.\u003c/span\u003e\u003cbr /\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Limitations2\" /\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\"\u003eLimitations\u003c/span\u003e\u003c/h4\u003e\u003cul style\u003d\"font-family:Times;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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:11pt;white-space:pre-wrap\"\u003eThe timer adds a small amount of CPU overhead.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Invalidating-Core-Animation\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eInvalidating Core Animation\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe invalidating Core Animation model is identical to the Core Animation model, except that the plugin informs the plugin host when drawing is necessary; as a result, the timer is not needed.\u003c/span\u003e\u003ch3 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Future-Plans\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eFuture Plans\u003c/span\u003e\u003c/h3\u003e\u003ch4 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-64-Bit\" /\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\"\u003e64-Bit\u003c/span\u003e\u003c/h4\u003e\u003cspan style\u003d\"font-family:Arial;font-size:11pt;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 number of plugins on the Mac are still 32-bit only; because Safari and Firefox both support 32-bit plugins out of process in 64-bit mode, there has not been strong incentive for plugin vendors to release 64-bit plugins. Because of this, any 64-bit Mac Chromium release will likely need to support 32-bit plugins.\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/mac-plugins"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4299866200664770999"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4299866200664770999"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4299866200664770999"}],"author":[{"name":{"$t":"Stuart Morgan"},"email":{"$t":"stuartmorgan@chromium.org"}}],"sites$pageName":{"$t":"mac-plugins"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7599198732671306770"},"published":{"$t":"2011-04-27T16:42:34.165Z"},"updated":{"$t":"2013-06-18T07:12:31.564Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-18T07:12:30.027Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Research Papers"},"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 style\u003d\"font-family:arial,sans-serif\"\u003e\u003cp style\u003d\"line-height:1.25em;max-width:64em\"\u003eGoogle's Native Client engineering team has published the following papers about Native Client technology:\u003c/p\u003e\u003cul style\u003d\"padding-left:25px;max-width:62em\"\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ca href\u003d\"http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/34913.pdf\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003eNative Client: A Sandbox for Portable, Untrusted x86 Native Code\u003c/a\u003e, Appeared in the 2009 IEEE Symposium on Security and Privacy (\u003ca href\u003d\"http://oakland09.cs.virginia.edu/\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\"\u003ehttp://oakland09.cs.virginia.edu\u003c/a\u003e), May 2009\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ca href\u003d\"http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/35649.pdf\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003eAdapting Software Fault Isolation to Contemporary CPU Architectures\u003c/a\u003e. Appeared in the 19th USENIX Security Symposium (\u003ca href\u003d\"http://www.usenix.org/events/sec10/index.html\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\"\u003ehttp://www.usenix.org/events/sec10/index.html\u003c/a\u003e), August 2010; originally posted February 2010, revised June 2010\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ca href\u003d\"https://docs.google.com/a/chromium.org/viewer?a\u003dv\u0026amp;pid\u003dsites\u0026amp;srcid\u003dY2hyb21pdW0ub3JnfGRldnxneDo3ZmQ2NjI2NjFkM2EzYjFl\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003ePNaCl: Portable Native Client Executables\u003c/a\u003e, white paper, February 2010\u003c/li\u003e\u003cli style\u003d\"margin-bottom:0.3em\"\u003e\u003ca href\u003d\"http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/pubs/archive/37204.pdf\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003eLanguage-Independent Sandboxing of Just-In-Time Compilation and Self-Modifying Code\u003c/a\u003e, Appear in the 2011 Conference on Programming Language Design and Implementation (\u003ca href\u003d\"http://pldi11.cs.utah.edu/\" rel\u003d\"nofollow\" style\u003d\"color:rgb(0,0,204)\"\u003ehttp://pldi11.cs.utah.edu\u003c/a\u003e) June 2011.\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/6566195967208808905"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/reference/research-papers"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7599198732671306770"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7599198732671306770"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7599198732671306770"}],"author":[{}],"sites$pageName":{"$t":"research-papers"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8250419162960444170"},"published":{"$t":"2012-09-19T10:34:21.928Z"},"updated":{"$t":"2013-06-18T06:36:52.717Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-18T06:36:51.334Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Getting started with debug stub"},"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-Introduction\" /\u003eIntroduction\u003c/h3\u003e\u003cdiv\u003eNew versions of chrome include NaCl with debug stub support. If --enable-nacl-debug switch is passed to chrome or -g switch is passed to sel_ldr, all NaCl applications start with the debug stub enabled. The debug stub stops untrusted code at the first instruction inside the IRT and listens on a TCP port of localhost network interface (4014 currently) for incoming connection from nacl-gdb. When nacl-gdb connects to the debug stub, they talk with each other using RSP protocol. Since remote debugging does not need to use OS-specific debugging functions, we need only one version of nacl-gdb for both 32 and 64-bit debugging. Moreover, if one forwards port to a remote machine, it is possible to use nacl-gdb for one OS to debug NaCl application on a different OS. All the differences between OSes are abstracted away by debug stub.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Get-the-debugger\" /\u003eGet the debugger\u003c/h2\u003e\u003cdiv\u003eThe debugger is included in the latest version of NaCl SDK. It is located in nacl_sdk/pepper_canary/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb on Linux, nacl_sdk/pepper_canary/toolchain/win_x86_glibc/bin/x86_64-nacl-gdb.exe on Windows, etc. Debuggers in *_x86_glibc and *_x86_newlib directories are exactly the same. You can use either one on them. Moreover, unlike the rest of SDK, you can copy debugger to a different folder.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRegarding the pepper and chrome versions, the latest debugger should work with the previous versions of chrome/sel_ldr but new functionality may be missing.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Debugging-NaCl-applications-in-Chrome\" /\u003eDebugging NaCl applications in Chrome\u003c/h2\u003e\u003cdiv\u003eNaCl applications can be launched using two ways in Chrome. You can load unpacked extension on \u003ca href\u003d\"javascript:void(0);\"\u003echrome://chrome/extensions/\u003c/a\u003e page (switch on developers mode) and open it. Alternative way is to launch a web server and either launch chrome with --enable-nacl switch or enable NaCl applications outside of Chrome Web Store or \u003ca href\u003d\"javascript:void(0);\"\u003echrome://flags/\u003c/a\u003e page (you need to relaunch chrome after that). In order to switch on debug stub support, you need to pass --enable-nacl-debug and --no-sandbox switches to chrome. Create a shell script that launches chrome with these flags. You can also add --user-data-dir\u003dsome-path to use a separate profile.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Debugging-newlib-applications\" /\u003eDebugging newlib applications\u003c/h3\u003e\u003cdiv\u003eIn order to debug NaCl application, you need to launch Chrome and open NaCl application there first. Then run x86_64-nacl-gdb. Enter following commands there. If you have spaces in paths, use quotes and double all slashes (or use backslashes). For pepper29+ debugger you should use quotes without doubling slashes.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e(gdb) file c:\\nacl_sdk\\pepper_canary\\examples\\hello_world\\newlib\\Debug\\hello_world_x86_64.nexe\u003cbr /\u003e(gdb) target remote :4014\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003ePoint file command to 64-bit nexe on 64-bit platforms and to 32-bit nexe on 32-bit platforms. Then you can use all normal gdb commands.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Debugging-glibc-applications\" /\u003eDebugging glibc applications\u003c/h3\u003e\u003cdiv\u003eDebugging glibc applications is harder. You need to use following commands.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e(gdb) nacl-manifest c:\\nacl_sdk\\pepper_canary\\examples\\hello_world\\glibc\\Debug\\hello_world.nmf\u003cbr /\u003e(gdb) target remote :4014\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eIf you launched NaCl as unpacked chrome extension or from local http server, you already have the NaCl manifest file which you should use here. If you launched NaCl from an external http server, you need to download *.nmf, *.nexe and *.so files of the NaCl application and place them in the same directory structure that is used on the server (*.nmf file uses relative paths to reference main executable and libraries). Then point nacl-manifest command to the downloaded *.nmf file.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Debugging-with-IRT-symbols\" /\u003eDebugging with IRT symbols\u003c/h3\u003e\u003cdiv\u003eYou can additionally load IRT symbols. This helps to understand what application is doing when it is stopped inside NaCl syscall.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003enacl-irt c:\\Users\\username\\AppData\\Local\\Google\\Chrome SxS\\Application\\23.0.x.x\\nacl_irt_x86_64.nexe\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Automatic-debugger-launching\" /\u003eAutomatic debugger launching\u003c/h3\u003e\u003cdiv\u003eChrome can be configured to launch debugger automatically. Use additional command-line option --nacl-gdb\u003d\"path-to-nacl-gdb\" on Windows or --nacl-gdb\u003d\"command line to launch nacl-gdb in the new shell\" on Linux. You can use --nacl-gdb-script\u003d\"path-to-gdb-script\" to execute your gdb script at start up. Chrome will autodetect its IRT location and execute nacl-irt command. Additionally, if NaCl application is in a chrome extension, nacl-manifest command is executed automatically. Example chrome command lines are shown below.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.exe --enable-nacl-debug --no-sandbox \"--nacl-gdb\u003dc:\\nacl_sdk\\pepper_canary\\toolchain\\win_x86_glibc\\bin\\x86_64-nacl-gdb\" \"--nacl-gdb-script\u003dc:\\Users\\User Name\\Documents\\script.gdb\"\u003c/code\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./chrome --enable-nacl-debug --no-sandbox \"--nacl-gdb\u003dxterm /home/user_name/nacl_sdk/pepper_canary/toolchain/linux_x86_glibc/bin/x86_64-nacl-gdb\" --nacl-gdb-script\u003d/home/user_name/script.gdb\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Debugging-NaCl-applications-in-sel_ldr\" /\u003eDebugging NaCl applications in sel_ldr\u003c/h2\u003e\u003cdiv\u003eDebugging command line NaCl applications is enabled by passing -g switch to sel_ldr. Newlib debugging is the same, glibc debugging requires creating an artificial manifest. You need to reference runnable-ld.so, main executable and all *.so libraries using relative paths from manifest file. If you want to load IRT symbols, use nacl-irt command with the same IRT that is passed to sel_ldr using -B switch.\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/1711274123824581083"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/getting-started-with-debug-stub"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8250419162960444170"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8250419162960444170"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8250419162960444170"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$pageName":{"$t":"getting-started-with-debug-stub"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"XCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8750582063796568768"},"published":{"$t":"2009-01-23T20:40:28.516Z"},"updated":{"$t":"2013-06-18T00:45:08.721Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-18T00:45:07.228Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Graphics and Skia"},"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\"\u003eChrome uses Skia for nearly all graphics operations, including text rendering. GDI is for the most part only used for native theme rendering; new code should use Skia.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAlso see the section \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendertext\"\u003eRenderText and Chrome UI text drawing\u003c/a\u003e for a more specific discussion of Chrome UI text rendering.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Why-Skia-\" /\u003eWhy Skia?\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003eGDI is not full-featured enough for things like SVG, Canvas, and some of the complex UI things we have in mind.\u003c/li\u003e\r\n\u003cli\u003eSkia is in-house and can be modified to suit our needs.\u003c/li\u003e\r\n\u003cli\u003eThere was already a high-quality Webkit/Canvas port to Skia.\u003c/li\u003e\r\n\u003cli\u003eGDI+ is no longer in development by Microsoft and is slower than Skia on most operations, at least on XP. On Vista, it seems that at least some GDI+ operations are hardware accelerated, but software Skia is generally fast enough for our needs.\u003c/li\u003e\r\n\u003cli\u003eGDI+ text rendering is unacceptably different from GDI text rendering (see GDI+ Text, Resolution Independence, and Rendering Methods), and slow to boot.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Background:-What-s-with-all-these-Canvii-\" /\u003eBackground: What's with all these Canvii?\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-The-lowest-levels\" /\u003eThe lowest levels\u003c/h4\u003e\r\nThere are a confusing number of Canvas classes in use. At the lowest level is SkCanvas (in third_party/skia/include/SkCanvas.h, it is pretty well documented and you will want to refer to this file a lot in normal usage). This object contains all the methods that are used to draw. Canvases draw into an internalSkDevice, which is a simple wrapper around an SkBitmap object that actually holds the bits.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eIn addition, we have a platform-specific wrapper around the native Skia canvas called SkPlatformCanvas, which allows using platform-specific APIs to draw things such as themes. Its backing store is a SkPlatformDevice, which includes memory that is shared by Skia (who writes into it directly) and Windows, where we create an HBITMAP for the bytes and draw into it using an HDC wrapping the bitmap. In this way, we can use Skia for normal rendering and Windows for theme drawing.\u003c/div\u003e\u003cdiv\u003e\r\n\u003cbr /\u003e\r\nThe SkPlatformDevice has two functions BeginPlatformPaint (which returns an HDC you can draw into) and EndPlatformPaint that are used to wrap sections of native drawing. They manage the necessary flushing that allow Skia and GDI to see a consistent bitmap. Be very careful when rendering to the returnedHDC, see comments below on this.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-The-application-layer\" /\u003eThe application layer\u003c/h4\u003e\r\nFor the Webkit layer, SkCanvas and SkPlatformCanvas are the only objects that are used. Callers must manually set up for text drawing, which is OK because all graphics operation go through one graphics layer, GraphicsContext that we have ported to use this scheme.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIf you are writing code that will run in the browser process, for example, that draws the tab strip or one of the Destinations views, there is a higher-level option. At this layer, we also support gfx::Canvas (in ui/gfx/canvas.h) which wraps a SkCanvas. It provides text-drawing routines that provide richer functionality than the ones on SkCanvas and also wrappers around some of the common graphics primitive routines that take integer values instead of SkScalar coordinates which are more handy when integrating with most of our graphics code (see \"Scalar values\" below). These integer wrappers are named with \"Int\" appended, and a capital first letter (we use Google coding styles, Skia uses a different one for historical reasons) for example, DrawRectInt.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nOne thing to note is that SkPlatformCanvas is heavier weight than SkCanvas because it has a Windows HDC and an HBITMAP associated with it. If you are doing rendering that does not need to be copied to the screen, you should use an SkCanvas. An example would be a temporary buffer used to render a bitmap into, which is then resampled and composited into the final SkPlatformCanvas before being copied to the screen.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Which-canvas-should-you-use-\" /\u003eWhich canvas should you use?\u003c/h4\u003e\r\nIf you do not need to call GDI operations and only copy the canvas to another canvas instead of the screen, use SkCanvas directly. It will be the fastest.\u003cbr /\u003e\r\nIf you are in the renderer, you must use SkPlatformCanvas if SkCanvas is not enough for you. Inside Webkit, though, you should always use its interface, GraphicsContext, instead.\u003cbr /\u003e\r\nAll browser-level code that needs more functionality than SkCanvas should use gfx::Canvas. The Views system uses only gfx::Canvas except for intermediate results as described above.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Scalar-values\" /\u003eScalar values\u003c/h3\u003e\r\nSkia uses a custom type, SkScalar, for most of its routines to represent coordinates. Depending on the value of a compiler flag, this is either typedefed to a float for floating-point mode, or an int for fixed-point mode. In fixed-point mode, the high 16-bits represent the whole part of the number, and the low 16-bits represent the fractional part. Although we currently compile with floating-point mode, we want to leave open the option to move to fixed point mode. You should therefore be very careful and not pass integer or floating point values directly to these functions.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe easiest way is to use the *Int functions provided in gfx::Canvas if you are using one of the commonly-used functions that have wrappers. If this is not an option, you must use either SkIntToScalar or SkFloatToScalar to convert your value (an int or float, respectively), to the appropriate SkScalar type. To convert from scalars back to ints, use SkScalarRound.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-epic-battle-of-RGBA-and-BGRA\" /\u003eThe epic battle of RGBA and BGRA\u003c/h3\u003e\r\nBoth Windows and Skia use RGBA color in each 32-bit word. When written to memory on a little-endian machine like a Pentium, this becomes BGRA. While we are fortunate they agree, this still causes some problems when getting data in and out of the system. Many graphics libraries such as libpng and libjpeg expect the data to be in RGB(A) order in memory regardless of machine endianness.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe result is that we have to be careful to swizzle the bytes when interfacing with these systems. Our application-level graphics codecs such as PNGEncoder,PNGDecoder, and JPEGCodec (these are not used by Webkit), support this.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Opacity\" /\u003eOpacity\u003c/h3\u003e\r\nUsing both Windows and Skia to draw into a single buffer is great because it gives us the best of both. Windows, however, doesn't know about the alpha channel. Most GDI operations treat the high 8 bits of each 32-bit word as padding.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Premulitplied-alpha-channels\" /\u003ePremulitplied alpha channels\u003c/h3\u003e\r\nIt is important to know that Skia uses premultiplied colors. This means that the color components have already been multiplied by the alpha channel. Most people are accustomed to having a color and then thinking about a separate opacity value. Premultiplied colors have already been \"composited on black,\" allowing layers to be composited by addition of the color values rather than requiring an additional multiplication by alpha. Therefore, if the alpha is 50%, no color channels can have values greater than 50%.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nSince most graphics file formats assume postmultiplied alphas (color values plus a separate opacity of that color), we have to be careful to convert properly between the two formats when reading and writing to these systems.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nUse SkPreMultiplyColor to convert from an SkColor to a premultiplied color value (SkPMColor).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-case-of-the-disappearing-alpha\" /\u003eThe case of the disappearing alpha\u003c/h3\u003e\r\nWindows causes some problems by not knowing about the alpha channel. When drawing with GDI, it inconveniently sets the alpha channel to 0 (transparent). We have two approaches to dealing with this, one for the Webkit port, and the other for the UI. We may merge or enhance these in the future.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Transparency-in-the-Webkit-port\" /\u003eTransparency in the Webkit port\u003c/h3\u003e\r\nWeb pages do not require arbitrary transparency to render properly. The base of the web page is fully opaque. Some image formats can support alpha channels, but these images are composited on top of the opaque background and require no special handling. The only way that a web page can create transparency is by setting a global transparency on an element. Therefore, we don't need to support arbitrary transparency, only compositing layers with a 1-bit mask to separate out the totally transparent regions from the (possibly partially) opaque regions.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nNew SkPlatformDevices with transparency will have their values filled with a color that is impossible using premultiplied alphas. Webkit draws like normal over the top of this using opaque colors, potentially clearing the alpha channel using text drawing routines. When the layer is being composited, we do color replacements in fixupAlphaBeforeCompositing to reconstruct the correct alpha channel and composite. The thing to realize here is that this operation is destructive and the device will be invalid if used again.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Transparency-in-the-UI\" /\u003eTransparency in the UI\u003c/h3\u003e\r\nIn the UI, we often want to have more complex alpha channels. We give finer-grained control using prepareForGDI and postProcessGDI which are called for a rectangular region before and after GDI calls that may mangle the alpha. It does a similar replacement of transparent values to impossible colors, and then back. It assumes that all pixels written by GDI are supposed to be opaque. If you want more complex operations, you will have to do the rendering to an intermediate buffer and do separate compositing to get what you want.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Coordinate-transforms\" /\u003eCoordinate transforms\u003c/h3\u003e\r\nCurrently, SkDevice syncs Windows' coordinate transform to the current Skia transform whenever you call BeginPlatformPaint. This means that you can call GDI operations without worrying about the current transform (unless you have set up a perspective transform, which Windows doesn't support).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nHowever, this will eventually change. The problem is that Windows does a surprisingly bad job handling transformed graphics operations. For example, in text drawing, character spacing is expressed in terms of integer values in the untransformed coordinate space. If your transform has a positive scaling, the characters will become larger, but there will be visible rounding errors in the character spacing and the characters will appear uneven. Drawing themed controls is even worse, as the nearest-neighbor resampling Windows does will cause parts to expand or contract unevenly.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nThe eventual solution will be to never transform the GDI coordinates and manually compute the new positions and sizes of text and themed controls that we draw. In some cases, we may need to render to a temporary bitmap and do the resampling ourselves.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Useful-tips\" /\u003eUseful tips\u003c/h3\u003e\r\nThe SkBitmap class is internally reference counted. To prevent memory errors, it is generally best to copy the objects rather than hold pointers to them. These copies are lightweight so you should not be concerned about performance.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nSometimes you want to temporarily override the transform, clipping, or other canvas parameters for a function. Use the SkCanvas.save() function, which will save the current state on an internal stack. Use SkCanvas.restore() to pop the stack and go back where you were.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWhen you want to have a partially transparent layer of stuff, you can use the SkCanvas.saveLayerAlpha() function. This will create a new \"layer,\" which will look like an empty, fully transparent canvas that you can draw into. In addition, this saves the same state as save(). Calling restore() will composite the layer back onto the previous layer with the transparency applied that you specified when saving it. If you do not need a global opacity, use thesaveLayer() function (it will still obey the layer's alpha channel).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nClipping regions have one-bit precision. This means that you will not get antialiased edges if you have curves in your clipping region. If you want to draw something with antialiased clipping, and you can get your contents into a bitmap, you can use a bitmap shader to fill a path instead. Filled paths have nice antialiased edges.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Using-Skia\" /\u003eUsing Skia\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-The-basics\" /\u003eThe basics\u003c/h4\u003e\r\nThe model is that you use an SkCanvas to draw into an SkBitmap with an SkPaint. The SkBitmap (wrapped by an SkDevice) holds the bits, the SkCanvas manages the device and contains the drawing primitives, and the SkPaint holds most of the graphics state such as colors and antialiasing options. Most other graphics libraries combine the graphics state inside the canvas. SkPaint is lightweight and you should not generally worry about creating and destroying them as needed.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nTo draw a round rect:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e// Create the canvas. Note that this is a SkCanvas and not a PlatformCanvas so\u003c/span\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e// we won't be able to draw text on it. The canvas first requires a backing store\u003cbr /\u003e\r\n// (SkPlatformCanvas doesn't need this since it creates its own backing store).\u003cbr /\u003e\r\nSkBitmap backing_store;\u003cbr /\u003e\r\nbacking_store.setConfig(SkBitmap::kARGB_8888_Config, canvas_width, canvas_height);\u003cbr /\u003e\r\nbacking_store.setIsOpaque(true); // This will make some things faster if it's opaque.\u003cbr /\u003e\r\nbacking_store.allocPixels(); // Don't forget to call this or it will be invalid!\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nSkCanvas canvas(backing_store);\u003cbr /\u003e\r\ncanvas.drawARGB(255, 255, 255, 255); // Fill with white.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n// Make a rect from (0,0) to (100,75).\u003cbr /\u003e\r\nSkRect rect;\u003cbr /\u003e\r\nrect.set(SkIntToScalar(0), SkIntToScalar(0),\u003cbr /\u003e\r\nSkIntToScalar(100), SkIntToScalar(75));\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n// Create a path with that rect and rounded corners of radius 10.\u003cbr /\u003e\r\nSkPath path;\u003cbr /\u003e\r\npath.addRoundRect(rect, SkIntToScalar(10), SkIntToScalar(10));\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n// Fill the path (with antialiasing) in 50% transparent green.\u003cbr /\u003e\r\nSkPaint paint;\u003cbr /\u003e\r\npaint.setStyle(SkPaint::kFill_Style);\u003cbr /\u003e\r\npaint.setAntiAlias(true);\u003cbr /\u003e\r\npaint.setARGB(128, 0, 255, 0);\u003cbr /\u003e\r\ncanvas-\u0026gt;drawPath(path, paint);\u003c/span\u003e\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:14px;font-weight:bold\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:14px;font-weight:bold\"\u003eUsing the platform canvas\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\r\nThere is a handy class called SkPlatformCanvasPaint to help you handle WM_PAINT messages. It will automatically do BeginPaint and EndPaint on init/destruction, and will create the bitmap and canvas with the correct size and transform for the dirty rect. The bitmap will be automatically painted to the screen on destruction.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ecase WM_PAINT: {\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  SkPlatformCanvasPaint canvas(hwnd);\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  if (!canvas.isEmpty()) {\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    ... paint to the canvas ...\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  return 0;\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e}\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"3\"\u003eWorking with a writable Skia tree\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"border-collapse:collapse;font-weight:normal\"\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003eAdd this to the custom_deps the .gclient file:\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"src/third_party/skia\": \"\u003ca href\u003d\"https://skia.googlecode.com/svn/trunk\" style\u003d\"color:rgb(29,30,206)\" target\u003d\"_blank\"\u003ehttps://skia.googlecode.com/svn/trunk\u003c/a\u003e\",\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"src/third_party/skia/gyp\": None,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"src/third_party/skia/src\": None,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"src/third_party/skia/include\": None,\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\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-family:arial,sans-serif\"\u003eThis gets you a writable tip-of-tree skia inside chrome. For a specific revision put @\u0026lt;rev#\u0026gt; after trunk in the URL.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\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/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/graphics-and-skia"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8750582063796568768"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8750582063796568768"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8750582063796568768"}],"author":[{}],"sites$pageName":{"$t":"graphics-and-skia"},"sites$revision":{"$t":"15"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5706087519895748960"},"published":{"$t":"2009-05-15T18:01:35.645Z"},"updated":{"$t":"2013-06-17T22:46:16.694Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T22:46:14.801Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Network Settings"},"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 \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 \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-System-network-settings\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eSystem network settings\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Preference-service-for-network-settings\"\u003e\u003cstrong\u003e2 \u003c/strong\u003ePreference service for network settings\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Command-line-options-for-proxy-settings\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eCommand-line options for proxy settings\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 \u003ch3\u003e\u003ca name\u003d\"TOC-System-network-settings\" /\u003eSystem network settings\u003c/h3\u003eThe Chromium network stack uses the system network settings so that users and administrators can control the network settings of all applications easily. The network settings include:\u003cbr /\u003e\u003cul\u003e\u003cli\u003eproxy settings\u003c/li\u003e\u003cli\u003eSSL/TLS settings\u003c/li\u003e\u003cli\u003ecertificate revocation check settings\u003cbr /\u003e\u003c/li\u003e\u003cli\u003ecertificate and private key stores\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003eSo far this design decision has worked well. The only network settings that some users ask for an alternative to system settings are proxy settings. For this we recently added some command-line options that allow you to run Chromium with custom proxy settings.\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Preference-service-for-network-settings\" /\u003ePreference service for network settings\u003c/h3\u003eAlthough the system network settings have been sufficient for our network stack, eventually there will be some configuration settings specific to our network stack, so we need to have our own preference service for those settings.  See also issue 266, in which some Firefox users demand that we not use the WinInet proxy settings (the de facto system proxy settings on Windows).\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Command-line-options-for-proxy-settings\" /\u003eCommand-line options for proxy settings\u003c/h3\u003e\u003cspan style\u003d\"font-family:arial;font-size:13px;border-collapse:collapse\"\u003e\u003cdiv\u003eChrome supports the following proxy-related command line arguments:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e--no-proxy-server\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis tells Chrome not to use a Proxy. It overrides any other proxy settings provided.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e--proxy-auto-detect\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis tells Chrome to try and automatically detect your proxy configuration. This flag is ignored if --proxy-server is also provided.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e--proxy-server\u003d\u0026lt;scheme\u0026gt;\u003d\u0026lt;uri\u0026gt;[\u003c/b\u003e\u003cb\u003e:\u0026lt;port\u0026gt;][;...] | \u0026lt;uri\u0026gt;[:\u0026lt;port\u0026gt;] | \"direct://\"\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis tells Chrome to use a custom proxy configuration. You can specify a custom proxy configuration in three ways:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e1) By providing a semi-colon-separated mapping of list scheme to url/port pairs.\u003c/div\u003e\u003cdiv\u003e   For example, you can specify: \u003c/div\u003e\u003cdiv\u003e     --proxy-server\u003d\"http\u003dfoopy:80;ftp\u003dfoopy2\" \u003c/div\u003e\u003cdiv\u003e   to use HTTP proxy \"foopy:80\" for http URLs and HTTP proxy \"foopy2:80\" for ftp URLs.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e2) By providing a single uri with optional port to use for all URLs.\u003c/div\u003e\u003cdiv\u003e   For example:\u003c/div\u003e\u003cdiv\u003e    --proxy-server\u003d\"foopy:8080\"\u003c/div\u003e\u003cdiv\u003e   will use the proxy at foopy:8080 for all traffic.\u003c/div\u003e\u003cdiv\u003e   \u003c/div\u003e\u003cdiv\u003e3) By using the special \"direct://\" value.\u003c/div\u003e\u003cdiv\u003e   --proxy-server\u003d\"direct://\" will cause all connections to not use a proxy.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e--proxy-bypass-list\u003d(\u0026lt;trailing_domain\u0026gt;|\u0026lt;ip-address\u0026gt;)[:\u0026lt;port\u0026gt;][;\u003c/b\u003e\u003cb\u003e...]\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis tells chrome to bypass any specified proxy for the given semi-colon-separated list of hosts. This flag must be used (or rather, only has an effect) in tandem with --proxy-server.\u003c/div\u003e\u003cdiv\u003eNote that trailing-domain matching doesn't require \".\" separators so \"*\u003ca href\u003d\"http://google.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003egoogle.com\u003c/a\u003e\" will match \"\u003ca href\u003d\"http://igoogle.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003eigoogle.com\u003c/a\u003e\" for example.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor example,\u003c/div\u003e\u003cdiv\u003e  --proxy-server\u003d\"foopy:8080\" --proxy-bypass-list\u003d\"*.\u003ca href\u003d\"http://google.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003egoogle.com\u003c/a\u003e;*\u003ca href\u003d\"http://foo.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003efoo.com\u003c/a\u003e;\u003ca href\u003d\"http://127.0.0.1:8080/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003e127.0.0.1:8080\u003c/a\u003e\"\u003c/div\u003e\u003cdiv\u003ewill use the proxy server \"foopy\" on port 8080 for all hosts except those pointing to *.\u003ca href\u003d\"http://google.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003egoogle.com\u003c/a\u003e, those pointing to *\u003ca href\u003d\"http://foo.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003efoo.com\u003c/a\u003e and those pointing to localhost on port 8080. \u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"http://igoogle.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\"\u003eigoogle.com\u003c/a\u003e requests would still be proxied. \u003ca href\u003d\"http://ifoo.com/\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eifoo.com\u003c/a\u003e requests would not be proxied since *foo, not *.foo was specified. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e--proxy-pac-url\u003d\u0026lt;pac-file-url\u0026gt;\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis tells Chrome to use the PAC file at the specified URL.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor example,\u003c/div\u003e\u003cdiv\u003e  --proxy-pac-url\u003d\"\u003ca href\u003d\"http://wpad/windows.pac\" style\u003d\"color:rgb(0,0,204)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://wpad/windows.pac\u003c/a\u003e\"\u003c/div\u003e\u003cdiv\u003ewill tell Chrome to resolve proxy information for URL requests using the windows.pac file. \u003c/div\u003e\u003c/span\u003e\r\n\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-settings"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5706087519895748960"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5706087519895748960"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5706087519895748960"}],"author":[{}],"sites$pageName":{"$t":"network-settings"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5810456948595942801"},"published":{"$t":"2012-11-15T21:39:05.644Z"},"updated":{"$t":"2013-06-17T20:37:31.759Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T20:37:30.260Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Java Resources 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\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\u003cdiv\u003eChrome for Android uses certain resources in Java code (e.g. Android layouts and associated strings or images).  These resources are stored according to \u003ca href\u003d\"http://developer.android.com/guide/topics/resources/providing-resources.html\"\u003eAndroid's resource directory structure\u003c/a\u003e within a Java root folder.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003econtent/public/android/java/res - Java resources available within content and anything that depends on content\u003c/li\u003e\u003cli\u003echrome/android/java/res - Java resources available within chrome and anything that depends on chrome\u003c/li\u003e\u003cli\u003eui/android/java/res - Java resources available within ui and anything that depends on ui\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eJava code can reference these resources in \u003ca href\u003d\"http://developer.android.com/guide/topics/resources/accessing-resources.html\"\u003ethe normal way\u003c/a\u003e using a generated R class, being sure to qualify it with the correct package name.\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e// Use a resource from content\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003esetImageResource(\u003c/code\u003e\u003ccode\u003e\u003cb\u003eorg.chromium.content.R\u003c/b\u003e.drawable.globe_favicon);\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e// Use a resource from chrome\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003esetContentView(\u003c/code\u003e\u003ccode\u003e\u003cb\u003eorg.chromium.chrome.R\u003c/b\u003e.layout.month_picker\u003c/code\u003e\u003ccode\u003e);\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-resources-are-packaged\" /\u003eHow resources are packaged\u003c/h3\u003e\u003cdiv\u003eWhile compiling the Java code in content, an R.java file is generated based on the Java resources in content.  This R.java contains non-final constants and is used only while compiling content (and any non-APK target that depends on content) but is not included in the content jar.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen building an APK target, such as content_shell_apk, resources are merged from content, any other dependencies, and from content shell itself.  These merged resources are processed and included in the APK.  Based on these resources, a new R.java is generated with the correct resource -\u0026gt; ID mappings.  This R.java is copied into the R packages needed by each dependency (e.g. org.chromium.content.R and org.chromium.content_shell.R), and all these copies are included in the APK.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis process closely follows Android's handling of resources in \u003ca href\u003d\"http://developer.android.com/tools/projects/index.html#LibraryProjects\"\u003elibrary projects\u003c/a\u003e, where content and chrome are the \"libraries\", though we don't use the SDK to compile our \"libraries\".  Hence some of the same \u003ca href\u003d\"http://developer.android.com/tools/projects/index.html#considerations\"\u003ecaveats\u003c/a\u003e apply.  In particular, two resources with the same ID cannot coexist.  The resource highest in the dependency chain (e.g. in content shell) will override the others (e.g. in content).\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Supporting-resources-in-gyp\" /\u003eSupporting resources in gyp\u003c/h3\u003e\u003cdiv\u003eTo add resources to another Java root folder, add the variables has_java_resources, R_package, and R_package_relpath to the gyp target that builds that Java code.  For example:\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e{\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  'target_name': 'content_java',\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  'type': 'none',\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  'dependencies': [\u003c/code\u003e\u003ccode\u003e ...\u003c/code\u003e\u003ccode\u003e ],\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  'variables': {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    'package_name': 'content',\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    'java_in_dir': '../content/public/android/java',\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    \u003cb\u003e# Support Java resources in content\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    \u003cb\u003e'has_java_resources': 1,\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    \u003cb\u003e'R_package': 'org.chromium.content',\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    \u003cb\u003e'R_package_relpath': 'org/chromium/content',\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  },\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e  'includes': [ '../build/java.gypi' ],\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e},\u003c/code\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/java-resources-on-android"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5810456948595942801"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5810456948595942801"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5810456948595942801"}],"author":[{"name":{"$t":"Newton Allen"},"email":{"$t":"newt@chromium.org"}}],"sites$pageName":{"$t":"java-resources-on-android"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7095565544885442318"},"published":{"$t":"2013-06-17T16:01:22.370Z"},"updated":{"$t":"2013-06-17T16:01:42.525Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T16:01:41.259Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Downloads"},"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\"\u003eTODO describe shelf, chrome://downloads\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/downloads-1"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7095565544885442318"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7095565544885442318"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7095565544885442318"}],"author":[{"name":{"$t":"Ben Hayden"},"email":{"$t":"benjhayden@chromium.org"}}],"sites$pageName":{"$t":"downloads-1"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8539057161899522336"},"published":{"$t":"2008-08-29T23:06:51.785Z"},"updated":{"$t":"2013-06-17T16:00:27.416Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T16:00:27.415Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Moodstats_1.22.zip"},"summary":{},"content":{"type":"application/x-zip-compressed","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8539057161899522336"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5525293701516264301"},{"rel":"alternate","type":"application/x-zip-compressed","href":"https://sites.google.com/a/chromium.org/dev/user-experience/downloads/Moodstats_1.22.zip"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8539057161899522336"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8539057161899522336"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8539057161899522336"},{"rel":"edit-media","type":"application/x-zip-compressed","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8539057161899522336"}],"author":[{"name":{"$t":"Glen Murphy"},"email":{"$t":"glen@google.com"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3105118531646877755"},"published":{"$t":"2008-08-29T23:06:55.112Z"},"updated":{"$t":"2013-06-17T16:00:27.403Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T16:00:27.402Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"download_shelf.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3105118531646877755"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5525293701516264301"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/user-experience/downloads/download_shelf.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3105118531646877755"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3105118531646877755"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3105118531646877755"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3105118531646877755"}],"author":[{"name":{"$t":"Glen Murphy"},"email":{"$t":"glen@google.com"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5525293701516264301"},"published":{"$t":"2008-08-29T23:42:05.761Z"},"updated":{"$t":"2013-06-17T16:00:27.354Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T16:00:27.353Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Downloads"},"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 \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-Shelf\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eShelf\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Browse\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBrowse\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Future-Work\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eFuture Work\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 \u003ch2\u003e\u003ca name\u003d\"TOC-Shelf\" /\u003eShelf\u003c/h2\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/user-experience/downloads/download_shelf.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1371484827403/user-experience/downloads/download_shelf.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003eThe download shelf is a tab-parented toolbar that shows the downloads that have occurred in its parent tab. The shelf allows us to show download UI without the overhead of additional windows.\r\n\r\nItems in the shelf can be dragged to folders to make it easier to organize files post-download; in future they will be able to be dragged to upload fields.\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Browse\" /\u003eBrowse\u003c/h2\u003e\u003cdiv dir\u003d\"ltr\"\u003eThe user may see a full-sized view of their downloads by viewing the downloads page, accessible from the Chromium menu, by pressing \u003cb\u003eCtrl+J\u003c/b\u003e, or by clicking \u003cb\u003eShow all downloads\u003c/b\u003e the right edge of a download shelf. This page shows a searchable, more detailed list of the user's downloads.\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Future-Work\" /\u003eFuture Work\r\n\r\n\u003c/h2\u003eWe are considering making the shelf a per-window or global option; both of these have problems in multi-window scenarios, however.\r\n\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/downloads"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5525293701516264301"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5525293701516264301"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5525293701516264301"}],"author":[{"name":{"$t":"Mike Jeffrey"},"email":{"$t":"mjeffrey@google.com"}}],"sites$pageName":{"$t":"downloads"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"UCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5349576635245049343"},"published":{"$t":"2012-06-21T18:16:32.022Z"},"updated":{"$t":"2013-06-17T15:48:11.898Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T15:48:10.552Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Triaging Downloads 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\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dcr-ui-browser%3Ddownloads\u0026amp;sort\u003d\u0026amp;groupby\u003d\u0026amp;colspec\u003dID+Pri+Status+Modified+Owner+Summary\u0026amp;nobtn\u003dUpdate\"\u003eDownloads bugs\u003c/a\u003e are automatically cc'd to the mailing list download-bugs@chromium.org.  People on the bugs rotation should subscribe to that list. The suggested frequency for handling incoming bugs is 2-3 days, but that's just a suggestion.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eTriagers should\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eAttempt to reproduce and set the correct Status for \u003ca href\u003d\"http://crbug.com/?q\u003dcr-ui-browser%3Ddownloads+status%3Auntriaged%2Cunconfirmed+-blocking%3A96604+-needs%3Dfeedback\u0026amp;colspec\u003dID+Summary+Modified\"\u003euntriaged and unconfirmed bugs\u003c/a\u003e. (That search ignores Needs-Feedback and External bugs.)\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eEngage with users as they report bugs to get all the information we need for eventual resolution.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eSet Type-Feature Available for feature requests or mark WontFix and explain why this feature is unlikely to be implemented.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eCrash reports frequently do not contain crash ids. Send reporters to \u003ca href\u003d\"http://www.chromium.org/for-testers/bug-reporting-guidelines/reporting-crash-bug\"\u003eReporting a Crash Bug\u003c/a\u003e and set Needs-Feedback.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ca href\u003d\"http://dev.chromium.org/for-testers/providing-network-details\"\u003eProviding Network Details for bug reports\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eEnsure high priority bugs receive appropriate attention. Consult benjhayden or asanka if necessary in order to ensure timely resolution. High priority bugs include\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eRegressions: Mark as Type-Bug-Regression Pri-1\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePossible security problems: Request security review and lock down (Restrict-View-Commit).  If security review shows severity medium or higher, mark Pri-1\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eCrashers: Mark as Pri-1 if it's on the top crash list or looks likely to happen in the wild. If it looks like a use-after-free that might be reproducible in the wild, it's a security issue.\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ca href\u003d\"https://chromecrash.corp.google.com/browse?q\u003dint32(extract_regexp(product.version%2C%20r'%5Cd%2B%5C.%5Cd%2B%5C.(%5Cd%2B)%5C.%5Cd%2B'))%20%3E%3D%200%20AND%0Acustom_data.ChromeCrashProto.ptype%3D'browser'%20AND%0A(custom_data.ChromeCrashProto.magic_signature_1.component%20CONTAINS%20'src%2Fcontent%2Fbrowser%2Fdownload'%20OR%0A%20custom_data.ChromeCrashProto.magic_signature_1.component%20CONTAINS%20'src%2Fchrome%2Fbrowser%2Fdownload'%20OR%0A%20custom_data.ChromeCrashProto.magic_signature_1.file_path%20CONTAINS%20'src%2Fchrome%2Fbrowser%2Fextensions%2Fapi%2Fdownloads'%20OR%0A%20custom_data.ChromeCrashProto.magic_signature_1.file_path%20CONTAINS%20'src%2Fchrome%2Fbrowser%2Fui%2Fwebui%2Fdownload')\"\u003echromecrash query\u003c/a\u003e: fiddle with the literal 0 to find crashes before/after/at a specific branch.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eBadly broken features\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eFailing or disabled tests\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eMark duplicates as such. \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/network-bug-triage/downloads-bug-triage/salient-bug-list\" style\u003d\"font-size:10pt\"\u003eFrequently duplicated bugs\u003c/a\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eSome issues on windows are due to bad shell extensions. Point reporters to\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e \u003c/span\u003e\u003ca href\u003d\"http://www.nirsoft.net/utils/shell_menu_view.html\" style\u003d\"font-size:10pt\" rel\u003d\"nofollow\"\u003eShellMenuView\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli\u003eCategorize \u003ca href\u003d\"http://crbug.com?q\u003dcr-ui-browser%3Ddownloads+-blocking%3A68191+-blocking%3A68195+-blocking%3A68196+-blocking%3A68197+-blocking%3A68198+-blocking%3A68200+-blocking%3A68201+-blocking%3A68204+-blocking%3A68206+-blocking%3A68208+-blocking%3A68209+-blocking%3A68276+-blocking%3A68356+-blocking%3A68358+-blocking%3A68359+-blocking%3A68361+-blocking%3A69298+-blocking%3A78147+-blocking%3A78148+-blocking%3A96604+-blocking%3A133971+-blocking%3A133960\u0026amp;colspec\u003dID+Summary+Modified\"\u003euncategorized bugs\u003c/a\u003e by adding them to the \"Blocked on\" list of one of \u003ca href\u003d\"http://crbug.com/?q\u003dCr-Ui-Browser%3DDownloads+blocking%3A133960\u0026amp;colspec\u003dID+Summary\"\u003ethese category bugs\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eSweep \u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dcr-ui-browser\u003ddownloads%20needs\u003dfeedback\u0026amp;sort\u003dmodified\u0026amp;colspec\u003dID%20Status%20Owner%20Summary%20Modified\"\u003eneeds\u003dfeedback\u003c/a\u003e: if feedback has been provided, remove needs-feedback and continue debugging; if feedback has not been provided after 2 weeks, Archive the bug.\u003c/li\u003e\u003cli\u003eWhen major changes such as file moves happen, either update the below documentation or delete it if nobody has found it useful.\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eFAQ, Bug-hunting tips\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eWhere to begin fixing different kinds of bugs. Please feel free extend this liberally.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eMain entry point from the ResourceDispatcherHost to the downloads system: \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/content/browser/loader/buffered_resource_handler.cc\"\u003eBufferedResourceHandler\u003c/a\u003e decides whether RDH should create \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/content/browser/download/download_resource_handler.cc\"\u003eDownloadResourceHandler\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003eThe download state machine is managed on the UI thread in \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/content/browser/download/download_item_impl.cc\"\u003eDownloadItemImpl\u003c/a\u003e, managed by \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/content/browser/download/download_manager_impl.cc\"\u003eDownloadManagerImpl\u003c/a\u003e.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003echrome://downloads \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/ui/webui/downloads_dom_handler.cc\" style\u003d\"font-size:10pt\"\u003eWebUI\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/resources/downloads/\" style\u003d\"font-size:10pt\"\u003eHTML/CSS/JS\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/download/download_target_determiner.cc\" style\u003d\"font-size:10pt\"\u003eTarget filename determiner\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/download/download_history.cc\"\u003eDownloadHistory\u003c/a\u003e observes the DownloadManager and DownloadItems and posts changes to \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/history/download_database.cc\"\u003eDownloadDatabase\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003echrome.downloads Extension API \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/common/extensions/api/downloads.idl\" style\u003d\"color:rgb(85,26,139)\"\u003eIDL\u003c/a\u003e, \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/extensions/api/downloads/downloads_api.cc\"\u003eimplementation\u003c/a\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003eMultiple automatic download throttling infobar \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/chrome/browser/download/download_request_limiter.cc\"\u003eDownloadRequestLimiter\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cbr /\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/5116751965969951381"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/network-bug-triage/downloads-bug-triage"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5349576635245049343"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5349576635245049343"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5349576635245049343"}],"author":[{"name":{"$t":"Randy Smith"},"email":{"$t":"rdsmith@chromium.org"}}],"sites$pageName":{"$t":"downloads-bug-triage"},"sites$revision":{"$t":"29"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},"published":{"$t":"2012-09-21T08:55:46.942Z"},"updated":{"$t":"2013-06-17T15:31:28.832Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T15:31:26.446Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging NaCl apps in Eclipse CDT"},"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\"\u003eEclipse CDT plugin is designed for development with GNU tools. Its flexibility allows to configure it for developing NaCl applications without using any additional plugins. The cost of this flexibility is that a lot of advanced features are not available. The following instructions are written for Windows but they can be used on any OS if you replace Windows paths to paths on your OS.\u003ch2\u003e\u003ca name\u003d\"TOC-Creating-NaCl-project\" /\u003eCreating NaCl project\u003c/h2\u003e\u003cdiv\u003eCreate NaCl Project directory inside Eclipse workspace (C:\\Users\\username\\workspace by default). Copy all files from nacl_sdk\\pepper_22\\examples\\hello_world except hello_world.c to this directory. Create src subdirectory and copy hello_world.c file there. Placing source files in the src directory makes cleaner project structure. Now go to File-\u0026gt;New-\u0026gt;Makefile Project with Existing Code menu in Eclipse. Choose project name, enter project folder location and select Cross GCC toolchain.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20project.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348220127949/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20project.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYour new project will look like this.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20project%20view.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348220492789/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20project%20view.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Building-NaCl-project\" /\u003eBuilding NaCl project\u003c/h2\u003e\u003cdiv\u003eOpen Makefile in the editor. Comment out lines ALL_TARGETS+\u003dwin/Debug/hello_world.nmf and ALL_TARGETS+\u003dwin/Release/hello_world.nmf and replace hello_world.c with src/hello_world.c (Edit-\u0026gt;Find/Replace... in the menu or Ctrl+F with default key bindings). Then right click on the project and choose Preferences in the popup menu. Go to C/C++ Build-\u0026gt;Build Variables page and add NACL_SDK_ROOT variable. Point the variable to the pepper version you want to build with. If you downloaded NaCl SDK to c:\\nacl_sdk directory and want to use 22 pepper, set it to c:\\nacl_sdk\\pepper_22.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20build%20variable.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348221047866/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20build%20variable.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build%20variables.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348221196426/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build%20variables.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNow we can use this variable to set build command on C/C++ Build page to ${NACL_SDK_ROOT}/tools/make NACL_SDK_ROOT\u003d${NACL_SDK_ROOT}. On Linux and Mac use make NACL_SDK_ROOT\u003d${NACL_SDK_ROOT}.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348221739069/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEnable parallel build on Behaviour tab.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build%20behaviour%20tab.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348223714037/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build%20behaviour%20tab.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePress OK in properties window. You can now build the project by right clicking on it and selecting Build Project in the popup menu or by pressing hammer icon \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20hammer%20icon.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348223899057/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20hammer%20icon.png\" /\u003e\u003c/a\u003e in the toolbar. Make build log will be shown in console view.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Set-up-eclipse-indexer\" /\u003eSet up eclipse indexer\u003c/h2\u003e\u003cdiv\u003eEclipse indexer doesn't use external compiler and so it should be configured separately. Open project properties and go to C/C++ General-\u0026gt;Paths and Symbols page. Open Source Location tab, add src folder using Add Folder... button and remove root of the project using Delete button.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20source%20location.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348224469544/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20source%20location.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThen go to Output Location path, add glibc and newlib folders there and remove root of the project.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20output%20location.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348224594206/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20output%20location.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNow let us setup include paths. Go to Includes tab and press Add... button. Enter ${NACL_SDK_ROOT}/include in the directory field and select Add to all configurations and Add to all languages checkboxes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20add%20directory%20path%201.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348225068540/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20add%20directory%20path%201.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eThen press Add... button again and add ${NACL_SDK_ROOT}/toolchain/win_x86_glibc/x86_64-nacl/include directory (replace win_x86_glibc with linux_x86_glibc or mac_x86_glibc if you use Linux or Mac OS X accordingly).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20add%20directory%20path%202.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348225506947/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20add%20directory%20path%202.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003ePress OK button in properties window and open hello_world.c. There should not be any compile errors now.\u003c/div\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\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20with%20indexer%20enabled.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348225725535/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20with%20indexer%20enabled.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Debug-NaCl-newlib-application\" /\u003eDebug NaCl newlib application\u003c/h2\u003e\u003cdiv\u003eLaunching and debugging applications in Eclipse is done via running and debugging configurations. Usually they are created automatically. Unfortunately, NaCl debugging is done using remote debugging protocol. Setting up remote connection requires parameters that can't be determined automatically. So we have to create debugging configuration by hand. Go to Run-\u0026gt;Debug Configurations... menu or press on debug icon arrow \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20icon.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348238967479/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20icon.png\" /\u003e\u003c/a\u003e in toolbar and choose Debug Configurations... in the popup menu. Select C/C++ Remote Application in Debug Configurations windows and press new button \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20debug%20configuration%20icon.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348239165560/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20debug%20configuration%20icon.png\" /\u003e\u003c/a\u003e above filter text field or choose New in the popup menu.\u003c/div\u003e\u003cdiv\u003eChange configuration name to NaCl Project newlib and fill C/C++ Application field with ${workspace_loc}\\NaCl Project\\newlib\\Debug\\hello_world_x86_64.nexe. We use ${workspace_loc} instead of ${project_loc} since the later depends on currently selected project.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20main.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348239931801/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20main.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNow press Select other link at the bottom of the window. If you don't see the link, skip this step. Select Use configuration specific settings checkbox and choose GDB (DSF) Manual Remote Debugging Launcher in the list.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20select%20preferred%20launcher.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348240717522/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20select%20preferred%20launcher.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePress OK and go to the debugger tab. Change Stop on startup at field to Instance_DidCreate or deselect the Stop on startup checkbox. On Main tab in Debugger Options set GDB debugger field to c:\\nacl_sdk\\pepper_canary\\toolchain\\win_x86_glibc\\bin\\x86_64-nacl-gdb.exe. Ensure that Non-stop mode checkbox is not selected since nacl-gdb doesn't support this mode.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20Debugger%20Main.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348579743450/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20Debugger%20Main.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eSet port number to 4014 in Gdbserver Settings tab.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20Debugger%20Gdbserver%20Settings.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348579917710/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20Debugger%20Gdbserver%20Settings.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eSave debug configuration by clicking Apply button. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNow you need to launch chrome with --no-sandbox and --enable-nacl-debug flags and run your NaCl application. NaCl debug stub will stop application at first instruction. Then you need to open Debug Configuration window, select our debug configuration and press Debug button. Next time, you can launch it by pressing debug icon arrow that shows 10 last debug configurations.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20last%20debug%20configurations.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348241142985/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20last%20debug%20configurations.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen program will stop on the start breakpoint or breakpoint you set in project, Eclipse will switch to debug perspective.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20hit%20breakpoint.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348580936219/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20hit%20breakpoint.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Debugging-NaCl-glibc-application\" /\u003eDebugging NaCl glibc application\u003c/h2\u003e\u003cdiv\u003eCreate gdb_init.txt file and add line nacl-manifest \"c:\\\\Users\\\\username\\\\workspace\\\\NaCl Project\\\\glibc\\\\Debug\\\\hello_world.nmf\". If you use debugger from pepper_29+, you don't need to double slashes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20gdb_init%20file.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348585616527/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20gdb_init%20file.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eGo to Run-\u0026gt;Debug configuration... menu and duplicate newlib debug configuration using Duplicate item in popup menu. Change new configuration name to NaCl Project glibc and C/C++ Application field to ${workspace_loc}\\NaCl Project\\glibc\\Debug\\lib64\\runnable-ld.so.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20glibc%20main.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348585787726/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20glibc%20main.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThen go to Debugger tab and change GDB command file on Main subtab to c:\\Users\\username\\workspace\\NaCl Project\\gdb_init.txt. Ensure that Non-stop mode checkbox is not selected.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20glibc%20Debugger%20Main.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348585907243/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20glibc%20Debugger%20Main.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePress Apply button and close the window. Now you need to run your NaCl application in chrome with --enable-nacl-debug and --no-sandbox flags, select this debug configuration in Debug Configurations window and press Debug button. You may see some error messages like\u003c/div\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eNo source file named hello_world.c.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003ewarning: Could not load shared library symbols for runnable-ld.so.\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eDo you need \"set solib-search-path\" or \"set sysroot\"?\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eYou should ignore them.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20glibc%20hit%20breakpoint.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348586276453/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20glibc%20hit%20breakpoint.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Troubleshooting\" /\u003eTroubleshooting\u003c/h2\u003e\u003cdiv\u003eIf something goes wrong, you can look on gdb input and output. Press on the arrow of console icon in Console view to show \"NaCl Project glibc [C/C++ Remote Application] gdb traces\" console.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20consoles.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1348586543240/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20consoles.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\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/1711274123824581083"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4578507324020236643"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$pageName":{"$t":"debugging-nacl-apps-in-eclipse-cdt"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1711274123824581083"},"published":{"$t":"2012-09-17T09:07:46.748Z"},"updated":{"$t":"2013-06-17T15:27:50.419Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-17T15:27:48.679Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging with debug stub (recommended)"},"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\"\u003eDebug stub is a new way to debug NaCl applications. If --enable-nacl-debug and --no-sandbox switches are passed to chrome or -g switch is passed to sel_ldr, a local TCP port is opened that accepts incoming TCP connections from a debugger via RSP protocol. This port is opened on localhost network interface, so one need to forward this port to debug NaCl application from remote computer. This method of debugging is preferred since debug stub inside NaCl process have an intimate knowledge about NaCl application.\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/924743253795182224"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1711274123824581083"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1711274123824581083"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1711274123824581083"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$pageName":{"$t":"debugging-with-debug-stub-recommended"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1895151603585604795"},"published":{"$t":"2013-06-11T12:21:51.937Z"},"updated":{"$t":"2013-06-11T14:31:44.264Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-11T14:31:42.561Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Multi-Process RAM usage analysis 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\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\u003cdiv\u003eMeasuring RAM usage of a program should take in account not only memory heap, but also other memory, such as memory-mapped files or memory shared among the processes. There is a built-in Android debug tool \u003cb\u003eprocrank\u003c/b\u003e that displays one useful number for a process: \"Uss\" (Unique Set Size), rough amount of \u003ci\u003eprivate\u003c/i\u003e memory (such as C++/V8/Dalvik heaps). Procrank also reports \"Pss\" (Proportional Set Size) that takes into account shared memory, but it is hard to make any conclusions based on this number. Chrome on Android is a multi-process application where browser process shares quite a lot of memory with the renderer processes (for example, read-only code).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe new set of tools in the chromium tree estimate the overall RAM usage of all processes (browser and renderers), as well as provides more fine-grained analysis for the running browser by type or memory mapping: private, shared read-only, shared read-write, etc. The HOWTO below briefly describes the steps to use the tools.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-HOWTO\" /\u003eHOWTO\u003c/h2\u003e\u003cdiv\u003e\u003cb\u003eStep 1:\u003c/b\u003e build the memdump tool and deploy it on the device. The tools will be used to analyse memory mappings by looking at /proc/PID/pagemap, /proc/PID/maps for given process IDs, and also /proc/kpagecount.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eadb remount\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eadb root\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eninja -C out/Release \u003cb\u003ememdump\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eadb push out/Release/memdump /data/local/tmp/\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eStep 2:\u003c/b\u003e Build the browser with the 'dlmalloc hack' (\u003ca href\u003d\"https://codereview.chromium.org/16514009\" style\u003d\"font-size:10pt;color:rgb(85,26,139)\"\u003ehttps://codereview.chromium.org/16514009\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e). It is the allocator used in Android by default, except it is modified to perform all internal mappings using ashmem, which makes it easier to distinguish the heap memory from other mappings.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eGiven a checkout of chromium sources patch them with the hack, enable the build flag and build the browser:\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003egit cl patch 16514009\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003eGYP_DEFINES\u003d\"\u003cb\u003eandroid_use_dlmalloc\u003d1\u003c/b\u003e $GYP_DEFINES\" gclient runhooks\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e# Build and deploy the browser apk as usual.\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eSteps 1 and 2 should be performed only once for a browser build.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eStep 3:\u003c/b\u003e when the browser is started, use a little shell scripting to select the PIDs of all processes belonging to the browser (kill all other browser instances prior to this step), feed the memdump report to the analyser:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eadb shell /data/local/tmp/memdump $(adb shell ps | grep chrome | awk '{ print $2; }') | python tools/android/memdump/memreport.py\u003c/code\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAn example output it produces:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Process 1,private,shared_app,shared_other,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Total,91.7734375,54.71875,46.06640625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Read-only,2.94140625,1.13671875,9.36328125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Read-write,84.80078125,45.58203125,31.984375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Executable,4.03125,8.0,4.71875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,File read-write,78.28125,45.58203125,31.21875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Anonymous read-write,6.47265625,0.0,0.76171875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,File executable,4.03125,8.0,4.71875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Anonymous executable (JIT'ed code),0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,chromium mmap,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,chromium TransferBuffer,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Galaxy Nexus GL driver,65.73828125,0.0,20.05859375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Dalvik,5.67578125,0.0,10.84375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Dalvik heap,3.55078125,0.0,8.0625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Native heap (jemalloc),0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Native heap (dlmalloc),\u003cb\u003e4.50390625\u003c/b\u003e,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,System heap,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Ashmem,2.01171875,45.58203125,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so total,5.234375,7.9453125,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so read-only,1.2421875,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so read-write,0.14453125,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so executable,3.84765625,7.9453125,0.0,\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,Process 2,private,shared_app,shared_other,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Total,20.5859375,54.71875,21.16796875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Read-only,1.3125,1.13671875,5.71484375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Read-write,11.6796875,45.58203125,13.1640625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Executable,7.59375,8.0,2.2890625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,File read-write,8.45703125,45.58203125,12.140625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Anonymous read-write,3.83203125,0.0,1.0078125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,File executable,6.9765625,8.0,2.2890625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Anonymous executable (JIT'ed code),0.6171875,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,chromium mmap,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,chromium TransferBuffer,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Galaxy Nexus GL driver,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Dalvik,1.5,0.0,11.7734375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Dalvik heap,0.64453125,0.0,8.41796875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Native heap (jemalloc),0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Native heap (dlmalloc),6.76171875,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,System heap,0,0,0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Ashmem,0.0,45.58203125,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so total,8.35546875,7.9453125,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so read-only,1.2421875,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so read-write,0.14453125,0.0,0.0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so executable,6.96875,7.9453125,0.0,\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,Total,167.078125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Read-only,5.390625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Read-write,142.0625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Executable,19.625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,File read-write,132.3203125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Anonymous read-write,10.3046875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,File executable,19.0078125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Anonymous executable (JIT'ed code),0.6171875,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,chromium mmap,0,0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,chromium TransferBuffer,0,0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Galaxy Nexus GL driver,65.73828125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Dalvik,7.17578125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Dalvik heap,4.1953125,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Native heap (jemalloc),0,0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Native heap (dlmalloc),11.265625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,System heap,0,0\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,Ashmem,47.59375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so total,21.53515625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so read-only,2.484375,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so read-write,0.2890625,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e,libchromeview.so executable,18.76171875,\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnly information about the \u003cb\u003epages resident in memory\u003c/b\u003e is printed. The \"Process 1\" is typically the browser process, others are renderer processes. For example, the value in bold shows that the browser process has allocated ~4.5 MB heap memory. The browser also has loaded almost 4MB of executable code during execution.\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/multi-process-ram-usage-analysis-on-android"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1895151603585604795"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1895151603585604795"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1895151603585604795"}],"author":[{"name":{"$t":"Egor Pasko"},"email":{"$t":"pasko@chromium.org"}}],"sites$pageName":{"$t":"multi-process-ram-usage-analysis-on-android"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8960734178926730508"},"published":{"$t":"2010-03-17T16:59:50.344Z"},"updated":{"$t":"2013-06-01T18:13:38.255Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-06-01T18:13:36.874Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Making changes to test dashboard"},"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\"\u003e\u003cb\u003ehttp://test-results.appspot.com\u003c/b\u003e\u003c/font\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMaking changes:\u003c/div\u003e\u003cdiv\u003e1. In a Blink checkout, the code is at Tools/TestsResultServer.\u003c/div\u003e\u003cdiv\u003e2. Modify the files locally. If you're only modifying files in the static-dashboards directory, then to test, you can just load the appropriate HTML file off your local disk.\u003c/div\u003e\u003cdiv\u003e3. Run the flakiness_dashboard.html unittests by loading run-unittests.html.\u003c/div\u003e\u003cdiv\u003e4. Get the patch reviewed and committed as per the usual Blink procedure.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you're fixing an emergency issue (e.g. the dashboard doesn't load at all), it's acceptable to push the new server before you've gotten your patch reviewed and committed.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn order to push the changes to the server, you need to get permissions to modify the server. Contact one of the existing admins (e.g. ojan@chromium.org). Anyone is welcome to permissions.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePushing committed changes to the server:\u003c/div\u003e\u003cdiv\u003e1. Install the appengine SDK for python: \u003ca href\u003d\"http://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Python\"\u003ehttp://code.google.com/appengine/downloads.html#Google_App_Engine_SDK_for_Python\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e2. cd Tools/TestResultServer\u003c/div\u003e\u003cdiv\u003e3. appcfg.py update . --version rXXXXX\u003c/div\u003e\u003cdiv\u003e^^^ replace XXXXX with the SVN revision your Blink checkout is synced to. This is just a string. The push is from your local repository, not the actual SVN server. It's so we can keep track of what we've pushed to appengine. \u003c/div\u003e\u003cdiv\u003e4. Go to \u003ca href\u003d\"https://appengine.google.com/deployment?\u0026amp;app_id\u003dtest-results-hrd\"\u003ehttps://appengine.google.com/deployment?\u0026amp;app_id\u003dtest-results-hrd\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e5. \u003cspan style\u003d\"background-color:rgba(255,255,255,0.917969);color:rgb(34,34,34);font-family:arial,sans-serif\"\u003eVerify that your version works by clicking on the \u003c/span\u003e\u003cspan style\u003d\"background-color:rgba(255,255,255,0.917969);color:rgb(34,34,34);font-family:arial,sans-serif\"\u003e\"instances\" link and navigating around.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e6. Select the version you just uploaded and click \"Make Default\".\u003c/div\u003e\u003cdiv\u003e7. Sanity check that your changes are all working as expected.\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/1447271005938918470"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/changedashboard"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8960734178926730508"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8960734178926730508"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8960734178926730508"}],"author":[{}],"sites$pageName":{"$t":"changedashboard"},"sites$revision":{"$t":"14"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8698518727200176527"},"published":{"$t":"2013-05-30T10:45:49.930Z"},"updated":{"$t":"2013-05-30T15:06:39.561Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-30T15:06:37.920Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Order file development 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\u003cspan style\u003d\"font-size:10pt\"\u003e1. Build chromeos-chrome with profile instrumentation\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eexport USE\u003d\"$USE -reorder\"\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eexport EXTRA_BUILD_ARGS\u003d\"order_profiling\u003d1 order_text_section\u003d''\"\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e2. Add \u003ccode\u003e--no-sandbox\u003c/code\u003e to chrome start arguments (in the buttom of /sbin/session_manager_setup.sh).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e3. As you prepare, you may have run chrome collecting logs (which you don't want yet). Remove them and reboot.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003erm /var/log/chrome/cyglog.*; sudo reboot\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e4. After you browse several sites (google.com, maps.google.com, youtube.com), copy logs to your host machine to some directory.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e5. Sanitize logs.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ehead -1 cyglog.*\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eIf some log does not contain header (containing /opt/google/chrome/chrome), remove it. This log left from before you removed all cyglogs last boot.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e6. Merge logs to a single file. This may take some minutes to run.\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$CHROME_SRC/tools/cygprofile/mergetraces.py `ls cyglog.* -Sr` \u0026gt; merged_cyglog\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e7. Symbolize the log using your instrumented image (from p.1).\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$CHROME_SRC/tools/cygprofile/symbolize.py -t orderfile merged_cyglog /build/x86-alex/opt/google/chrome/chrome \u0026gt; unpatched_orderfile\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e8. Rebuild chromeos-chrome with new orderfile.\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003eexport USE\u003d\"$USE -reorder\"\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eexport EXTRA_BUILD_ARGS\u003d\"order_profiling\u003d0 order_text_section\u003d'/home/$USER/trunk/src/scripts/cyglog/unpatched_orderfile'\"\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e9. Patch the orderfile to\u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e$CHROME_SRC/tools/cygprofile/patch_orderfile.py unpatched_orderfile /build/x86-alex/opt/google/chrome/chrome \u0026gt; orderfile\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e9. If you want to visually check that the resulting image is reordered, use \u003c/div\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003enm -Sn /build/x86-alex/opt/google/chrome/chrome | less\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003eAnd note, that ChromeMain symbol is not at the beginning of symbols. \u003cdiv\u003eIn the image built without reordering, ChromeMain immediately follows main and is about 10th symbol in the image.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e10. Update the repository containing orderfiles.\u003c/div\u003e\u003cdiv\u003eThe repo, containing orderfiles is here: http://git.chromium.org/gitweb/?p\u003dchromiumos/profile/chromium.git\u003c/div\u003e\u003cdiv\u003eIntructions on how to update the repo: http://www.chromium.org/chromium-os/how-tos-and-troubleshooting/git-server-side-information\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e11. Update src/third_party/chromiumos-overlay/chromeos-base/chromeos-chrome/chromeos-chrome-9999.ebuild to grab the latest version of the orderfile (that you updated in p.10).\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/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/order-file-development-guide"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8698518727200176527"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8698518727200176527"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8698518727200176527"}],"author":[{"name":{"$t":"Anthony Berent"},"email":{"$t":"aberent@chromium.org"}}],"sites$pageName":{"$t":"order-file-development-guide"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7841451236486719574"},"published":{"$t":"2013-05-29T01:20:00.802Z"},"updated":{"$t":"2013-05-29T01:20:00.811Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-29T01:20:00.802Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen Shot 2013-05-28 at 6.18.39 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7841451236486719574"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/312343428971785383"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/perf-sheriffs/bisecting-performance-regressions/Screen%20Shot%202013-05-28%20at%206.18.39%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7841451236486719574"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7841451236486719574"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7841451236486719574"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7841451236486719574"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/994213493191691073"},"published":{"$t":"2013-05-28T23:17:41.495Z"},"updated":{"$t":"2013-05-28T23:23:22.629Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T23:17:41.495Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"frameviewer.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/994213493191691073"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2492097714142117018"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/frame-viewer/frameviewer.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/994213493191691073"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/994213493191691073"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/994213493191691073"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/994213493191691073"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2858748071067868006"},"published":{"$t":"2013-05-15T04:11:36.747Z"},"updated":{"$t":"2013-05-28T23:23:22.628Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-15T04:11:36.747Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen Shot 2013-05-14 at 9.10.55 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2858748071067868006"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2492097714142117018"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/frame-viewer/Screen%20Shot%202013-05-14%20at%209.10.55%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2858748071067868006"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2858748071067868006"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2858748071067868006"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2858748071067868006"}],"author":[{"name":{"$t":"Nathaniel Duca"},"email":{"$t":"nduca@chromium.org"}}],"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5514872395226264185"},"published":{"$t":"2013-05-28T22:07:50.308Z"},"updated":{"$t":"2013-05-28T22:07:50.315Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T22:07:50.308Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"abouttracing2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5514872395226264185"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/abouttracing2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5514872395226264185"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5514872395226264185"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5514872395226264185"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5514872395226264185"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3274633855081655774"},"published":{"$t":"2013-05-28T22:02:37.386Z"},"updated":{"$t":"2013-05-28T22:02:37.394Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T22:02:37.386Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"abouttracingfinal.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3274633855081655774"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/abouttracingfinal.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3274633855081655774"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3274633855081655774"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3274633855081655774"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3274633855081655774"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2178045215671961507"},"published":{"$t":"2013-05-28T21:45:18.890Z"},"updated":{"$t":"2013-05-28T21:45:18.895Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T21:45:18.890Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"skdebugger2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2178045215671961507"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3656823471025403582"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/saving-skp-s-from-chromium/skdebugger2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2178045215671961507"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2178045215671961507"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2178045215671961507"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2178045215671961507"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6591999753781580436"},"published":{"$t":"2013-05-28T21:44:46.693Z"},"updated":{"$t":"2013-05-28T21:44:46.703Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T21:44:46.693Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"picture.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6591999753781580436"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3656823471025403582"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/saving-skp-s-from-chromium/picture.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6591999753781580436"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6591999753781580436"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6591999753781580436"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6591999753781580436"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2345962309556703081"},"published":{"$t":"2013-05-28T21:43:15.699Z"},"updated":{"$t":"2013-05-28T21:43:15.708Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T21:43:15.699Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"checkboxes.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2345962309556703081"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3656823471025403582"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/saving-skp-s-from-chromium/checkboxes.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2345962309556703081"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2345962309556703081"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2345962309556703081"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2345962309556703081"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6203112418043935765"},"published":{"$t":"2013-05-28T21:42:43.123Z"},"updated":{"$t":"2013-05-28T21:42:43.129Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T21:42:43.123Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"skpsite.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6203112418043935765"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3656823471025403582"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/saving-skp-s-from-chromium/skpsite.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6203112418043935765"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6203112418043935765"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6203112418043935765"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6203112418043935765"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1344205680534243018"},"published":{"$t":"2013-05-28T21:42:16.649Z"},"updated":{"$t":"2013-05-28T21:42:16.658Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T21:42:16.649Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"smallabouttracing.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1344205680534243018"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3656823471025403582"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/saving-skp-s-from-chromium/smallabouttracing.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1344205680534243018"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1344205680534243018"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1344205680534243018"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1344205680534243018"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1058575957135091302"},"published":{"$t":"2013-05-28T21:00:29.204Z"},"updated":{"$t":"2013-05-28T21:00:29.210Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T21:00:29.204Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"trace3.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1058575957135091302"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/trace3.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1058575957135091302"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1058575957135091302"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1058575957135091302"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1058575957135091302"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8680052808887288285"},"published":{"$t":"2013-05-28T20:56:02.594Z"},"updated":{"$t":"2013-05-28T20:56:02.603Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T20:56:02.594Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"3dtracing2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8680052808887288285"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/3dtracing2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8680052808887288285"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8680052808887288285"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8680052808887288285"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8680052808887288285"}],"author":[{"name":{"$t":"Philip Rogers"},"email":{"$t":"pdr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8664974047168368611"},"published":{"$t":"2013-05-01T13:40:26.017Z"},"updated":{"$t":"2013-05-28T07:57:16.817Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-28T07:57:13.969Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Retrieving Crash Reports on iOS"},"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\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-1\"\u003e\u003cp\u003eContents\u003c/p\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Syncing-with-iTunes\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eSyncing with iTunes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Emailing-from-a-device\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eEmailing from a device\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Using-the-Xcode-Organizer\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eUsing the Xcode Organizer\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThere are multiple ways to retrieve crash reports from an iOS device.  They are listed below from (roughly) easiest to hardest.  Please use whichever method works best for you.\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Syncing-with-iTunes\" /\u003eSyncing with iTunes\u003c/h2\u003e\r\nThis method involves syncing your device with iTunes.  After syncing, crash reports will be copied to a specific location on your hard drive.  This method is also documented at \u003ca href\u003d\"https://developer.apple.com/library/ios/#qa/qa1747/_index.html\" rel\u003d\"nofollow\"\u003ehttps://developer.apple.com/library/ios/#qa/qa1747/_index.html\u003c/a\u003e.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003eSync your device with iTunes on your desktop.\u003c/li\u003e\r\n\u003cli\u003eA\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003efter syncing, look for crash logs in the correct directory.  See below for a list of directories for each operating system.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIn this directory, look for files starting with \"\u003cfont face\u003d\"courier new, monospace\"\u003eChrome_\u003c/font\u003e\".\u003c/span\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e(NOTE FOR MAC USERS: \u003cfont face\u003d\"courier new, monospace\"\u003e~/Library\u003c/font\u003e is hidden by default on Mac OS X.  To easily get this folder, open the Finder application, then hold the \"option\" key while clicking on the \"Go\" menu.  You should see a menu item for \"Library.\"  Click on that, then continue navigating to Logs, CrashReporter, etc.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003cdiv\u003e\r\n\u003ctable border\u003d\"0\" cellpadding\u003d\"5\" cellspacing\u003d\"0\" style\u003d\"font-family:Lucida Grande,Lucida Sans Unicode,Helvetica,Arial,Verdana,sans-serif;font-size:10pt;margin-bottom:4em;border-top-width:1px;border-top-style:solid;border-top-color:rgb(155,179,205);border-left-width:1px;border-left-style:solid;border-left-color:rgb(155,179,205)\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003cth style\u003d\"font-weight:400;padding:0.3em 0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0.33em;font-weight:700\"\u003e\u003cbr /\u003e\r\nOperating System\u003c/p\u003e\r\n\u003c/th\u003e\r\n\u003cth style\u003d\"font-weight:400;padding:0.3em 0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0.33em;font-weight:700\"\u003eLocation\u003c/p\u003e\r\n\u003c/th\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;padding:0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eMac OS X:\u003c/p\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;padding:0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e~/Library/Logs/CrashReporter/MobileDevice/\u0026lt;DEVICE_NAME\u0026gt;\u003c/font\u003e\u003c/p\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;padding:0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWindows XP\u003c/p\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;padding:0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eC:\\Documents and Settings\\\u0026lt;USERNAME\u0026gt;\\Application Data\\Apple Computer\\Logs\\CrashReporter\\MobileDevice\\\u0026lt;DEVICE_NAME\u0026gt;\u003c/font\u003e\u003c/p\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;padding:0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWindows Vista or 7\u003c/p\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"vertical-align:middle;padding:0.667em;border-bottom-width:1px;border-bottom-style:solid;border-bottom-color:rgb(155,179,205);border-right-width:1px;border-right-style:solid;border-right-color:rgb(155,179,205)\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eC:\\Users\\\u0026lt;USERNAME\u0026gt;\\AppData\\Roaming\\Apple Computer\\Logs\\CrashReporter\\MobileDevice\\\u0026lt;DEVICE_NAME\u0026gt;\u003c/font\u003e\u003c/p\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\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Emailing-from-a-device\" /\u003eEmailing from a device\u003c/h2\u003e\r\n\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eStart by opening up the Settings app.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003eNavigate to General -\u0026gt; About -\u0026gt; Diagnostics \u0026amp; Usage -\u0026gt; Diagnostic \u0026amp; Usage Data.\u003c/li\u003e\r\n\u003cli\u003eSelect a Chrome crash from the list. This will start with “\u003cfont face\u003d\"courier new, monospace\"\u003eChrome_\u003c/font\u003e” and contain the timestamp of the crash.\u003c/li\u003e\r\n\u003cli\u003eTap on the crash and you will see a text field with a crash log. Long press to Select All and then Copy the crash text.\u003c/li\u003e\r\n\u003cli\u003ePaste it into something you can get off of your device (for example, an email to yourself).\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Using-the-Xcode-Organizer\" /\u003eUsing the Xcode Organizer\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNOTE: This method will only work for iOS developers.  If you are not a developer, you will not have Xcode installed on your machine.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003eLaunch Xcode on your desktop machine.\u003c/li\u003e\r\n\u003cli\u003eOpen the Xcode Organizer window.  (Window menu -\u0026gt; Organizer, or Cmd-Shift-2.)\u003c/li\u003e\r\n\u003cli\u003eFind your device in the left sidebar, then select “device logs”.\u003c/li\u003e\r\n\u003cli\u003eChoose a Chrome crash (or multiple crashes) and select “Export” at the bottom of the Organizer window.  This will copy the crash reports to your hard drive.\u003c/li\u003e\r\n\u003c/ol\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/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/retrieving-crash-reports-on-ios"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8664974047168368611"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8664974047168368611"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8664974047168368611"}],"author":[{"name":{"$t":"Rohit Rao"},"email":{"$t":"rohitrao@chromium.org"}}],"sites$pageName":{"$t":"retrieving-crash-reports-on-ios"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7070732438031696847"},"published":{"$t":"2013-05-27T14:54:40.693Z"},"updated":{"$t":"2013-05-27T14:54:40.704Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-27T14:54:40.693Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"rendering design - ogres are like onions.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7070732438031696847"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20ogres%20are%20like%20onions.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7070732438031696847"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7070732438031696847"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7070732438031696847"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7070732438031696847"}],"author":[{"name":{"$t":"Ken Buchanan"},"email":{"$t":"kenrb@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7187865054498324421"},"published":{"$t":"2013-05-27T14:53:02.378Z"},"updated":{"$t":"2013-05-27T14:53:02.385Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-27T14:53:02.378Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"rendering design - compositor frame routing.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7187865054498324421"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20compositor%20frame%20routing.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7187865054498324421"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7187865054498324421"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7187865054498324421"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7187865054498324421"}],"author":[{"name":{"$t":"Ken Buchanan"},"email":{"$t":"kenrb@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7772526740172048309"},"published":{"$t":"2013-05-27T14:50:42.368Z"},"updated":{"$t":"2013-05-27T14:50:42.373Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-27T14:50:42.368Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"rendering design - texture routing.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7772526740172048309"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20texture%20routing.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7772526740172048309"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7772526740172048309"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7772526740172048309"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7772526740172048309"}],"author":[{"name":{"$t":"Ken Buchanan"},"email":{"$t":"kenrb@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8587040172957139616"},"published":{"$t":"2013-05-27T14:46:12.418Z"},"updated":{"$t":"2013-05-27T14:47:24.574Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-27T14:47:24.565Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"rendering design - rendering trees.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8587040172957139616"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/rendering%20design%20-%20rendering%20trees.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8587040172957139616"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8587040172957139616"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8587040172957139616"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8587040172957139616"}],"author":[{"name":{"$t":"Ken Buchanan"},"email":{"$t":"kenrb@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8187774420967282383"},"published":{"$t":"2013-05-27T14:45:38.662Z"},"updated":{"$t":"2013-05-27T14:45:38.667Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-27T14:45:38.662Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Design Doc- Rendering and compositing out-of-process iframes.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8187774420967282383"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000056619549402598"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/oop-iframes-rendering/Design%20Doc-%20Rendering%20and%20compositing%20out-of-process%20iframes.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8187774420967282383"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8187774420967282383"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8187774420967282383"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8187774420967282383"}],"author":[{"name":{"$t":"Ken Buchanan"},"email":{"$t":"kenrb@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7082657209734969748"},"published":{"$t":"2013-05-16T03:03:21.305Z"},"updated":{"$t":"2013-05-16T03:03:21.311Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-16T03:03:21.305Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"1Zh85u4gzhhDkC6myiRAyO2SH1iRgCCbUoJ4O.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7082657209734969748"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1025202733608700098"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/using-requestautocomplete/1Zh85u4gzhhDkC6myiRAyO2SH1iRgCCbUoJ4O.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7082657209734969748"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7082657209734969748"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7082657209734969748"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7082657209734969748"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1679676908820004608"},"published":{"$t":"2013-05-16T03:02:48.846Z"},"updated":{"$t":"2013-05-16T03:02:50.191Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-16T03:02:48.846Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"1bViPA1pF_5p0g5UaRwdhWedLTrTjXkcszqV3.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1679676908820004608"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1025202733608700098"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/using-requestautocomplete/1bViPA1pF_5p0g5UaRwdhWedLTrTjXkcszqV3.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1679676908820004608"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1679676908820004608"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1679676908820004608"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1679676908820004608"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6236407784318942046"},"published":{"$t":"2013-05-16T03:02:02.390Z"},"updated":{"$t":"2013-05-16T03:02:02.396Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-16T03:02:02.390Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"1m438-F2ObI9EqH66C94s_A6pzh5nN7Komyde.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6236407784318942046"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1025202733608700098"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/using-requestautocomplete/1m438-F2ObI9EqH66C94s_A6pzh5nN7Komyde.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6236407784318942046"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6236407784318942046"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6236407784318942046"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6236407784318942046"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5938994614771773101"},"published":{"$t":"2013-05-16T03:01:40.701Z"},"updated":{"$t":"2013-05-16T03:01:40.705Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-16T03:01:40.701Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"1LjbbxAJEBfpWRufhVtrUxNAB_WgavjqvfgpL.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5938994614771773101"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1025202733608700098"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/using-requestautocomplete/1LjbbxAJEBfpWRufhVtrUxNAB_WgavjqvfgpL.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5938994614771773101"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5938994614771773101"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5938994614771773101"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5938994614771773101"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3443725574767880072"},"published":{"$t":"2011-03-18T18:37:45.853Z"},"updated":{"$t":"2013-05-08T21:33:39.416Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-08T21:33:36.998Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Extension Documentation 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\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-you-can-contribute-to-the-doc\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eHow you can contribute to the doc\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview-of-the-doc-system\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eOverview of the doc system\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003eIf you're interested in contributing to the developer docs for extensions (or you're just curious how it works), you've found the right place.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-How-you-can-contribute-to-the-doc\" /\u003eHow you can contribute to the doc\u003c/h2\u003e\u003cdiv\u003eYou can help improve the extension docs for Google Chrome in a couple of ways:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://crbug.com/\" target\u003d\"_blank\"\u003eFile a bug\u003c/a\u003e about each doc mistake/omission/improvement\u003c/li\u003e\u003cul\u003e\u003cli\u003eIf possible, tell us the exact text you'd like to see\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eFix the doc yourself\u003c/li\u003e\u003cul\u003e\u003cli\u003eSee \u003ca href\u003d\"http://www.chromium.org/developers/contributing-code\" style\u003d\"color:rgb(0,102,204)!important\"\u003eContributing Code\u003c/a\u003e for general rules\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eNote that pages could take months to show up in the default doc. To get around this, someone needs to merge your changes into the various branches.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview-of-the-doc-system\" /\u003eOverview of the doc system\u003c/h2\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eAlthough the doc appears to be on code.google.com, it isn't. It's really in the Chromium project and served up by an AppEngine app. To modify the doc, you need to build it.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor details on where doc content comes from (from the server's point of view), see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/docs/how-docs-are-served\"\u003eHow Extension Docs Are Served\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/1413957628261797388"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/docs"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3443725574767880072"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3443725574767880072"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3443725574767880072"}],"author":[{}],"sites$pageName":{"$t":"docs"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"Xil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8992477738053034276"},"published":{"$t":"2008-08-30T18:46:22.021Z"},"updated":{"$t":"2013-05-08T09:10:59.060Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-17T19:37:52.333Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How Chromium Displays Web Pages"},"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 \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\n This document describes how web pages are displayed in Chromium from the bottom up. Be sure you have read the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-architecture\"\u003emulti-process architecture\u003c/a\u003e design document. You will especially want to understand the block diagram of major components. You may also be interested in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-resource-loading\"\u003emulti-process resource loading\u003c/a\u003e for how pages are fetched from the network.\r\n \u003c/p\u003e\r\n \r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Conceptual-application-layers\" /\u003eConceptual application layers\u003c/h2\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\"\u003e\u003cdiv /\u003e\u003cdiv style\u003d\"display:block;text-align:center;margin-right:auto;margin-left:auto\"\u003e\u003ca href\u003d\"https://docs.google.com/drawings/pub?id\u003d1gdSTfvLxbJDbX8oiWo5LTwAmXmdMQvjoUhYEhfhj0-k\u0026amp;w\u003d473\u0026amp;h\u003d204\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://docs.google.com/drawings/pub?id\u003d1gdSTfvLxbJDbX8oiWo5LTwAmXmdMQvjoUhYEhfhj0-k\u0026amp;w\u003d473\u0026amp;h\u003d211\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:center;margin-right:auto;margin-left:auto\"\u003e\u003cfont size\u003d\"1\"\u003e(The original Google Doc for this illustration is http://goo.gl/MsEJX which is open for editing by any @chromium.org)\u003c/font\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEach box represents a conceptual application layer. No layer should have knowledge of or dependencies on any higher-level layers.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003eWebKit:\u003c/b\u003e Rendering engine shared between Safari, Chromium, and all other WebKit-based browsers. The \u003cb\u003ePort\u003c/b\u003e is a part of WebKit that integrates with platform dependent system services such as resource loading and graphics.\u003c/li\u003e\u003cli\u003e\u003cb\u003eGlue:\u003c/b\u003e Converts WebKit types to Chromium types. This is our \"WebKit embedding layer.\" It is the basis of two browsers, Chromium, and test_shell (which allows us to test WebKit).\u003c/li\u003e\u003cli\u003e\u003cb\u003eRenderer / Render host: \u003c/b\u003eThis is Chromium's \"multi-process embedding layer.\" It proxies notifications and commands across the process boundary.\u003c/li\u003e\u003cli\u003e\u003cb\u003eWebContents: \u003c/b\u003eA reusable component that is the main class of the Content module. It's easily embeddable to allow multiprocess rendering of HTML into a view. See the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/content-module\"\u003econtent module pages\u003c/a\u003e for more information.\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"font-size:10pt\"\u003eBrowser:\u003c/b\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e Represents the browser window, it contains multiple WebContentses.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003eTab Helpers\u003c/b\u003e: Individual objects that can be attached to a WebContents (via the WebContentsUserData mixin). The Browser attaches an assortment of them to the WebContentses that it holds (one for favicons, one for infobars, etc).\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-WebKit\" /\u003eWebKit\u003c/h2\u003e\r\nWe use the \u003ca href\u003d\"http://webkit.org/\" rel\u003d\"nofollow\"\u003eWebKit\u003c/a\u003e open-source project to lay out web pages. This code is pulled from Apple and stored in the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e/third_party/WebKit\u003c/span\u003e directory. WebKit consists primarily of \"WebCore\" which represents the core layout functionality, and \"JavaScriptCore\" which runs JavaScript. We only run JavaScriptCore for testing purposes, normally we replace it with our high performance V8 JavaScript engine. We do not actually use the layer that Apple calls \"WebKit,\" which is the embedding API between WebCore and OS X applications such as Safari. We normally refer to the code from Apple generically as \"WebKit\" for convenience.\r\n\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-WebKit-port\" /\u003eThe WebKit port\u003c/h3\u003e\r\n\u003cp\u003eAt the lowest level we have our WebKit \"port.\" This is our implementation of required platform-specific functionality that interfaces with the platform-independent WebCore code. These files are located in the WebKit tree, typically in \u003cfont face\u003d\"'courier new', monospace\"\u003echromium\u003c/font\u003e directories or as Chromium-suffixed files. Much of our port is not actually OS-specific: you could think of it as the \"Chromium port\" of WebCore. Some parts, like font rendering, must be handled differently for each platform.\u003c/p\u003e\r\n\r\n\u003cul\u003e\r\n\u003cli\u003eNetwork traffic is handled by our \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-resource-loading\" style\u003d\"color:rgb(0,102,204);outline-style:none\"\u003emulti-process resource loading\u003c/a\u003e system rather than being handed off to the OS directly from the render process.\u003c/li\u003e\r\n\u003cli\u003eGraphics uses the Skia graphics library developed for Android. This is a cross-platform graphics library and handles all images and graphics primitives except for text. Skia is located in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e/\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003et\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ehird_party/skia\u003c/span\u003e. The main entrypoint for graphics operations is \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e/webkit/port/platform/graphics/GraphicsContextSkia.cpp\u003c/span\u003e. It uses many other files in the same directory as well as from \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e/base/gfx\u003c/span\u003e.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-The-WebKit-glue\" /\u003eThe WebKit glue\u003c/h3\u003e\r\n\r\nThe Chromium application uses different types, coding styles, and code layout than the third-party WebKit code. The WebKit \"glue\" provides a more convenient embedding API for WebKit using Google coding conventions and types (for example, we use std::string instead of \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebCore::String\u003c/span\u003e and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eGURL\u003c/span\u003e instead of \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eKURL\u003c/span\u003e). The glue code is located in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e/webkit/glue\u003c/span\u003e. The glue objects are typically named similar to the WebKit objects, but with \"Web\" at the beginning. For example, \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebCore::Frame\u003c/span\u003e becomes \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebFrame\u003c/span\u003e.\r\n\r\n\r\n\u003cp\u003eThe WebKit \"glue\" layer insulates the rest of the Chromium code base from WebCore data types to help minimize the impact of WebCore changes on the Chromium code base. As such, WebCore data types are never used directly by Chromium. APIs are added to the WebKit \"glue\" for the benefit of Chromium when it needs to poke at some WebCore object.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe \"test shell\" application is a bare-bones web browser for testing our WebKit port and glue code. It uses the same glue interface for communicating with WebKit as Chromium does. It provides a simpler way for developers to test new code without having many complicated browser features, threads, and processes. This application is also used to run the automated WebKit tests. However, the downside of the \"test shell\" is that it doesn't exercise WebKit as Chromium does, in a multi-process way. The content module is embedded in an application called \"content shell\" which will soon be running the tests instead.\u003c/p\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-The-render-process\" /\u003eThe render process\u003c/h2\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/displaying-a-web-page-in-chrome/rendering%20renderer2.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\" /\u003e\u003cdiv style\u003d\"text-align:center;display:block\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/displaying-a-web-page-in-chrome/rendering%20renderer2.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/displaying-a-web-page-in-chrome/Renderingintherenderer-v2.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1342584100941/developers/design-documents/displaying-a-web-page-in-chrome/Renderingintherenderer-v2.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:left;display:block;margin-right:auto;margin-left:auto\"\u003eChromium's render process embeds our WebKit port using the glue interface. It does not contain very much code: its job is primarily to be the renderer side of the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/inter-process-communication\"\u003eIPC\u003c/a\u003e channel to the browser..\u003c/div\u003e\r\n\r\n\u003cp\u003eThe most important class in the renderer is the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e, located in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e/content/renderer/render_view_impl.cc\u003c/span\u003e. This object represents a web page. It handles all navigation-related commands to and from the browser process. It derives from \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget\u003c/span\u003e which provides painting and input event handling. The \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e communicates with the browser process via the global (per render process) \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcess\u003c/span\u003e object.\u003c/p\u003e\r\n\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eFAQ: \u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eWhat's the difference between RenderWidget and RenderView?\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-style:italic\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new\"\u003eRenderWidget\u003c/span\u003e maps to one \u003cspan style\u003d\"font-family:courier new\"\u003eWebCore::Widget\u003c/span\u003e object by implementing the abstract interface in the glue layer called \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebWidgetDelegate\u003c/span\u003e.. This is basically a Window on the screen that receives input events and that we paint into. A \u003cspan style\u003d\"font-family:courier new\"\u003eRenderView\u003c/span\u003e inherits from \u003cspan style\u003d\"font-family:courier new\"\u003eRenderWidget\u003c/span\u003e and is the contents of a tab or popup Window. It handles navigational commands in addition to the painting and input events of the widget. There is only one case where a \u003cspan style\u003d\"font-family:courier new\"\u003eRenderWidget\u003c/span\u003e exists without a \u003cspan style\u003d\"font-family:courier new\"\u003eRenderView\u003c/span\u003e, and that's for select boxes on the web page. These are the boxes with the down arrows that pop up a list of options. The select boxes must be rendered using a native window so that they can appear above everything else, and pop out of the frame if necessary. These windows need to paint and receive input, but there isn't a separate \"web page\" (\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e) for them.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Threads-in-the-renderer\" /\u003eThreads in the renderer\u003c/h3\u003e\r\nEach renderer has two threads (see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-architecture\" style\u003d\"outline-style:none;color:rgb(85,26,139)\"\u003emulti-process architecture\u003c/a\u003e page for a diagram, or \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/threading\"\u003ethreading in Chromium\u003c/a\u003e for how to program with them). The render thread is where the main objects such as the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e and all WebKit code run. When it communicates to the browser, messages are first sent to the main thread, which in turn dispatches the message to the browser process. Among other things, this allows us to send messages synchronously from the renderer to the browser. This happens for a small set of operations where a result from the browser is required to continue. An example is getting the cookies for a page when requested by JavaScript. The renderer thread will block, and the main thread will queue all messages that are received until the correct response is found. Any messages received in the meantime are subsequently posted to the renderer thread for normal processing.\u003cbr /\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-The-browser-process\" /\u003eThe browser process\u003c/h2\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/displaying-a-web-page-in-chrome/rendering%20browser.png?attredirects\u003d0\" style\u003d\"border-width:0px;background-color:transparent\"\u003e\u003cimg src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1220197831473/developers/design-documents/displaying-a-web-page-in-chrome/rendering%20browser.png\" style\u003d\"border-width:0px\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Low-level-browser-process-objects\" /\u003eLow-level browser process objects\u003c/h3\u003e\r\n\u003cp\u003eAll \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/inter-process-communication\" style\u003d\"outline-style:none;color:rgb(85,26,139)\"\u003eIPC\u003c/a\u003e communication with the render processes is done on the I/O thread of the browser. This thread also handles all \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/multi-process-resource-loading\"\u003enetwork communication\u003c/a\u003e which keeps it from interfering with the user interface.\u003c/p\u003e\r\n\r\n\u003cp\u003eWhen a \u003cspan style\u003d\"font-family:courier new\"\u003eRenderProcessHost\u003c/span\u003e is initialized on the main thread (where the user interface runs), it creates the new renderer process and a \u003cspan style\u003d\"font-family:courier new\"\u003eChannelProxy\u003c/span\u003e \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/inter-process-communication\" style\u003d\"outline-style:none;color:rgb(85,26,139)\"\u003eIPC\u003c/a\u003e object with a named pipe to the renderer. This object runs on the I/O thread of the browser, listening to the named pipe to the renderer, and automatically forwards all messages back to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcessHost\u003c/span\u003e on the UI thread. A \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eResourceMessageFilter\u003c/span\u003e will be installed in this channel which will filter out certain messages that can be handled directly on the I/O thread such as network requests. This filtering happens in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eResourceMessageFilter::OnMessageReceived\u003c/span\u003e.\u003c/p\u003e\r\n\r\n\u003cp\u003eThe \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcessHost\u003c/span\u003e on the UI thread is responsible for dispatching all view-specific messages to the appropriate \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderViewHost\u003c/span\u003e (it handles a limited number of non-view-specific messages itself). This dispatching happens in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcessHost::OnMessageReceived\u003c/span\u003e.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-High-level-browser-process-objects\" /\u003eHigh-level browser process objects\u003c/h3\u003e\r\n\u003cp\u003eView-specific messages come into \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderViewHost::OnMessageReceived\u003c/span\u003e. Most of the messages are handled here, and the rest get forwarded to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost\u003c/span\u003e base class. These two objects map to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e and the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget\u003c/span\u003e in the renderer (see \"The Render Process\" above for what these mean). Each platform has a view class (\u003cfont face\u003d\"courier new, monospace\"\u003eRenderWidgetHostView[Aura|Gtk|Mac|Win]\u003c/font\u003e) to implement integration into the native view system.\u003c/p\u003e\r\n\u003cp\u003eAbove the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003cspan style\u003d\"font-family:Arial\"\u003e/\u003c/span\u003eWidget\u003c/span\u003e is the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebContents\u003c/span\u003e object, and most of the messages actually end up as function calls on that object. A \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebContents\u003c/span\u003e represents the contents of a webpage. It is the top-level object in the content module, and has the responsibility of displaying a web page in a rectangular view. See the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/content-module\"\u003econtent module pages\u003c/a\u003e for more information.\u003c/p\u003e\u003cp\u003eThe \u003cfont face\u003d\"courier new, monospace\"\u003eWebContents\u003c/font\u003e object is contained in a \u003cfont face\u003d\"courier new, monospace\"\u003eTabContentsWrapper\u003c/font\u003e. That is in \u003cfont face\u003d\"courier new, monospace\"\u003echrome/\u003c/font\u003e and is responsible for a tab.\u003c/p\u003e\u003cp\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eIllustrative examples\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\r\nAdditional examples covering navigation and startup are in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/getting-around-the-chrome-source-code\"\u003eGetting Around the Chromium Source Code\u003c/a\u003e.\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Life-of-a-set-cursor-message\" /\u003eLife of a \"set cursor\" message\u003c/h3\u003e\r\nSetting the cursor is an example of a typical message that is sent from the renderer to the browser. In the renderer, here is what happens.\u003cbr /\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eSet cursor messages are generated by WebKit internally, typically in response to an input event. The set cursor message will start out in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget::SetCursor\u003c/span\u003e in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003econtent/renderer/render_widget.cc\u003c/span\u003e.\u003c/li\u003e\r\n\u003cli\u003eIt will call \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget::Send\u003c/span\u003e to dispatch the message. This method is also used by \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e to send messages to the browser. It will call \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderThread::Send\u003c/span\u003e\u003cspan\u003e.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003eThis will call the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::SyncChannel\u003c/span\u003e which will internally proxy the message to the main thread of the renderer and post it to the named pipe for sending to the browser.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003eThen the browser takes control:\u003c/p\u003e\r\n\u003cul\u003e\r\n\u003cli\u003eThe \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::ChannelProxy\u003c/span\u003e in the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcessHost\u003c/span\u003e receives all message on the I/O thread of the browser. It first sends them through the \u003cspan style\u003d\"font-family:courier new\"\u003eResourceMessageFilter\u003c/span\u003e that dispatches network requests and related messages directly on the I/O thread. Since our message is not filtered out, it continues on to the UI thread of the browser (the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::ChannelProxy\u003c/span\u003e does this internally).\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcessHost::OnMessageReceived\u003c/span\u003e in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003econtent/browser/renderer_host/render_process_host_impl.cc\u003c/span\u003e gets the messages for all views in the corresponding render process. It handles several types of messages directly, and for the rest forwards to the appropriate \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderViewHost\u003c/span\u003e corresponding to the source \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView\u003c/span\u003e that sent the message.\u003c/li\u003e\r\n\u003cli\u003eThe message arrives at \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderViewHost::OnMessageReceived\u003c/span\u003e in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003econtent/browser/renderer_host/render_view_host_impl.cc\u003c/span\u003e. Many messages are handled here, but ours is not because it's a message sent from the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget\u003c/span\u003e and handled by the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost\u003c/span\u003e.\u003c/li\u003e\r\n\u003cli\u003eAll unhandled messages in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderViewHost\u003c/span\u003e are automatically forwarded to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost\u003c/span\u003e, including our set cursor message.\u003c/li\u003e\r\n\u003cli\u003eThe message map in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003econtent/browser/renderer_host/render_view_host_impl.cc\u003c/span\u003e finally receives the message in \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost::OnMsgSetCursor\u003c/span\u003e and calls the appropriate UI function to set the mouse cursor.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Life-of-a-mouse-click-message\" /\u003eLife of a \"mouse click\" message\u003c/h3\u003e\r\n\u003cp\u003eSending a mouse click is a typical example of a message going from the browser to the renderer.\u003c/p\u003e\r\n\r\n\u003cul\u003e\r\n\u003cli\u003eThe Windows message is received on the UI thread of the browser by \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHostViewWin::OnMouseEvent\u003c/span\u003e which then calls \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eForwardMouseEventToRenderer\u003c/span\u003e in the same class.\u003c/li\u003e\r\n\u003cli\u003eThe forwarder function packages the input event into a cross-platform \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebMouseEvent\u003c/span\u003e and ends up sending it to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost\u003c/span\u003e it is associated with.\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost::ForwardInputEvent\u003c/span\u003e creates an IPC message \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eViewMsg_HandleInputEvent\u003c/span\u003e, serializes the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebInputEvent\u003c/span\u003e to it, and calls \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidgetHost::Send\u003c/span\u003e.\u003c/li\u003e\r\n\u003cli\u003eThis just forwards to the owning \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderProcessHost::Send\u003c/span\u003e function, which in turn gives the message to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::ChannelProxy\u003c/span\u003e.\u003c/li\u003e\r\n\u003cli\u003eInternally, the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::ChannelProxy\u003c/span\u003e will proxy the message to the I/O thread of the browser and write it to the named pipe of the corresponding renderer.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp\u003eNote that many other types of messages are created in the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebContents\u003c/span\u003e, especially navigational ones. These follow a similar path from the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebContents\u003c/span\u003e to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderViewHost\u003c/span\u003e.\u003c/p\u003e\r\n\r\n\u003cp\u003eThen the renderer takes control:\u003c/p\u003e\r\n\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::Channel\u003c/span\u003e on the main thread of the renderer reads the message sent by the browser, and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eIPC::ChannelProxy\u003c/span\u003e proxies to the renderer thread.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderView::OnMessageReceived\u003c/span\u003e gets the message. Many types messages are handled here directly. Since the click message is not, it falls through (with all other unhandled messages) to \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRenderWidget::OnMessageReceived\u003c/span\u003e which in turn forwards it to \u003cspan style\u003d\"font-family:courier new\"\u003eRenderWidget::OnHandleInputEvent\u003c/span\u003e.\u003c/li\u003e\u003cli\u003eThe input event is given to \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebWidgetImpl::HandleInputEvent\u003c/span\u003e where it is converted to a WebKit \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ePlatformMouseEvent\u003c/span\u003e class and given to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWebCore::Widget\u003c/span\u003e class inside WebKit.\u003c/li\u003e\u003c/ul\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/displaying-a-web-page-in-chrome"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8992477738053034276"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8992477738053034276"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8992477738053034276"}],"author":[{"name":{"$t":"Mike Jeffrey"},"email":{"$t":"mjeffrey@google.com"}}],"sites$pageName":{"$t":"displaying-a-web-page-in-chrome"},"sites$revision":{"$t":"27"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/969660262670796398"},"published":{"$t":"2011-04-01T18:44:00.248Z"},"updated":{"$t":"2013-05-02T18:25:19.272Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T18:25:17.536Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"F-Script Anywhere"},"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\"\u003eF-Script Anywhere turns any Mac app into a smalltalk-y environment: You're able to click on any view to learn its type, and you can send messages to every object in the program at run time. It's very useful to get around in Chrome: If you're wondering which piece of code is responsible for the findbar, you'd just click the findbar and get the name of the class that implements it. Put that in \u003ca href\u003d\"http://cs.chromium.org\"\u003ehttp://cs.chromium.org\u003c/a\u003e, and you're done. This page explains how to install and use F-Script Anywhere.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Installing-F-Script-Anywhere\" /\u003eInstalling F-Script Anywhere\u003c/h3\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eDownload \u003ca href\u003d\"http://www.fscript.org/download/F-ScriptInjectionService.zip\" rel\u003d\"nofollow\"\u003ehttp://www.fscript.org/download/F-ScriptInjectionService.zip\u003c/a\u003e and follow the instructions in the included readme.txt.\u003c/li\u003e\u003cli\u003eMake sure you also downloaded FScript.Framework (as described in the aforementioned readme.txt!)\u003c/li\u003e\u003cli\u003eIf you run OSX 10.8 or later, you need to fix up the automator workflow. Edit the injection service with Automator, and make sure the \"New Text File\" action generates plain text. Also, ensure that the following AppleScript refers to /tmp/gdbtemp\u003cb\u003e\u003ci\u003e\u003cfont size\u003d\"3\"\u003e.txt\u003c/font\u003e\u003c/i\u003e\u003c/b\u003e - \"New Text File\" now enforces an extension.\u003c/li\u003e\u003c/ol\u003eSee \u003ca href\u003d\"http://pmougin.wordpress.com/2010/01/05/the-revenge-of-f-script-anywhere/\" rel\u003d\"nofollow\"\u003ehttp://pmougin.wordpress.com/2010/01/05/the-revenge-of-f-script-anywhere/\u003c/a\u003e for more information.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Using-F-Script-Anywhere\" /\u003eUsing F-Script Anywhere\u003c/h3\u003e\u003cdiv\u003eClick \"Chrome-\u0026gt;Services-\u0026gt;Inject F-Script into application\". \u003cb\u003eNote\u003c/b\u003e: This won't work for programs that are running in gdb (e.g. it won't work in Chromium if you started it through Xcode).\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.52.02%20AM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1301684014834/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.52.02%20AM.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003eThis will take about 15 seconds in Release builds and several minutes in Debug builds. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAlternatively, you could do it right from gdb (the Service is an Automator script that runs gdb for you, and there are several Automator scripts floating around, some of them don't work):\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt;gdb --args ./out/Release/Chromium.app/Contents/MacOS/Chromium (or wherever it is)\u003c/div\u003e\u003cdiv\u003e(gdb) r\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e.....\u003c/div\u003e\u003cdiv\u003e\u0026lt;Ctrl-C\u0026gt;\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e(gdb) p (char)[[NSBundle bundleWithPath:@\"/Library/Frameworks/FScript.framework\"] load]\u003c/div\u003e\u003cdiv\u003e(gdb) p (void)[FScriptMenuItem insertInMainMenu]\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e(gdb) c\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen it's done, an \"F-Script\" menu entry will appear in the top level menu:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.57.03%20AM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1301684390932/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.57.03%20AM.png\" /\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\"\u003eClick \"Open Object Browser\". In the window that opens, click \"Select View\". Say you're wondering which class implements the Omnibox, so click the Omnibox next. F-Script Anywhere will tell you that the Omnibox is an AutocompleteTextField.\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\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%204.27.30%20PM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1301700487127/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%204.27.30%20PM.png\" /\u003e\u003c/a\u003e\u003c/div\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\"\u003eYou can even send methods to this object: Type \"sethid\" into the search box in the upper right corner, and then click \"setHidden:\" on the right:\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\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.59.12%20AM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1301684546648/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.59.12%20AM.png\" /\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\"\u003eType \"YES\" into the popup that opens, and the Omnibox will disappear:\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\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.59.21%20AM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1301684583957/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%2011.59.21%20AM.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003eYou can also navigate to a view's superview this way, and do many other fun things. Read the F-Script documentation for more. F-Script Anywhere works with every OS X app, not just with Chrome.\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/f-script-anywhere"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/969660262670796398"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/969660262670796398"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/969660262670796398"}],"author":[{"name":{"$t":"Nico Weber"},"email":{"$t":"thakis@chromium.org"}}],"sites$pageName":{"$t":"f-script-anywhere"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8214654042245335743"},"published":{"$t":"2013-04-05T15:15:05.523Z"},"updated":{"$t":"2013-05-02T14:50:15.528Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T14:50:12.229Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Making Chrome Independent of 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\u003ch2\u003e\u003ca name\u003d\"TOC-The-goal-of-this-work-is-to-make-the-core-Chrome-browser-code-independent-of-extensions.-Direct-callsites-of-extensions-code-from-non-extensions-code-would-be-replaced-by-adding-observer-style-interfaces-onto-the-non-extensions-code-and-or-abstracting-the-\" /\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe goal of this work is to make the core Chrome browser code independent of extensions. Direct callsites of extensions code from non-extensions code would be replaced by adding observer-style interfaces onto the non-extensions code and/or abstracting the functionality that extensions provides non-extensions code into delegate interfaces as appropriate. In addition to the general desire for \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/browser-components\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ecomponentization\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 of \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1hSwqniJVtk3he1fTl_PW422_48F7ZRQUpXLDPqCmRgk/edit\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eextensions\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, the concrete motivation for the work is the challenges\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e that Chrome for iOS would face in adopting/extending the Chrome for Android solution to extensions (i.e., build enough extensions-related code that the linker is satisfied).\u003c/span\u003e\u003c/b\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis work is complementary to the \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1hSwqniJVtk3he1fTl_PW422_48F7ZRQUpXLDPqCmRgk/edit\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ework\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 currently underway to reduce the dependence of extensions on Chrome. There may be cases where this work is blocked by that work, but there is also much that can be done toward this goal in parallel with that complementary work. The components team (most notably, yoz@ and joi@) have been involved in discussions on this work and are in agreement both on tackling the problem and on the basic approach.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Approach\" /\u003eApproach\u003c/h2\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003col\u003e\u003cli\u003e\u003cb style\u003d\"line-height:normal;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTake a given class Foo outside of extensions that directly uses extensions-related code.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"line-height:normal;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd observer and/or delegate interfaces to Foo that enable moving knowledge of extensions out of Foo. \u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"line-height:normal;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce Foo no longer knows anything about extensions, add a DEPS restriction such that knowledge of extensions cannot be added back to Foo. When a given directory is cleaned of extensions knowledge, this DEPS restriction can be generalized to the directory.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"line-height:normal;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGoto 1.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb style\u003d\"line-height:normal;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen all such knowledge is removed, remove the dependence on browser_extensions from the chrome_browser target.\u003c/span\u003e\u003c/b\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/b\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-FAQ\" /\u003eFAQ\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cb style\u003d\"font-size:15px;line-height:17px;white-space:pre-wrap;font-family:Arial\"\u003eSounds great; do you need help? \u003c/b\u003e\u003cspan style\u003d\"font-size:15px;line-height:17px;white-space:pre-wrap;font-family:Arial\"\u003eYes! Please contact blundell@ or stuartmorgan@ re: ways to get involved.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:17px;white-space:pre-wrap\"\u003eWhat will happen to the Chrome for Android solution for extensions? \u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAndroid developers (specifically, nileshagrawal@) have indicated that once this solution is complete Android would be happy to be moved to it; at that point the modifications that Android had to make to extensions code would be removed, and ENABLE_EXTENSIONS would serve to signify whether the browser_extensions target was built or not.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"line-height:1.15;margin-top:0pt;margin-bottom:0pt;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003eHas this proposal been vetted by Chromium eng leadership? \u003c/b\u003eYes; an earlier version of this proposal was developed in conjunction with yoz@ and joi@ from the components team, and the proposal in its current form is the result of going through the design review process with cpu@ and jam@.\u003c/span\u003e\u003c/p\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;line-height:17px;white-space:pre-wrap\"\u003e\u003cb\u003eHow can I follow along?\u003c/b\u003e \u003cb style\u003d\"font-family:Times;font-size:medium;line-height:normal;white-space:normal;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere is a \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d186422\" style\u003d\"text-decoration:none\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003etracking bug\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.\u003c/span\u003e\u003c/b\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cb style\u003d\"font-family:Times;font-size:medium;font-weight:normal\"\u003e\u003cdiv\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/div\u003e\u003cdiv\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/div\u003e\u003c/b\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/making-chrome-independent-of-extensions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8214654042245335743"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8214654042245335743"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8214654042245335743"}],"author":[{"name":{"$t":"Colin Blundell"},"email":{"$t":"blundell@chromium.org"}}],"sites$pageName":{"$t":"making-chrome-independent-of-extensions"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6394081625137093448"},"published":{"$t":"2009-11-23T19:34:16.506Z"},"updated":{"$t":"2013-05-02T04:10:23.725Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:10:23.725Z"},"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/6394081625137093448"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6394081625137093448"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6394081625137093448"}],"author":[{}],"sites$revision":{"$t":"10"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Acer AOP531h"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.acer.com/worldwide/ select location and go to \"Where to Buy\" page for a list of vendors "}]},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2510954874211790396"},"published":{"$t":"2009-11-23T19:25:57.268Z"},"updated":{"$t":"2013-05-02T04:10:16.749Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:10:16.749Z"},"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/2510954874211790396"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2510954874211790396"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2510954874211790396"}],"author":[{}],"sites$revision":{"$t":"10"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Acer AOD250"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.acer.com/worldwide/ select location and go to \"Where to Buy\" page for a list of vendors"}]},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9043402267252565343"},"published":{"$t":"2009-11-23T19:49:34.347Z"},"updated":{"$t":"2013-05-02T04:10:04.243Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:10:04.243Z"},"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/9043402267252565343"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9043402267252565343"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9043402267252565343"}],"author":[{}],"sites$revision":{"$t":"14"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Packard Bell DOTSR"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"Check attached file :ChromeOS Compatibility list-20091221-A.xlsx\" tab Packard Bell Store by region: France: http://packardbell.fr/shopping/store_locator.html "}]},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7718988047412493620"},"published":{"$t":"2009-11-23T19:47:52.312Z"},"updated":{"$t":"2013-05-02T04:09:58.017Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:09:58.016Z"},"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/7718988047412493620"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7718988047412493620"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7718988047412493620"}],"author":[{}],"sites$revision":{"$t":"17"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Packard Bell DOTS"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"Check attached file :ChromeOS Compatibility list-20091221-A.xlsx\" tab Packard Bell Store by region: France: http://packardbell.fr/shopping/store_locator.html "}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3655646412020163791"},"published":{"$t":"2009-11-23T19:30:21.002Z"},"updated":{"$t":"2013-05-02T04:09:51.960Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:09:51.959Z"},"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/3655646412020163791"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3655646412020163791"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3655646412020163791"}],"author":[{}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Acer AO531h"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.acer.com/worldwide/ select location and go to \"Where to Buy\" page for a list of vendors"}]},{"gd$etag":"\"USl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/72460943458134052"},"published":{"$t":"2009-11-23T19:39:42.025Z"},"updated":{"$t":"2013-05-02T04:09:46.382Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:09:46.382Z"},"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/72460943458134052"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/72460943458134052"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/72460943458134052"}],"author":[{}],"sites$revision":{"$t":"28"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Gatteway LT20"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"Check attached file :ChromeOS Compatibility list-20091221-A.xlsx\" tab Gateway Store by region: USA/Canada: http://www.gateway.com/retail/consumer.php?cmpid\u003dtopnav_shop Mexico: http://mx.gateway.com/products/stores.html "}]},{"gd$etag":"\"XSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4082978571182407196"},"published":{"$t":"2009-11-19T17:03:51.806Z"},"updated":{"$t":"2013-05-02T04:09:33.476Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-05-02T04:09:33.475Z"},"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/4082978571182407196"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4082978571182407196"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4082978571182407196"}],"author":[{}],"sites$revision":{"$t":"14"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Acer Aspire One AOD250-1165 10.1-Inch Blue Netbook"},{"index":"B","name":"Wifi","$t":"?"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"This unit may ship with Atheros (works) or Broadcom (does not work) wifi module, you can check Network Adapters under Device Manager in Windows, or FCC stickers."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.amazon.com/Acer-Aspire-AOD250-1165-10-1-Inch-Netbook/dp/B0023B138W"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/924743253795182224"},"published":{"$t":"2012-02-07T18:02:02.116Z"},"updated":{"$t":"2013-04-30T08:52:48.939Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-15T14:25:11.148Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging 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\u003cb style\u003d\"font-size:13px\"\u003e\u003cfont size\u003d\"4\"\u003eThe Basics\u003c/font\u003e\u003c/b\u003e\u003cbr style\u003d\"font-size:13px\" /\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eThe NaCl team is hard at work developing an integrated debugging solution(1). But before this feature is available, developers must resort to alternative debugging techniques. These techniques are described here (with reservation!)  First, Native Client applications can be debugged the old school way: with printf() and logging.  Second, to a limited degree, Native Client can be debugged with the host's GDB, but using normal GDB will have problems resolving addresses -- some manual tweaking needs to be done to map NaCl addresses into the global address space GDB is using.  Third, there are some experimental patches to customize GDB which enable various degrees of debugging untrusted code.\u003cbr /\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eFirst, we recommend debugging as much as possible compiled as a normal trusted plugin/executable outside of Native Client, which of course will allow full use of debuggers such as GDB, MSVC, and WinDebug. Native Client most resembles Linux, so using GCC and POSIX will be the closest match to the NaCl runtime environment.\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eFor untrusted Native Client applications, we again recommend debugging on a Linux based host, and launching a debug build of Chrome from a terminal window. A Native Client application can use printf() which will output messages to the terminal window from which Chrome was launched.\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eNative Client's Service Runtime can output debug messages to the terminal window. The level of detail in these logging messages can be controlled via the environment variable NACLVERBOSITY\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eFor example:\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in;font-family:courier new,monospace\"\u003e  developer@host:/home/developer/chrome/src/out/Debug$ export NACLVERBOSITY\u003d3\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in;font-family:courier new,monospace\"\u003e  developer@host:/home/developer/chrome/src/out/Debug$ ./chrome –enable-nacl\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eAdditional messages from the plug-in can be separately enabled via NACL_SRPC_DEBUG environment variable.\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eTo capture log output to file “outfile” use:\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in;font-family:courier new,monospace\"\u003e  developer@host:/home/developer/chrome/src/out/Debug$ ./chrome –enable-nacl \u0026amp;\u0026gt;outfile\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTo get logs in Windows, you must instead run chrome with the environment variable NACLLOG\u003d\u0026lt;absolute path to log file / path relative to chrome.exe\u0026gt;.  This requires running Chrome with the --no-sandbox flag.\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eGetting the output from the Native Client Program on Windows:\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOn Linux and OSX, the Native Cilent application inherits standard output and standard error from Chrome, so though cumbersome, printf-style debugging is feasible.  On Windows, like any non-console application, standard output and standard error outputs are thrown into the bit bucket.  To get the Native Client application's output on Windows, set the NACL_EXE_STDOUT and NACL_EXE_STDERR environment variables to be the absolute path to files, and then start Chrome with the --no-sandbox flag.  Output written to standard output and standard error will then be written to the specified files.\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003eGetting the Process ID (PID) of the Native Client Program from Chrome:\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"font-size:13px;margin-bottom:0in\"\u003eChrome -\u0026gt; Developer-\u0026gt;Task Manager, right-click process table header, toggle on \"Process ID\". The PID can be used to attach GDB to running Native Client processes.  Or click on a new tab and type \"about:memory\" into the URL address bar.\u003cbr /\u003e\u003c/p\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/5548930097806777862"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/924743253795182224"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/924743253795182224"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/924743253795182224"}],"author":[{}],"sites$pageName":{"$t":"debugging-documentation"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"UCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5831413661747281707"},"published":{"$t":"2009-04-30T16:56:11.743Z"},"updated":{"$t":"2013-04-29T20:52:58.729Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-01-13T22:29:40.035Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Tech Talks: Videos \u0026 Presentations"},"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\u003ch3\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"font-size:12px;font-weight:normal\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-2\" /\u003e\u003cspan style\u003d\"font-family:arial;font-weight:normal;font-size:medium\"\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\u003cdiv class\u003d\"sites-embed-object-title\" style\u003d\"display:none;\"\u003eTech Talks: Videos \u0026amp; Presentations\u003c/div\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-spreadsheet\"\u003e\u003ciframe src\u003d\"http://spreadsheets.google.com/spreadsheet/lv?chrome\u003dfalse\u0026amp;key\u003d0AmgYtG7DDgrxdFM3T3k1M05TQ09aaG1GVkpGa05VQ1E\u0026amp;output\u003dhtml\u0026amp;pubredirect\u003dtrue\u0026amp;widget\u003dtrue\" width\u003d\"100%\" height\u003d\"900\" title\u003d\"Tech Talks: Videos \u0026amp; Presentations\" frameborder\u003d\"0\" id\u003d\"110781549\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial;font-size:small\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\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/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5831413661747281707"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5831413661747281707"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5831413661747281707"}],"author":[{}],"sites$pageName":{"$t":"tech-talk-videos"},"sites$revision":{"$t":"19"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3151638900179319264"},"published":{"$t":"2013-01-16T22:17:16.280Z"},"updated":{"$t":"2013-04-23T22:47:37.012Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-23T22:47:35.452Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Desktop Notification 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;white-space:pre-wrap;background-color:transparent;font-size:10pt\"\u003eProposal Date\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eJanuary 2013.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eJustin DeWitt (dewittj)\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Verdana,sans-serif;margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe Extensions team will own the API, but the Notifications Frontend team will own the implementation (i.e., the actual desktop notification code) behind it.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThis API provides rich desktop notifications to Chrome apps and extensions.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eToday, Chrome implements an \u003ca href\u003d\"http://www.chromium.org/developers/design-documents/desktop-notifications/api-specification\"\u003eoutdated version of the W3C spec for HTML5 desktop notifications\u003c/a\u003e. The functionality proposed here is generally similar, but significantly more powerful. We have yet addressed the question whether this API will replace, enhance, or remain entirely independent of any Chrome implementation of the W3C spec.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eDesktop notifications provide a convenient, non-intrusive method of notifying users of events, particularly when those events originate from a background web app. Today, a web app has unsatisfactory options to notify a user of important information:\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\r\n\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eRaise a JavaScript alert, which might or might not bring a backgrounded window to the foreground. In the best case, where the user does see the alert, the result is text-only and modal.\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eChange the window title and hope that enough of the window (typically the tab) is prominent. An example is Gmail's \"Inbox (1)\" title, originally designed to exploit the real estate available on a background tab in a tabbed browser.\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eTry to play a sound.\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eDevelop and support a native notifier application that sits in the taskbar.\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent;font-size:10pt\"\u003eAn enumeration of specific use cases isn't needed. Today's web apps are likely to be one of many of a user's open browser tabs, only one of which is active at a time, any of which might have legitimate reasons to present urgent information to the user (new mail, new instant message, completion or failure of long-running process, scheduled reminders).\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eYes.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eYes.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWe expect many more notification layouts in the near future, as well as more structured data supporting those layouts. Our hope is to design a flexible API that will accommodate those changes without breaking the API or substantially altering its shape.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\r\n\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each other? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\r\nOur \"message center,\" which is the container that will display notifications, will intelligently manage the stream of notifications produced by API consumers. It will also give control to users in the form of per-app mute, a global on/off switch, and quiet hours. As no app or extension should be able to control these settings, they won't be part of the API.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWe'll separately mail out our message-center mocks. For purposes of this document, a notification area or taskbar item in the host OS will expand to display a rectangular message center. We don't expect the UI of Chrome proper to change.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eUsers can currently attribute a notification to a particular extension by right-clicking on it. This names the extension and gives the user the ability to disable notifications from the extension.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eIdle detection. Raise a notification and see whether the user dismisses it.\u003c/li\u003e\r\n\u003cli\u003eCreate a large number of notifications in a short period of time.\u003c/li\u003e\r\n\u003cli\u003eCreate a large number of notifications over a long period of time.\u003c/li\u003e\r\n\u003cli\u003eRaise a notification scaring the user (\"Warning, system compromised, unplug from wall immediately\").\u003c/li\u003e\r\n\u003cli\u003eRaise a notification embarrassing the user during a presentation (\"Test results received from Fungus-B-Gone Clinic\").  We have implemented a mode \"Quiet Mode\" that prevents new notifications from being displayed on screen to mitigate this.\u003c/li\u003e\r\n\u003cli\u003eRaise a notification demanding credentials, then steal them. Because the notification appears to originate outside Chrome, it might carry more clout than a typical evil website's phishing plea.\u003c/li\u003e\r\n\u003cli\u003eImpersonate another app or extension.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\r\n\u003col\u003e\u003cli\u003ePretend to be Gmail. Use the Gmail icon. Put up a notification that sends the user to a malware site that steals Gmail credentials.\u003c/li\u003e\r\n\u003cli\u003eSend just enough inane notifications that the user gives up and disables notifications entirely. The user is known to be an oncall ops person at a targeted company. Destroy the company's servers and use the delay caused by the lost notifications to escape the country.\u003c/li\u003e\r\n\u003cli\u003ePretend to be an instant-message service. Send \"Becky: what's our bank account #? I don't have it handy. [Reply]\" All you need is one husband in a hurry whose wife is named Becky for this attack to be profitable. (This is really the same as #1; I'm out of ideas.)\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eFor the impersonation case, see answer to the \"obviously attributable\" question. For local DOSing, see answer to the conflicting extensions question.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003cb\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eNo.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eWe'd use the existing desktop notification API, which unfortunately is reducing its feature set (no HTML layout option). Or we'd advise applications to use something like Growl, which wouldn't work on ChromeOS.\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDraft Manifest Changes\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eA \"notifications\" permission, which is merged with the \u003ca href\u003d\"http://developer.chrome.com/extensions/declare_permissions.html\"\u003eexisting \u003cb\u003enotifications\u003c/b\u003e permission\u003c/a\u003e that enables HTML5 desktop notifications without a runtime permissions check.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cb style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003eNote that this API approximately matches what's in the \u003ca href\u003d\"https://code.google.com/searchframe#OAMlx_jo-ck/src/chrome/common/extensions/api/experimental_notification.idl\u0026amp;exact_package\u003dchromium\u0026amp;l\u003d5\" target\u003d\"_blank\"\u003eChromium repository\u003c/a\u003e. The source code is authoritative.\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"background-color:transparent\" /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cpre\u003enamespace notifications {\u003c/pre\u003e\u003cpre\u003e enum TemplateType {\r\n // icon, title, message\r\n simple,\r\n\r\n // icon, title, message, expandedMessage, up to two buttons\r\n basic,\r\n\r\n // icon, title, message, expandedMessage, image, up to two buttons\r\n image,\r\n\r\n // icon, title, message, items, up to two buttons\r\n list\r\n };\u003c/pre\u003e\u003cpre\u003e dictionary NotificationItem {\r\n // Title of one item of a list notification.\r\n DOMString title;\r\n\r\n // Additional details about this item.\r\n DOMString message;\r\n };\r\n\r\n dictionary NotificationButton {\r\n DOMString title;\r\n DOMString? iconUrl;\r\n };\r\n\r\n dictionary NotificationOptions {\r\n // Which type of notification to display.\r\n TemplateType type;\r\n\r\n // Sender's avatar, app icon, or a thumbnail for image notifications.\r\n DOMString iconUrl;\r\n\r\n // Title of the notification (e.g. sender name for email).\r\n DOMString title;\r\n\r\n // Main notification content.\r\n DOMString message;\r\n\r\n // Priority ranges from -2 to 2. -2 is lowest priority. 2 is highest. Zero\r\n // is default.\r\n long? priority;\r\n\r\n // A timestamp associated with the notification, in milliseconds past the\r\n\u003cspan style\u003d\"line-height:1;font-size:10pt\"\u003e // epoch (e.g. Date.now() + n). Currently unimplemented, but planned for\r\n // a forthcoming release.\r\n double? eventTime;\u003c/span\u003e\u003c/pre\u003e\u003cpre\u003e // Text and icons of the notification action button.\r\n NotificationButton[]? buttons;\r\n\r\n // Image thumbnail for image-type notifications\r\n DOMString? imageUrl;\r\n\r\n // Items for multi-item notifications.\r\n NotificationItem[]? items;\r\n };\r\n\r\n callback CreateCallback \u003d void (DOMString notificationId);\r\n\r\n callback UpdateCallback \u003d void (boolean wasUpdated);\r\n\r\n callback DeleteCallback \u003d void (boolean wasDeleted);\r\n\r\n interface Functions {\r\n // Creates and displays a notification having the contents in |options|,\r\n // identified by the id |notificationId|. If |notificationId| is empty,\r\n // |create| generates an id. If |notificationId| matches an existing\r\n // notification, |create| first deletes that notification before proceeding\r\n // with the create operation. |callback| returns the notification id (either\r\n // supplied or generated) that represents the created notification.\r\n static void create(DOMString notificationId,\r\n NotificationOptions options,\r\n CreateCallback callback);\r\n\r\n // Updates an existing notification having the id |notificationId| and the\r\n // options |options|. |callback| indicates whether a matching notification\r\n // existed.\r\n static void update(DOMString notificationId,\r\n NotificationOptions options,\r\n UpdateCallback callback);\r\n\r\n // Given a |notificationId| returned by the |create| method, clears the\r\n // corresponding notification. |callback| indicates whether a matching\r\n // notification existed.\r\n static void clear(DOMString notificationId, DeleteCallback callback);\r\n };\r\n\r\n interface Events {\r\n // The notification closed, either by the system or by user action.\r\n static void onClosed(DOMString notificationId, boolean byUser);\r\n\r\n // The user clicked in a non-button area of the notification.\r\n static void onClicked(DOMString notificationId);\r\n\r\n // The user pressed a button in the notification.\r\n static void onButtonClicked(DOMString notificationId, long buttonIndex);\r\n };\r\n}; \u003c/pre\u003e\r\n\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/desktop-notification-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3151638900179319264"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/6"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3151638900179319264"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3151638900179319264"}],"author":[{"name":{"$t":"Mike Tsao"},"email":{"$t":"miket@chromium.org"}}],"sites$pageName":{"$t":"desktop-notification-api"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7681192019605979194"},"published":{"$t":"2013-04-23T15:04:37.319Z"},"updated":{"$t":"2013-04-23T15:04:37.327Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-23T15:04:37.319Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen Shot 2013-04-23 at 8.04.15 AM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7681192019605979194"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4727746233434872159"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/perf-sheriffs/Screen%20Shot%202013-04-23%20at%208.04.15%20AM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7681192019605979194"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7681192019605979194"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7681192019605979194"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7681192019605979194"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9211658278549469982"},"published":{"$t":"2013-04-22T21:34:40.317Z"},"updated":{"$t":"2013-04-22T21:34:40.357Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-22T21:34:40.317Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"pnacl.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9211658278549469982"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7599198732671306770"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/reference/research-papers/pnacl.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9211658278549469982"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9211658278549469982"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9211658278549469982"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9211658278549469982"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Xyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1706720798557468908"},"published":{"$t":"2008-12-01T10:18:59.745Z"},"updated":{"$t":"2013-04-22T21:29:42.523Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-22T21:29:39.830Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"User Scripts"},"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 (version 4 and higher) have built-in support for Greasemonkey-style user scripts.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo use, click on any .user.js file. You should see an install dialog. Press OK to install.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eKnown issues:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eChromium does not support @require, @resource, unsafeWindow, GM_registerMenuCommand, GM_setValue, or GM_getValue.\u003c/li\u003e\u003cli\u003eGM_xmlhttpRequest is same-origin only.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Match-Patterns\" /\u003eMatch Patterns\u003c/h3\u003e\u003cdiv\u003eThe preferred way to specify the pages that a user script should run against in Chromium is the \u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e@match\u003c/font\u003e\u003c/b\u003e attribute. Here are some examples of its use:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// \u003d\u003dUserScript\u003d\u003d\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e// @match http://*/*\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// @match http://*.google.com/*\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// @match http://www.google.com/*\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// \u003d\u003d/UserScript\u003d\u003d\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee \u003ca href\u003d\"https://code.google.com/p/chromium/codesearch#chromium/src/extensions/common/url_pattern.h\u0026amp;q\u003dfile:url_pattern.h\u0026amp;sq\u003dpackage:chromium\u0026amp;l\u003d1\"\u003ethese comments\u003c/a\u003e for details on the @match syntax. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSupport for Greasemonkey-style @include patterns is also implemented for compatibility, but @match is preferred.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWith Greasemonkey-style @include rules, it is not possible for Chrome to know for certain the domains a script will run on (because google.* can also run on google.evil.com). Because of this, Chrome just tells users that these scripts will run on all domains, which is sometimes scarier than necessary. With @match, Chrome will tell users the correct set of domains a user script will run on.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Idle-Injection\" /\u003eIdle Injection\u003c/h3\u003e\u003cdiv\u003eIn Chromium/Google Chrome, Greasemonkey scripts are injected by default at a new point called \"\u003ca href\u003d\"http://code.google.com/chrome/extensions/content_scripts.html\"\u003edocument-idle\u003c/a\u003e\". This is different than Greasemonkey, which always injects at document-end.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe document-idle injection point is selected automatically by the browser for the best user-perceived performance. If the document has many external resources like images that slow down page load, the browser will run the script at document-end, like Greasemonkey, while waiting for resources. However, if the page loads quickly, scripts may not be run until after window.onload has occurred -- much later than with Greasemonkey.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe main impact this has on script developers is that you should *not* wait for window.onload in Greasemonkey scripts intended for use with Chromium/Google Chrome, because it may have already occurred when your script has run.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote that there is normally no reason to wait for window.onload in any Greasemonkey script, even in Firefox. Document-end and document-idle are both guaranteed to run after the entire DOM is parsed, which is the usual thing script developers are interested in having occurred. If for some reason you really need your script to run after window.onload, you can check the document.readystate property. If it is \"complete\", then you can assume onload has occurred. If it isn't, then you can listen for onload.\u003cbr /\u003e\u003c/div\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/user-scripts"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1706720798557468908"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1706720798557468908"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1706720798557468908"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"user-scripts"},"sites$revision":{"$t":"26"}},{"gd$etag":"\"XCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3305303992973457205"},"published":{"$t":"2013-04-02T22:43:56.947Z"},"updated":{"$t":"2013-04-20T03:49:51.446Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-20T03:49:49.421Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SummerOfCode2013"},"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\u003eMentors\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAdd your ideas below with your name as a possible mentor. \u003ca href\u003d\"https://google-melange.appspot.com/gsoc/profile/mentor/google/gsoc2013?org\u003dchromium\"\u003eRegister with GSOC as a mentor\u003c/a\u003e using your chromium.org account.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont size\u003d\"3\"\u003eStudents\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSince Chromium is a huge project and Summer of Code is in just a few months, you will be a lot more successful tackling these projects if you contributed patches to Chromium before.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers\"\u003eFor Developers page\u003c/a\u003e contains information on how to check out the source code and build Chromium.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eHere are a few project ideas you might want to work on:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cb\u003eImprovements to flakiness dashboard\u003c/b\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePossible mentors: Ojan Vafai\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eChromium has a dashboard for flaky tests. If many tests fail in one run, appengine times out during results upload. This should be fixed.\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"http://crbug.com/224008\" style\u003d\"font-size:10pt\"\u003ehttp://crbug.com/224008\u003c/a\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDe-flake Instant Extended browser tests, write unit tests\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePossible mentors: ?\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eThe new Instant Extended feature has some browser tests that are flaky, and could also use unit tests.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDebug disabled tests\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePossible mentors: ?\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003eMany of our tests are marked as DISABLED_. Debug the ones that fail reliably, fix whatever bugs you uncover, and enable the test again.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003eImprovements to the Dr. Memory memory debugging tool\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePossible mentors: Derek Bruening, Qin Zhao\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eDr. Memory finds memory-based errors (buffer overflows, use-after-free, etc.) in Chromium code on Windows.  The tool needs additional work in order to find uninitialized reads on graphical Chromium tests and running the full browser without false positives.  See \u003ca href\u003d\"http://code.google.com/p/drmemory/wiki/Projects\"\u003efurther information and a list of Dr. Memory-specific projects\u003c/a\u003e.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eSPDY compliance tests\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePossible mentors: Fred Akalin\u003c/div\u003e\u003cdiv\u003eIt would be really useful to have a suite of tests to validate that a SPDY client or server conforms to the spec. httpbis (the next version of HTTP) will be based on SPDY, so this work could dovetail into compliance tests for httpbis also. The best language for the tests is probably Python.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eYour own idea!\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have an idea you would like to propose, email \u003ca href\u003d\"https://groups.google.com/a/chromium.org/group/chromium-dev/topics?pli\u003d1\"\u003echromium-dev\u003c/a\u003e with the following:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eYour name\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eWhat school you go to / what year of school / what degree\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eOne/two line proposal summary\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eDetails\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePossible mentors, if any\u003c/span\u003e\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/2547469806500607582"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/getting-involved/summerofcode2013"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3305303992973457205"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3305303992973457205"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3305303992973457205"}],"author":[{"name":{"$t":"Nico Weber"},"email":{"$t":"thakis@chromium.org"}}],"sites$pageName":{"$t":"summerofcode2013"},"sites$revision":{"$t":"15"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5665856391380899027"},"published":{"$t":"2013-04-02T18:34:37.449Z"},"updated":{"$t":"2013-04-17T19:57:06.421Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-17T19:57:06.410Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Cross Process Tabs (for posting).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5665856391380899027"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2708308332133640550"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/Cross%20Process%20Tabs%20(for%20posting).png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5665856391380899027"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5665856391380899027"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5665856391380899027"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5665856391380899027"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3878077198854578003"},"published":{"$t":"2012-09-14T17:01:32.264Z"},"updated":{"$t":"2013-04-12T19:47:30.055Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-12T19:47:28.002Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Event Handling"},"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,sans-serif\"\u003e\u003cdiv\u003eA diagram of the architecture of this system:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\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/aura/event-handling/arch4.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1365796037251/developers/design-documents/aura/event-handling/arch4.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHWNDMessageHandler owns the WNDPROC, and is code that is shared with the non-Aura windows build. This code is in production and \"should work.\"\u003c/div\u003e\u003cdiv\u003eOn this diagram, the new classes are DesktopRootWindowHostWin(**) and DesktopNativeWidgetAura. DesktopNativeWidgetAura is a new views::NativeWidgetPrivate implementation that wraps an aura::Window* hosted in a special RootWindow/Host, which is implemented by DesktopRootWindowHost[Win|Linux].\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eDesktopNativeWidgetAura is cross platform code, DesktopRootWindowHostWin|Linux is platform-specific.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBasically there are a bunch of functions on these two new classes that need to be connected together.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eI've made a list of these functions here:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/spreadsheet/ccc?key\u003d0AsMZXOiSimBbdGhhTU1xQWo2QUZGRTExdWhBN2toenc\" style\u003d\"color:rgb(17,85,204)\" target\u003d\"_blank\"\u003ehttps://docs.google.com/a/google.com/spreadsheet/ccc?key\u003d0AsMZXOiSimBbdGhhTU1xQWo2QUZGRTExdWhBN2toenc\u003c/a\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e.. along with some notes I quickly made about what I thought would be a resolution for that method.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA couple of notes about event handling:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eEvents from the system progress through the diagram above left to right, i.e. received at the HWND/XWindow and are processed, maybe eventually making it to the Widget (and hence the View hierarchy) on the right.\u003c/li\u003e\u003cli\u003eInput events in aura must be dispatched by the RootWindow's dispatcher for correct behavior, so rather than sending them directly from the DesktopRootWindowHostWin to the DesktopNativeWidgetAura, we send them into the DRWHW's RootWindow. They'll wind up being received by the DNWA's aura::Window via its WindowDelegate.\u003c/li\u003e\u003cli\u003eOther types of events can perhaps be sent directly from the DRWHW to the DNWA.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eOn the other side, the NativeWidgetPrivate interface provides the API that views::Widget expects the native widget to perform, and this direction goes right-to-left on the diagram above. The typical flow here is through DNWA (which implements NWP) and through a DesktopRootWindowHost interface (we can add new methods to this as needed) which DRWHWin|Linux implements.\u003c/li\u003e\u003c/ul\u003e\u003cul\u003e\u003cli\u003eSometimes there is a conflict on a method name between one on aura::RootWindowHost, which DRWHW|L also implements. In this case you can manual RTTI the DRWH to RWH.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSome methods in DRWHW are never sent back to the DNWA, e.g. those that are windows-specific and are for example completely implemented by NativeWidgetWin. I tend to look at NativeWidgetWin for inspiration when figuring out this kind of thing.\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/event-handling"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3878077198854578003"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3878077198854578003"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3878077198854578003"}],"author":[{"name":{"$t":"Scott Graham"},"email":{"$t":"scottmg@chromium.org"}}],"sites$pageName":{"$t":"event-handling"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1403642964629525955"},"published":{"$t":"2013-04-12T19:47:17.246Z"},"updated":{"$t":"2013-04-12T19:47:17.251Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-12T19:47:17.246Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"arch4.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1403642964629525955"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3878077198854578003"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/event-handling/arch4.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1403642964629525955"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1403642964629525955"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1403642964629525955"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1403642964629525955"}],"author":[{"name":{"$t":"Scott Graham"},"email":{"$t":"scottmg@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"UCl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6531492808927251390"},"published":{"$t":"2011-01-14T18:59:18.090Z"},"updated":{"$t":"2013-04-11T19:29:57.570Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-11T19:29:54.891Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"U-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-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-Variants\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eVariants\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-FDTs\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eFDTs\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-fdtdec\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003efdtdec\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Header-Files\"\u003e\u003cstrong\u003e1.4 \u003c/strong\u003eHeader Files\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Profiles\"\u003e\u003cstrong\u003e1.5 \u003c/strong\u003eProfiles\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Ebuilds\"\u003e\u003cstrong\u003e1.6 \u003c/strong\u003eEbuilds\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Add-New-Boards-to-Ebuilds\"\u003e\u003cstrong\u003e1.7 \u003c/strong\u003eAdd New Boards to Ebuilds\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Building-U-Boot\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eBuilding U-Boot\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-From-ebuild\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eFrom ebuild\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Incremental-build\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eIncremental build\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Build-script\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eBuild script\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Flashing-U-Boot\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eFlashing U-Boot\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-NVidia-Tegra2x\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eNVidia Tegra2x\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Configuring-U-Boot-Environment\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eConfiguring U-Boot Environment\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Memory-Map\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eMemory Map\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Tegra-2x\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eTegra 2x\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\u003ch3\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h3\u003e\u003cp\u003eDas U-Boot is the boot loader used by Chromium OS on ARM. This page provide some basic information about our use of it. See the \u003ca href\u003d\"http://www.denx.de/wiki/U-Boot\" rel\u003d\"nofollow\"\u003eofficial U-Boot page\u003c/a\u003e for more information.\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Variants\" /\u003eVariants\u003c/h3\u003eChrome OS uses a single variant of U-Boot for all Tegra2 boards and all purposes. The same applies for Exynos, although this is a different image from Tegra2. This is a departure from the previous approach of having different variants for each purpose (stub, developer, recovery, normal, flasher) and each board (Seaboard, Aebl, Kaen).\u003cbr /\u003e\u003cbr /\u003eBoth of these changes are enabled by run-time configuration in U-Boot. Traditionally, U-Boot's configuration has been set by \u003ccode\u003eCONFIG_\u003c/code\u003e options. We still use \u003ccode\u003eCONFIG_\u003c/code\u003e options to select which functionality / drivers is included in an image.  However, we avoid using \u003ccode\u003eCONFIG_\u003c/code\u003e options that simply configure that functionality. For example, \u003ccode\u003eCONFIG_USB_EHCI\u003c/code\u003e is used to include the EHCI functionality for USB, but we do not use \u003ccode\u003eCONFIG_TEGRA2_USB0\u003c/code\u003e\u003cb\u003e \u003c/b\u003eto specify the physical address of the first USB port.\u003cbr /\u003e\u003cbr /\u003eWe use \u003ci\u003eflattened device tree\u003c/i\u003e (FDT) to hold this run-time configuration. FDT consists of a number of nodes each with a list of properties. It is easy to add new nodes and properties, and a \u003cb\u003elibfdt\u003c/b\u003e library exists for reading and writing them. For more information about FDT, \u003ca href\u003d\"https://www.power.org/resources/downloads/Power_ePAPR_APPROVED_v1.0.pdf\" rel\u003d\"nofollow\"\u003esee the specification document\u003c/a\u003e before you continue reading here. You might also find the U-Boot \u003ca href\u003d\"http://git.denx.de/cgi-bin/gitweb.cgi?p\u003du-boot.git;a\u003dblob;f\u003ddoc/README.fdt-control;h\u003d85bda035043497d8d23aed8a436e24d630c60937;hb\u003d2c734cd932b53b46e9f89e4f5db9360afc459ae6\" rel\u003d\"nofollow\"\u003edoc/README.fdt-control\u003c/a\u003e file useful.\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e\u003ci\u003eNote\u003c/i\u003e:\u003c/b\u003e as of March 2012 we still use '\u003cb\u003eseaboard\u003c/b\u003e' (rather than '\u003cb\u003egeneric\u003c/b\u003e') as the name of our generic Tegra2 board. This may change in the future.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-FDTs\" /\u003eFDTs\u003c/h3\u003eWe have various types of nodes in the \u003cb\u003eFDT\u003c/b\u003e and they can be categorized as follows:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003eSOC peripherals\u003c/b\u003e - describe an SOC peripheral\u003c/li\u003e\u003cul\u003e\u003cli\u003eincludes its physical address and other properties needed by the driver.\u003c/li\u003e\u003cli\u003eFor example, \u003ci\u003eusb@0xc5000000\u003c/i\u003e is a USB peripheral located at 0xc5000000, which includes a 'host-mode' property indicating that this port should be configured to run in host mode.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cb\u003eBoard peripherals\u003c/b\u003e - describe a chip on the board, in a similar way to an SOC peripheral\u003c/li\u003e\u003cul\u003e\u003cli\u003eNormally, these are linked to an SOC peripheral using a phandle.\u003c/li\u003e\u003cli\u003eFor example, the \u003ci\u003elcd\u003c/i\u003e node describes the LCD attached to the board (its resolution, pixel clock, timings, backlight GPIO, etc.) and then links to the display peripheral (e.g., \u003ci\u003edisplay1\u003c/i\u003e).\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cb\u003eAliases\u003c/b\u003e - assign a new name to a peripheral instance\u003c/li\u003e\u003cul\u003e\u003cli\u003eSome peripherals have multiple instances. It is often useful to assign an order to the instances. This is done by numbering the nodes within the aliases section.\u003c/li\u003e\u003cli\u003eFor example, \u003ci\u003eusb0\u003c/i\u003e and \u003ci\u003eusb1\u003c/i\u003e each point to a USB node - this tells U-Boot that \u003ci\u003eusb0\u003c/i\u003e (which might point to\u003ci\u003e /usb@c5008000\u003c/i\u003e) is the first USB port, and \u003ci\u003eusb1\u003c/i\u003e is the second.\u003c/li\u003e\u003cli\u003eAnother example is the \u003ci\u003econsole\u003c/i\u003e alias which points to the UART to be used as the U-Boot console.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cb\u003econfig\u003c/b\u003e - generic machine configuration information\u003c/li\u003e\u003cul\u003e\u003cli\u003eFor example, we use it to hold the Linux machine ID.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cb\u003echromeos-config\u003c/b\u003e - this is Chrome OS-specific configuration.\u003c/li\u003e\u003cul\u003e\u003cli\u003eWe store the start address of U-Boot (\u003ci\u003etextbase\u003c/i\u003e) and the type of verified boot we are using (\u003ci\u003etwostop\u003c/i\u003e).\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003eFDT-based configuration is enabled with the \u003ccode\u003eCONFIG_OF_CONTROL\u003c/code\u003e option. FDT files are stored in \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eboard/nvidia/dts\u003c/span\u003e or \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eboard/samsung/dts\u003c/span\u003e.\u003cbr /\u003e\u003cbr /\u003eFDT can be packaged with U-Boot in two ways:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003eCONFIG_OF_EMBED\u003c/code\u003e (only for debugging / development) - it is built as an object file and linked to U-Boot\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ccode\u003eCONFIG_OF_SEPARATE\u003c/code\u003e - it is built separately and then appended to the U-boot binary (\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eu-boot.bin\u003c/span\u003e) using \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003ecat\u003c/span\u003e or similar. U-Boot locates it at start-up.\u003c/li\u003e\u003c/ul\u003eWe use the second approach for Chrome OS, since it allows \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003ecros_bundle_firmware\u003c/span\u003e to create an image for any board without needing to look around inside U-Boot to change the FDT.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-fdtdec\" /\u003efdtdec\u003c/h3\u003eInitially, we used a library called \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003efdt_decode\u003c/span\u003e to decode FDT blobs on behalf of different classes of drivers. That approach may become partially useful in future, but we decided to drop it for upstream. There is a still an \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003efdtdec\u003c/span\u003e library which helps a lot, but drivers must decode their own nodes.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Header-Files\" /\u003eHeader Files\u003c/h3\u003eU-Boot uses header files for configuration. Since the FDT change this has become very simple. We have:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003ci\u003echromeos_seaboard_config\u003c/i\u003e - top-level file for verified boot. It simply includes \u003ci\u003eseaboard.h \u003c/i\u003eand \u003ci\u003echromeos.h\u003c/i\u003e.\u003c/li\u003e\u003cli\u003e\u003ci\u003echromeos_daisy_config\u003c/i\u003e - equivalent to the above for exynos.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ci\u003eseaboard.h\u003c/i\u003e - Seaboard-specific config, but, in fact, is used for all Tegra2 boards which use FDT for config. It includes \u003ci\u003etegra2-common.h\u003c/i\u003e. Most of this file is hidden behind '\u003ccode\u003e#ifdef \u003c/code\u003e\u003ccode\u003eCONFIG_OF_CONTROL\u003c/code\u003e' since it is not needed with FDT-based configuration.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ci\u003etegra2-common.h\u003c/i\u003e - options common to all Tegra2 boards.\u003c/li\u003e\u003cli\u003e\u003ci\u003echromeos.h\u003c/i\u003e - options to enable verified boot. In particular \u003ccode\u003eCONFIG_CHROMEOS\u003c/code\u003e and \u003ccode\u003eCHROMEOS_BOOTARGS\u003c/code\u003e are defined here.\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Profiles\" /\u003eProfiles\u003c/h3\u003e\u003cb\u003e\u003ci\u003eTODO\u003c/i\u003e\u003c/b\u003e: Add description of \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003ecros_choose_profile\u003c/span\u003e to a more generic page when one is created.\u003cbr /\u003e\u003cbr /\u003eIn order to simplify the handling of different boards and board variants, a \u003ccode\u003ecros_choose_profile\u003c/code\u003e tool is used:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ecros_choose_profile --help\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\nUSAGE: /usr/bin/cros_choose_profile [flags] args\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\nflags:\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\n  --board:  The name of the board to set up. (default: 'tegra2_seaboard')\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\n  --build_root:  The root location for board sysroots. (default: '/build')\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\n  --board_overlay:  Location of the board overlay. (default: '')\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\n  --variant:  Board variant. (default: '')\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\n  --profile:  The portage configuration profile to use. (default: '')\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e\r\n  -h,--[no]help:  show this help (default: false)\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\r\nThe \u003ccode\u003ecros_choose_profile\u003c/code\u003e utility selects which board and profile we are using. It is normally run by the \u003ccode\u003esetup_board\u003c/code\u003e script.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Ebuilds\" /\u003eEbuilds\u003c/h3\u003eThe main U-Boot-related ebuilds are in \u003ccode\u003esrc/third_party/chromiumos-overlay/sys-boot\u003c/code\u003e:\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003ccode\u003echromeos-u-boot\u003c/code\u003e\u003cbr /\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eBuilds all the variants of U-Boot by default. If you only want one you can build with a \u003ccode\u003eUSE\u003c/code\u003e flag, such as \u003ccode\u003eUSE\u003d'developer emerge-tegra2_seaboard' chromeos-u-boot\u003c/code\u003e.\u003c/li\u003e\u003cli\u003eEach variant is built into its own subdirectory in the temporary build directory: developer, recovery, etc.\u003c/li\u003e\u003cli\u003eThe variants are then installed into the \u003ccode\u003echroot/build/${BOARD}/firmware\u003c/code\u003e directory, named \u003ccode\u003eu-boot-normal.bin\u003c/code\u003e, \u003ccode\u003eu-boot-developer.bin\u003c/code\u003e, etc. For Seaboard this directory is \u003ccode\u003echroot/build/tegra2_seaboard/\u003c/code\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003efirmware\u003c/span\u003e.\u003c/li\u003e\u003cli\u003eAlso installed is U-Boot's \u003ccode\u003einclude/autoconf.mk\u003c/code\u003e and \u003ccode\u003eSystem.map\u003c/code\u003e, but only for the first variant built. These are used by \u003ccode\u003echromeos-bios\u003c/code\u003e (see later).\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e(note that \u003ccode\u003evirtual/u-boot\u003c/code\u003e pulls this ebuild in)\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ccode\u003etegra-bct-${BOARD}\u003c/code\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ci\u003e(This is for Tegra only. We would prefer to build these files in \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003ecros_bundle_firmware\u003c/span\u003e instead, as is now done for FDTs.)\u003c/i\u003e\u003c/li\u003e\u003cli\u003eThere is one of these for each board and they provide the \u003ccode\u003evritual/tegra-bct\u003c/code\u003e package. This ebuild selects configuration files for Flash (SPI or NAND) and SDRAM timings as required.\u003c/li\u003e\u003cli\u003eSince this ebuild inherits \u003ccode\u003etegra-bct\u003c/code\u003e, these functions will be used for building. See \u003ccode\u003esrc/overlays/overlay-tegra2/eclass/tegra-bct.eclass\u003c/code\u003e\u003c/li\u003e\u003cli\u003eThe eclass functions set up a single configuration file consisting of the flash and SDRAM settings, then call \u003ccode\u003ecbootimage\u003c/code\u003e to turn these into a bct file.\u003c/li\u003e\u003cli\u003eThis bct file is installed into \u003ccode\u003echroot/build/${BOARD}/u-boot/bct\u003c/code\u003e as \u003ccode\u003eboard.bct\u003c/code\u003e and \u003ccode\u003eboard.cfg\u003c/code\u003e.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003ccode\u003echromeos-bootimage\u003c/code\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eRun \u003ccode\u003ecros_bundle_firmware\u003c/code\u003e to create two firmware images for the board. This consists of U-Boot, FDT settings, recovery-mode screens and the required keys for performing a verified boot.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Add-New-Boards-to-Ebuilds\" /\u003eAdd New Boards to Ebuilds\u003c/h3\u003e\u003cp\u003eThe variables \u003ccode\u003eU_BOOT_CONFIG_USE\u003c/code\u003e and \u003ccode\u003eU_BOOT_FDT_USE\u003c/code\u003e are currently used to specific the FDT file for U-Boot. These variables are set in the \u003ccode\u003emake.defaults\u003c/code\u003e file for the board. For example, for tegra2 boards this is in \u003ccode\u003esrc/overlays/overlay-tegra2/profiles/base/make.defaults\u003c/code\u003e.\u003c/p\u003e\u003cp\u003eThere is now no need to figure out the FDT or config in the ebuild - you can just use these variables directly.\u003cbr /\u003e\u003c/p\u003e\u003c/div\u003e\u003cdiv\u003eTo check the settings for your board:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode style\u003d\"color:rgb(153,0,255)\"\u003eemerge-tegra2_seaboard --info |tr ' ' '\\n' |grep U_BOOT\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Building-U-Boot\" /\u003eBuilding U-Boot\u003c/h2\u003eThere are two main U-Boot repositories on the server: the stable \u003ccode\u003eu-boot.git\u003c/code\u003e and the unstable \u003ccode\u003eu-boot-next.git\u003c/code\u003e. Normally you will use the stable repo.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-From-ebuild\" /\u003eFrom ebuild\u003c/h3\u003eU-Boot is built from an ebuild like this:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode style\u003d\"color:rgb(153,0,255)\"\u003eemerge-${BOARD} chromeos-u-boot\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eFor example for the Seaboard:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode style\u003d\"color:rgb(153,0,255)\"\u003eemerge-tegra2_seaboard chromeos-u-boot\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eThis builds it from scratch which takes about 40s on a fast machine.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Incremental-build\" /\u003eIncremental build\u003c/h3\u003eIf you have run \u003ccode\u003ecros_workon start chromeos-u-boot\u003c/code\u003e (followed by \u003ccode\u003erepo sync u-boot\u003c/code\u003e) then you can use the incremental build option which takes perhaps 12s.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ebin/cros_workon_make chromeos-u-boot\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eThis is the recommended approach since it sets up the options for your board automatically. If you look in the output of this command you should see the make command it is using. If you really want to, you can use this command, which takes the build time down to around 6s.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Build-script\" /\u003eBuild script\u003c/h3\u003eNOTE: Advanced U-Boot coders only! This can reduce an incremental build to about 1s on a fast machine (16 core).\u003cbr /\u003e\u003cbr /\u003eIf you are working in \u003ccode\u003eu-boot\u003c/code\u003e and constantly flashing U-Boot for different Tegra2 boards then you might find this script useful. Run it within your U-Boot source tree. Beware this is not for beginners. Before you use this script, read it through and compare it with the U-Boot ebuild. You can select an FDT to use to change the board.\u003cbr /\u003e\u003cbr /\u003eNote: this script could be enhanced to output the resulting u-boot binary to a subdirectory with make ...O\u003d\u0026lt;target_dir\u0026gt;.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e#! /bin/sh\u003cbr /\u003e\u003cbr /\u003e# Script to build U-Boot without an ebuild and with upstream config files,\u003cbr /\u003e# then write it to SPI on your board.\u003cbr /\u003e#\u003cbr /\u003e# It builds for seaboard by default - use -b to change the board.\u003cbr /\u003e\u003cbr /\u003e# For an incremental board, run with no arguments. To clean out and reconfig,\u003cbr /\u003e# pass the -c flag.\u003cbr /\u003e\u003cbr /\u003ecompiler\u003darmv7a-cros-linux-gnueabi-\u003cbr /\u003eif grep -sq Gentoo /etc/lsb-release; then\u003cbr /\u003e    chroot\u003dy\u003cbr /\u003e    # location of src within chroot\u003cbr /\u003e    SRC_ROOT\u003d~/trunk/src\u003cbr /\u003e    gcc\u003dgcc\u003cbr /\u003eelse\u003cbr /\u003e    # Change this to point to your source dir\u003cbr /\u003e    SRC_ROOT\u003d/c/cosarm/src\u003cbr /\u003e    BIN\u003d${SRC_ROOT}/../chroot/usr/bin\u003cbr /\u003e    compiler\u003d${BIN}/${compiler}\u003cbr /\u003e    export PATH\u003d${BIN}:${PATH}\u003cbr /\u003e    gcc\u003d$BIN/gcc\u003cbr /\u003e    echo $PATH\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003e. \"${SRC_ROOT}/scripts/lib/shflags/shflags\"\u003cbr /\u003e\u003cbr /\u003eDEFINE_boolean config \"${FLAGS_FALSE}\" \"Reconfigure and clean\" c\u003cbr /\u003eDEFINE_boolean good \"${FLAGS_FALSE}\" \"Use known-good U-Boot\" g\u003cbr /\u003eDEFINE_string board \"seaboard\" \\\u003cbr /\u003e    \"Select config: chromeos_tegra2_\u0026lt;board\u0026gt;_\u0026lt;config\u0026gt;_config\" b\u003cbr /\u003eDEFINE_boolean separate \"${FLAGS_TRUE}\" \"Separate device tree\" s\u003cbr /\u003eDEFINE_boolean verified \"${FLAGS_FALSE}\" \"Enable verified boot\" V\u003cbr /\u003eDEFINE_string dt \"seaboard\" \\\u003cbr /\u003e    \"Select device tree: seaboard, kaen, aebl\" d\u003cbr /\u003eDEFINE_boolean build \"${FLAGS_TRUE}\" \"Build U-Boot\" B\u003cbr /\u003e\u003cbr /\u003e# Parse command line\u003cbr /\u003eFLAGS \"$@\" || exit 1\u003cbr /\u003eeval set -- \"${FLAGS_ARGV}\"\u003cbr /\u003e\u003cbr /\u003eif [ \"$FLAGS_build\" -eq \"${FLAGS_FALSE}\" ]; then\u003cbr /\u003e    if [ \"$FLAGS_config\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e        FLAGS_config\u003d${FLAGS_FALSE}\u003cbr /\u003e        echo \"Warning: disabled -c since -B was given\"\u003cbr /\u003e    fi\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003ecd $SRC_ROOT/third_party/u-boot/files\u003cbr /\u003e\u003cbr /\u003etarget\u003dall\u003cbr /\u003eif [ -n \"${FLAGS_ARGV}\" ]; then\u003cbr /\u003e  target\u003d${FLAGS_ARGV}\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003eif [ \"$FLAGS_config\" -eq \"${FLAGS_FALSE}\" ]; then\u003cbr /\u003e    # Get the correct board for cros_write_firmware\u003cbr /\u003e    board\u003d$(grep BOARD include/config.mk | awk '{print $3}')\u003cbr /\u003e    if [ -z \"${FLAGS_board}\" -a \"$board\" !\u003d \"${FLAGS_board}\" ]; then\u003cbr /\u003e        echo \"Warning: U-Boot is configured for $board, \" \\\u003cbr /\u003e            \"forcing reconfigure\"\u003cbr /\u003e        FLAGS_config\u003d${FLAGS_TRUE}\u003cbr /\u003e    fi\u003cbr /\u003e    FLAGS_board\u003d${board}\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003eBASE+\u003d\"-s \"\u003cbr /\u003eBASE+\u003d\"-j15 \"\u003cbr /\u003eBASE+\u003d\"ARCH\u003darm CROSS_COMPILE\u003d${compiler} USE_PRIVATE_LIBGCC\u003dyes \"\u003cbr /\u003eBASE+\u003d\"--no-print-directory \"\u003cbr /\u003eBASE+\u003d\"HOSTCC\u003d$gcc HOSTSTRIP\u003dtrue VBOOT\u003d/build/tegra2_${FLAGS_board}/usr \"\u003cbr /\u003e#BASE+\u003d\"VBOOT_DEBUG\u003d1 \"\u003cbr /\u003eif  [ \"$FLAGS_separate\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e    BASE+\u003d\"DEV_TREE_SEPARATE\u003dtrue \"\u003cbr /\u003efi\u003cbr /\u003eBASE+\u003d\"DEV_TREE_SRC\u003dtegra2-${FLAGS_dt} \"\u003cbr /\u003e\u003cbr /\u003eboard\u003d${FLAGS_board}\u003cbr /\u003e\u003cbr /\u003eif [ \"${FLAGS_verified}\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e        FLAGS_board\u003dchromeos_tegra2_twostop\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003e# echo $BASE\u003cbr /\u003eif [ \"$FLAGS_config\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e    make $BASE distclean\u003cbr /\u003e    make $BASE ${FLAGS_board}_config || { echo \"Make failed\"; exit 1; }\u003cbr /\u003e    make $BASE dep\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003eif [ \"$FLAGS_good\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e    IMAGE\u003d/build/tegra2_${FLAGS_board}/u-boot/u-boot-developer.bin\u003cbr /\u003eelse\u003cbr /\u003e    if [ \"$FLAGS_build\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e        make $BASE $target || { echo \"Make failed\"; exit 1; }\u003cbr /\u003e    fi\u003cbr /\u003e    IMAGE\u003du-boot.bin\u003cbr /\u003efi\u003cbr /\u003e\u003cbr /\u003eif  [ \"$FLAGS_separate\" -eq \"${FLAGS_TRUE}\" ]; then\u003cbr /\u003e    cat $IMAGE u-boot.dtb \u0026gt;u-boot.bin.dtb\u003cbr /\u003e    IMAGE\u003du-boot.bin.dtb\u003cbr /\u003efi\u003cbr /\u003ebmp\u003d\"/home/$USER/trunk/src/third_party/chromiumos-overlay/sys-boot/\"\u003cbr /\u003ebmp+\u003d\"chromeos-bootimage/files/default.bmpblk\"\u003cbr /\u003e\u003cbr /\u003ecros_bundle_firmware -w -u u-boot.bin -s -b tegra2_aebl --bootsecure \\\u003cbr /\u003e    --bootcmd vboot_twostop --bmpblk ${bmp}\u003cbr /\u003e\u003cbr /\u003e#--add-config-int silent_console 1\u003cbr /\u003e\u003c/code\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Flashing-U-Boot\" /\u003eFlashing U-Boot\u003c/h2\u003eThe method here depends on the platform you are using. Please see the documentation on \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/firmware-update\"\u003ecros_bundle_firmware\u003c/a\u003e also.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-NVidia-Tegra2x\" /\u003eNVidia Tegra2x\u003c/h3\u003eThere is a firmware writing utility available which can reflash U-Boot on your board. For example, for Seaboard you can write the recovery U-Boot with:\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"text-indent:0px\"\u003e\u003cspan style\u003d\"text-align:left\"\u003e\u003cdiv style\u003d\"border-collapse:separate;color:rgb(0,96,0);font-family:monospace;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:14px;text-transform:none;white-space:normal;word-spacing:0px\"\u003e# Connect USB A-A cable to top USB port, reset with recovery button held down\u003c/div\u003e\u003cdiv style\u003d\"border-collapse:separate;color:rgb(0,96,0);font-family:monospace;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:14px;text-transform:none;white-space:normal;word-spacing:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"border-collapse:separate;color:rgb(0,96,0);font-family:monospace;font-size:14px;font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:normal;line-height:14px;text-transform:none;white-space:normal;word-spacing:0px\"\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)\"\u003e\u003cdiv\u003eIf you have a T20-seaboard (no camera attachment on top), please build/flash your firmware with:\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eUSE\u003dtegra20-bct emerge-tegra2_seaboard tegra-bct chromeos-bootimage\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ecros_write_firmware -b tegra2_seaboard \\\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e                    -i /build/tegra2_seaboard/u-boot/legacy_image.bin\u003c/font\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have a T25-seaboard (black camera box above the screen), please build/flash your firmware with:\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eemerge-tegra2_seaboard tegra-bct chromeos-bootimage\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ecros_write_firmware -b tegra2_seaboard \\\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e                    -i /build/tegra2_seaboard/u-boot/legacy_image.bin\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eThe\r\n BCT controls early memory initialization on Tegra2 CPUs.  It is \r\nsomething that is customized for every variant of every board.\u003c/span\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)\"\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe need a different BCT for T20 and T25 Seaboards. \r\n Up until this point we have just used an old version of the T20 BCT for\r\n both products.  This is not such a great thing for various reasons, one\r\n of which is problems with DVFS.  Since we are planning to enable DVFS \r\nrealsoonnow(TM), you will need this change.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOne thing to note: you probably shouldn't put \r\n\"official\" builds onto your T20 Seaboard, since they will (I think) \r\nclobber the firmware with the T25 version (the default).  You've been \r\nwarned.\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Configuring-U-Boot-Environment\" /\u003eConfiguring U-Boot Environment\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eU-boot accepts user commands to set up its execution environment. The problem with the current implementation is that at the default console baud rate of 115200 u-boot is not running fast enough and the UART gets easily overrun in case a user tries pasting text through terminal connected to the console. \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\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eThe attached \u003ccode\u003eexpect\u003c/code\u003e script allows to\u003c/span\u003e\u003cspan style\u003d\"border-collapse:collapse;color:rgb(68,68,68);font-family:arial,sans-serif\"\u003e work around the \u003c/span\u003e\u003cspan style\u003d\"border-collapse:collapse;color:rgb(68,68,68);font-family:arial,sans-serif\"\u003eproblem. The script is just an example, which can be used it as follows. Start its execution on the workstation which has a USB port connected to the target console\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"border-collapse:collapse;color:rgb(68,68,68);font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"border-collapse:collapse;color:rgb(68,68,68);font-size:13px\"\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./ttyusb \u0026lt;file with u-boot script\u0026gt;\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003cbr /\u003eand then hit reset on the target (if it is not already in u-boot console mode).\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003e\u0026lt;file with u-boot script\u0026gt;\u003c/code\u003e is a text file including a set of u-boot commands, one per line. Lines starting with # are ignored. \u003ccode\u003ettyusb\u003c/code\u003e will send the commands to the console, character by character, making sure that all characters are echoed and the \u003ccode\u003eCrOS\u0026gt; \u003c/code\u003eprompt is returned after each command.\u003cbr /\u003e\u003cbr /\u003eOnce all commands are executed, the terminal session becomes the console terminal for the target. To exit the console session type \u003ccode\u003e^a\u003c/code\u003e.\u003cbr /\u003e\u003cbr /\u003eThe serial port device is hardcoded in the script to \u003ccode\u003e/dev/ttyUSB1,\u003c/code\u003e edit your copy of to get a different tty device used, if necessary.\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Memory-Map\" /\u003eMemory Map\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Tegra-2x\" /\u003eTegra 2x\u003c/h3\u003eCurrent (as of 2011-09-13):\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe have 0x4000 0000 (1GB) of memory in our machines.  RAM starts at physical address 0x0.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" 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:96px;height:16px\"\u003e\u003cb\u003e Address 0x\u003cbr /\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:16px\"\u003e\u003cb\u003e Approx.\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e\u003cb\u003e Size\u003c/b\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:16px\"\u003e\u003cb\u003e Defined where\u003cbr /\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:16px\"\u003e\u003cb\u003e Notes\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:96px;height:16px\"\u003e 0000 0100\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:16px\"\u003e 0.25KB\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e 1KB\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:16px\"\u003egd-\u0026gt;bd-\u0026gt;bi_boot_params (\u003cfont color\u003d\"#ff0000\"\u003eTODO: used booting non-FIT images?\u003c/font\u003e)\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:16px\"\u003eKernel boot parameters area (ATAGs)\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:96px;height:16px\"\u003e 0000 8000\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:16px\"\u003e 32KB\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e 4MB\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:16px\"\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/kernel.git;a\u003dblob;f\u003darch/arm/mach-tegra/Makefile.boot;hb\u003dchromeos-2.6.38\"\u003ezreladdr\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:16px\"\u003eNot used by u-boot, but good to keep in mind that this is the location the kernel will eventually decompress / relocate itself to (\u003cfont color\u003d\"#ff0000\"\u003eTODO: will it put any initramdisk here too?\u003c/font\u003e).  It's important there's room so the decompressed kernel won't clobber the FDT.\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:96px;height:16px\"\u003e 0010 0000\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:16px\"\u003e 1MB\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e 8MB\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:16px\"\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/chromeos.h;hb\u003dchromeos-v2011.06\"\u003eCHROMEOS_KERNEL_LOADADDR\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/chromeos.h;hb\u003dchromeos-v2011.06\"\u003eCHROMEOS_KERNEL_BUFSIZE\u003c/a\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:16px\"\u003evboot loads the FIT image here; FDT and zImage will then be relocated elsewhere\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:96px;height:16px\"\u003e 0040 8000\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:16px\"\u003e 4MB + 32KB\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e 4MB\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:16px\"\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/tegra2-common.h;hb\u003dchromeos-v2011.06\"\u003eCONFIG_LOADADDR\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:16px\"\u003eArea to load scripts or kernel uImage (prior to decompression); used by legacy u-boot.  TODO: Why not use 0x00100000?\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:96px;height:23px\"\u003e 00e0 8000\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:23px\"\u003e 14MB + 32KB\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:23px\"\u003e 1MB\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:23px\"\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/tegra2-common.h;hb\u003dchromeos-v2011.06\"\u003eTEXT_BASE\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:23px\"\u003eStart of U-Boot code region. Data appears immediately after\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e 01ff c000\u003c/td\u003e\u003ctd\u003e 32MB - 16KB\u003c/td\u003e\u003ctd\u003e 16KB\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/tegra2-common.h;hb\u003dchromeos-v2011.06\"\u003eCONFIG_SYS_BOOTMAPSZ\u003c/a\u003e appears to control the 32MB (can be overridden by environment variables).\u003cbr /\u003e\u003cbr /\u003eThe 16KB comes from the padded size of the kernel's FDT (as the FDT grows, this should move).\u003c/td\u003e\u003ctd\u003eU-boot ends up relocating the kernel's copy of the FDT to here.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e 0200 0000\u003cbr /\u003e\u003c/td\u003e\u003ctd\u003e\u003cb\u003e \r\n\u003c/b\u003e32MB\u003c/td\u003e\u003ctd\u003e 512KB\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/kernel.git;a\u003dblob;f\u003dchromeos/config/armel/config.common.armel;hb\u003dchromeos-2.6.38\"\u003eCONFIG_CHROMEOS_RAMOOPS_RAM_START\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/kernel.git;a\u003dblob;f\u003dchromeos/config/config.common.chromeos;hb\u003dchromeos-2.6.38\"\u003eCONFIG_CHROMEOS_RAMOOPS_RAM_SIZE\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eKernel preserved area (kcrashmem). This is preserved_start in the kernel, or kcrashmem\u003d environment variable in U-Boot.\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:96px;height:16px\"\u003e 0300 0000\u003c/td\u003e\u003ctd style\u003d\"width:101px;height:16px\"\u003e 48MB\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e ?MB\u003c/td\u003e\u003ctd style\u003d\"width:150px;height:16px\"\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/overlays/chromiumos-overlay.git;a\u003dblob;f\u003dsys-kernel/chromeos-kernel/files/kernel_fdt.its\"\u003ekernel_fdt.its\u003c/a\u003e\u003c/td\u003e\u003ctd style\u003d\"width:411px;height:16px\"\u003eImage is copied here by u-boot before jumping to.\u003cbr /\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e 1c40 6000\u003c/td\u003e\u003ctd\u003e 512MB - \u003cbr /\u003e 192MB + \u003cbr /\u003e 4MB + \u003cbr /\u003e 24KB\u003c/td\u003e\u003ctd\u003e 8KB\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/tegra2-common.h;hb\u003dchromeos-v2011.06\"\u003eTEGRA_LP0_ADDR\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dinclude/configs/tegra2-common.h;hb\u003dchromeos-v2011.06\"\u003eTEGRA_LP0_SIZE\u003c/a\u003e\u003c/td\u003e\u003ctd\u003eUsed in suspend / resume.\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e 3768 0000\u003c/td\u003e\u003ctd\u003e 1GB - ~144MB\u003c/td\u003e\u003ctd\u003e varies; ~2MB\u003c/td\u003e\u003ctd\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dboard/nvidia/seaboard/tegra2-seaboard.dts;hb\u003dchromeos-v2011.06\"\u003eframe-buffer\u003c/a\u003e\u003cbr /\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/third_party/u-boot.git;a\u003dblob;f\u003dcommon/lcd.c;hb\u003dchromeos-v2011.06\"\u003elcd_get_size()\u003c/a\u003e\u003c/td\u003e\u003ctd\u003e \u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\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/u-boot"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6531492808927251390"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6531492808927251390"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6531492808927251390"}],"author":[{"name":{"$t":"Simon Glass"},"email":{"$t":"sjg@chromium.org"}}],"sites$pageName":{"$t":"u-boot"},"sites$revision":{"$t":"49"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9087345861879958034"},"published":{"$t":"2011-04-12T00:54:28.463Z"},"updated":{"$t":"2013-04-11T18:30:29.798Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-12T00:54:28.463Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ttyusb"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9087345861879958034"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6531492808927251390"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/u-boot/ttyusb"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9087345861879958034"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9087345861879958034"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9087345861879958034"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9087345861879958034"}],"author":[{"name":{"$t":"Vadim Bendebury"},"email":{"$t":"vbendeb@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4735022690641825251"},"published":{"$t":"2013-04-09T21:12:41.574Z"},"updated":{"$t":"2013-04-09T21:41:39.818Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-09T21:41:38.227Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How repaint works"},"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\u003eMoved to \u003ca href\u003d\"https://docs.google.com/a/chromium.org/document/d/1jxbw-g65ox8BVtPUZajcTvzqNcm5fFnxdi4wbKq-QlY/edit#\" style\u003d\"font-size:10pt\"\u003ehttps://docs.google.com/a/chromium.org/document/d/1jxbw-g65ox8BVtPUZajcTvzqNcm5fFnxdi4wbKq-QlY/edit#\u003c/a\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\"\u003eHow repaint works\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-object-title\" style\u003d\"display:none;\"\u003eHow repaint works\u003c/div\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-writely\"\u003e\u003ciframe src\u003d\"http://docs.google.com/document/preview?hgd\u003d1\u0026amp;id\u003d1jxbw-g65ox8BVtPUZajcTvzqNcm5fFnxdi4wbKq-QlY\" width\u003d\"100%\" height\u003d\"600\" title\u003d\"How repaint works\" frameborder\u003d\"0\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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/how-repaint-works"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4735022690641825251"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4735022690641825251"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4735022690641825251"}],"author":[{"name":{"$t":"Christian Biesinger"},"email":{"$t":"cbiesinger@chromium.org"}}],"sites$pageName":{"$t":"how-repaint-works"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6445098029930105167"},"published":{"$t":"2013-04-09T20:23:47.228Z"},"updated":{"$t":"2013-04-09T20:23:47.235Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-09T20:23:47.228Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Chromium HTTP Network Request Diagram.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6445098029930105167"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2187609824886192973"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/Chromium%20HTTP%20Network%20Request%20Diagram.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6445098029930105167"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6445098029930105167"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6445098029930105167"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6445098029930105167"}],"author":[{"name":{"$t":"Misha Efimov"},"email":{"$t":"mef@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5203859339305300401"},"published":{"$t":"2013-04-09T20:12:41.551Z"},"updated":{"$t":"2013-04-09T20:12:41.567Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-09T20:12:41.551Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Chromium Network Stack.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5203859339305300401"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2187609824886192973"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/Chromium%20Network%20Stack.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5203859339305300401"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5203859339305300401"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5203859339305300401"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5203859339305300401"}],"author":[{"name":{"$t":"Misha Efimov"},"email":{"$t":"mef@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7568509800763850952"},"published":{"$t":"2013-04-08T20:36:01.344Z"},"updated":{"$t":"2013-04-08T20:49:16.920Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-08T20:49:15.098Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Visualizing the Rootfs"},"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\"\u003eAn important aspect in working on an embedded OS is keeping the size of our updates down which usually entails keeping the size of the OS image down. If left unchecked, the OS image will increase steadily. In order to help developers track down where space is going we created a tool cros_tree_map that helps developers figure out where our precious space is going.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn order to use, you need to have:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ean OS image (the .bin file).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eat least a mini-layout checkout of the code.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003eTo use:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003emount the image onto a directory -- you can do this easily with \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/helper-scripts#TOC-mount_gpt_image.sh\" target\u003d\"_blank\"\u003emount_gpt_image.sh\u003c/a\u003e (in \u003ccode\u003e~/src/scripts\u003c/code\u003e). You should use the \u003ccode\u003e--safe\u003c/code\u003e option to ensure you do not make accidental changes to the Root FS. By default it will mount the rootfs onto \u003ccode\u003e/tmp/m\u003c/code\u003e. You can use the \u003ccode\u003e--from\u003d\u0026lt;path to .bin file\u0026gt;\u003c/code\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eRun du: \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003esudo du -xB 1 /tmp/m \u0026gt; du.\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003eout\u003c/code\u003e (\u003ccode\u003edu.out\u003c/code\u003e is your output file).\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eUse cros_tree_map to create a json report: \u003ccode\u003e~/\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003echromite/contrib/cros_tree_map du --du-output du\u003c/code\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003ccode\u003e.out --strip-prefix /tmp/m \u0026gt; image_size.json\u003c/code\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003eAt this point you will have a json file with all the directory information. To visualize this info, you can use webtree map here: \u003ca href\u003d\"https://github.com/martine/webtreemap\" style\u003d\"font-size:10pt\" rel\u003d\"nofollow\"\u003ehttps://github.com/martine/webtreemap\u003c/a\u003e. You can then view the html file from your trusty web browser.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHere's an example snapshot of a Chrome OS image (note: yours will be interactive so you can dig in to different areas).\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/chromium-os/how-tos-and-troubleshooting/visualizing-the-rootfs/Screenshot%20from%202013-04-08%2013%3A46%3A48.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1365454055924/chromium-os/how-tos-and-troubleshooting/visualizing-the-rootfs/Screenshot%20from%202013-04-08%2013%3A46%3A48.png\" /\u003e\u003c/a\u003e\u003c/div\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/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/visualizing-the-rootfs"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7568509800763850952"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7568509800763850952"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7568509800763850952"}],"author":[{"name":{"$t":"Chris Sosa"},"email":{"$t":"sosa@chromium.org"}}],"sites$pageName":{"$t":"visualizing-the-rootfs"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1287441193577737772"},"published":{"$t":"2013-04-08T20:47:35.918Z"},"updated":{"$t":"2013-04-08T20:47:35.924Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-08T20:47:35.918Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot from 2013-04-08 13:46:48.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1287441193577737772"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7568509800763850952"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/visualizing-the-rootfs/Screenshot%20from%202013-04-08%2013:46:48.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1287441193577737772"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1287441193577737772"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1287441193577737772"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1287441193577737772"}],"author":[{"name":{"$t":"Chris Sosa"},"email":{"$t":"sosa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7842555086782517564"},"published":{"$t":"2013-02-11T18:55:20.944Z"},"updated":{"$t":"2013-04-08T20:41:23.374Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-08T20:41:21.840Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Tab Discarding and Reloading"},"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-size:10pt\"\u003eWhy are my tabs reloading?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eYour device is out of memory. Like your Android phone or tablet, Chrome is silently closing background tabs in order to make memory available. When you click on one of those tabs it reloads.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhat's taking up all my memory?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eOpen the Task manager (under Tools \u0026gt; Tools \u0026gt; Task manager, or hit Shift-Esc) to see the usage of tabs and extensions. about:memory has more detailed information.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow can I make it stop?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eClose some tabs or uninstall extensions that take a lot of memory. If there's a specific tab you don't want discarded, right-click on the tab and pin it.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003eHow does Chrome choose which tab to discard?\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eYou can go to about:discards to see the current ranking of your tabs. It discards in this order:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eInternal pages like new tab page, bookmarks, etc.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTabs selected a long time ago\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTabs selected recently\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eTabs playing audio\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eApps running in a window\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ePinned tabs\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eThe selected tab\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003eHow often are users affected by this?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThe majority of Chrome OS users have only one or two tabs open. Even users with more tabs open rarely run out of memory. Some users who run out of memory never see a reload (they log out without ever looking at a discarded tab). We have internal UMA metrics on all these conditions. Googlers tend to have large numbers of tabs open to complex web sites and tend to hit reloads more often.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhy doesn't Chrome do this on Mac / Windows / Goobuntu?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThose machines swap memory out to disk when they get low on resources. Changing tabs then slows down as the data is loaded from disk.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhy doesn't Chrome OS use swap?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThis was a very early design decision. My understanding of the rationale is:\u003c/div\u003e\u003cdiv\u003e* Chrome OS doesn't want to wear out the SSD / flash chips by constantly writing to them.\u003c/div\u003e\u003cdiv\u003e* To preserve device security it would have to encrypt the swap, which increases the CPU and battery usage.\u003c/div\u003e\u003cdiv\u003e* Rather than slowing down by swapping, Chrome OS should run fast until it hits a wall, then discard data and keep running fast.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhy doesn't Chrome OS tell me that I'm out of memory?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThis is an intentional UI design decision. My understanding of the rationale is:\u003c/div\u003e\u003cdiv\u003e* Phones and tablets silently discard pages\u003c/div\u003e\u003cdiv\u003e* Users shouldn't have to worry about managing memory\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cb\u003eWhy do we discard tabs instead of doing something else?\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eWell, we used to do something worse. When the machine ran out of memory the kernel out-of-memory killer would kill a renderer, which would kill a semi-random set of tabs. Sometimes this included the selected tab, so the user would see a sad tab page (specifically, He's dead, Jim.). The tab discarder only drops one tab at a time and tries to be smart about what it discards. We tried other approaches without much success. For example, forcing JavaScript garbage collection is too slow. Dropping various graphics caches only frees memory for a short amount of time. Part of the difficulty is that the response to low memory conditions needs to be fast, reliable and lead to a persistent decrease in memory consumption.\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\u003cb\u003eIs there a long-term plan for this issue?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eSometimes these issues are caused by memory leaks or bloat, which we fix. davemoore@ has been particularly good at finding Chrome OS memory problems. We also need to systematically reduce the amount of memory Chrome uses. People across the browser, renderer and graphics teams are working on this. We're also investigating zram (a kind of in-memory swap). At some point we may want to revisit the design decisions above.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhere can I find more detailed information about what we do in low memory situations?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eSee\u003cspan style\u003d\"font-size:10pt\"\u003e the\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/out-of-memory-handling\" style\u003d\"font-size:10pt\" target\u003d\"_blank\"\u003eout of memory design document\u003c/a\u003e\u003cspan style\u003d\"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/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/tab-discarding-and-reloading"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7842555086782517564"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7842555086782517564"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7842555086782517564"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$pageName":{"$t":"tab-discarding-and-reloading"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8950208641874107600"},"published":{"$t":"2013-04-05T18:30:27.488Z"},"updated":{"$t":"2013-04-05T18:40:20.776Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-05T18:40:19.325Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"webkit-gardening"},"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: \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/blink/sheriffing\"\u003eGardening Blink\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/webkit-gardening"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8950208641874107600"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8950208641874107600"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8950208641874107600"}],"author":[{"name":{"$t":"Dimitri Glazkov"},"email":{"$t":"dglazkov@chromium.org"}}],"sites$pageName":{"$t":"webkit-gardening"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1514939193184312627"},"published":{"$t":"2013-04-04T23:17:48.631Z"},"updated":{"$t":"2013-04-04T23:17:48.642Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-04T23:17:48.631Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chrome-64.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1514939193184312627"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1201972082741324563"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-projects/chrome-64.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1514939193184312627"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1514939193184312627"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1514939193184312627"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1514939193184312627"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5925898141499761194"},"published":{"$t":"2013-04-03T20:54:18.973Z"},"updated":{"$t":"2013-04-03T20:54:18.980Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-03T20:54:18.973Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lewishead.jpg.1365009990294.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5925898141499761194"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3237609729066771983"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/developer-faq/lewishead.jpg.1365009990294.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5925898141499761194"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5925898141499761194"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5925898141499761194"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5925898141499761194"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/702535840609543643"},"published":{"$t":"2013-04-03T20:54:14.337Z"},"updated":{"$t":"2013-04-03T20:54:14.347Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-03T20:54:14.337Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"paulhead.jpg.1365009992996.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/702535840609543643"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3237609729066771983"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/blink/developer-faq/paulhead.jpg.1365009992996.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/702535840609543643"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/702535840609543643"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/702535840609543643"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/702535840609543643"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5472309137421697881"},"published":{"$t":"2013-04-02T19:25:59.864Z"},"updated":{"$t":"2013-04-02T19:25:59.873Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-02T19:25:59.864Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lumpy-internals-top.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5472309137421697881"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/lumpy-internals-top.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5472309137421697881"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5472309137421697881"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5472309137421697881"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5472309137421697881"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/739391089696699329"},"published":{"$t":"2013-04-02T18:40:29.721Z"},"updated":{"$t":"2013-04-02T18:40:29.730Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-02T18:40:29.721Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Frame DOMWindow Document (1).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/739391089696699329"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2708308332133640550"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/Frame%20DOMWindow%20Document%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/739391089696699329"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/739391089696699329"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/739391089696699329"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/739391089696699329"}],"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/8284042469808564295"},"published":{"$t":"2013-04-02T18:39:15.946Z"},"updated":{"$t":"2013-04-02T18:39:15.953Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-02T18:39:15.946Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Frame Trees (for posting).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8284042469808564295"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2708308332133640550"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/oop-iframes/Frame%20Trees%20(for%20posting).png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8284042469808564295"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8284042469808564295"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8284042469808564295"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8284042469808564295"}],"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/3406486875828207622"},"published":{"$t":"2013-04-01T21:03:38.000Z"},"updated":{"$t":"2013-04-01T21:03:38.094Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-01T21:03:38.000Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"center-positive-polarity.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3406486875828207622"},"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":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/center-positive-polarity.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3406486875828207622"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3406486875828207622"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3406486875828207622"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3406486875828207622"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7767153660310750782"},"published":{"$t":"2013-04-01T21:03:11.173Z"},"updated":{"$t":"2013-04-01T21:03:11.217Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-01T21:03:11.173Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"center-negative-polarity.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7767153660310750782"},"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":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/center-negative-polarity.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7767153660310750782"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7767153660310750782"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7767153660310750782"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7767153660310750782"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8307785884468248842"},"published":{"$t":"2013-04-01T21:03:03.829Z"},"updated":{"$t":"2013-04-01T21:03:03.857Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-04-01T21:03:03.829Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"direct-current.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8307785884468248842"},"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":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/direct-current.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8307785884468248842"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8307785884468248842"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8307785884468248842"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8307785884468248842"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Wyl7JmA4\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/156343192838375503"},"published":{"$t":"2010-12-08T19:30:41.814Z"},"updated":{"$t":"2013-03-26T15:42:40.935Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-26T15:42:36.333Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Security Bug Lifecycle"},"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\"text-align:center\"\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003eOBSOLETE!!! Check \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-sheriff\"\u003ehere\u003c/a\u003e instead.\u003c/b\u003e\u003c/font\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003e\u003cbr /\u003e\u003c/p\u003e\u003cp\u003eThe following document describes the process of working from an inbound security bug report to releasing a fix on all affected branches. You can also refer to the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:720d3da517383207\" class\u003d\"disabled\"\u003eSecurity Cheat Sheets\u003c/a\u003e to provide a quick walk through or as a reference to check your progress.\u003c/p\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-Triage\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eTriage\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Security-Features-Non-Vulnerabilities-\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eSecurity Features \u0026amp; Non-Vulnerabilities \u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Assigning-Labels\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eAssigning Labels\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Upstreaming-WebKit-Bugs\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003eUpstreaming WebKit Bugs\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Getting-Access-to-WebKit-Security-Bugs\"\u003e\u003cstrong\u003e1.3.1 \u003c/strong\u003eGetting Access to WebKit Security Bugs\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Timeline\"\u003e\u003cstrong\u003e1.4 \u003c/strong\u003eTimeline\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Erroneous-Reports\"\u003e\u003cstrong\u003e1.5 \u003c/strong\u003eErroneous Reports\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Shepherding\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eShepherding\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Following-Up\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eFollowing Up\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Handling-a-Fix\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eHandling a Fix\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Merging\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eMerging\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Updating-and-Release-Notes\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eUpdating and Release Notes\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Vulnerability-Rewards-Nomination\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eVulnerability Rewards Nomination\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-Triage\" /\u003eTriage\u003c/h2\u003e\r\n\u003cp\u003eThe first step of triage is confirming that a bug does exist and it does represent a vulnerability. Most reporters provide a version in the bug report, but you’ll generally need to verify against the current stable, beta, and trunk builds. The \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/reporting-security-bugs\"\u003eReporting Security Bugs\u003c/a\u003e page provides information on what detail is required and how to get it, so you should use that as a guide to fill in anything the report is missing. If you don’t have a particular build on hand to perform the analysis against, you can leave a comment in the bug requesting that another team member assist in verifying it. The list of currently open security (modulo \u003cfont face\u003d\"arial, sans-serif\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cb\u003eSecurity-Severity-\u003cspan style\u003d\"font-size:10pt\"\u003eNone\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e) bugs can be viewed with \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dType%3DBug-Security+-Security_Severity%3DNone\u0026amp;sort\u003d-secseverity\u0026amp;groupby\u003d\u0026amp;colspec\u003dID+Pri+Area+Feature+Status+Summary+Modified+Owner+Mstone+OS+Secseverity+Reporter+Secimpacts\" style\u003d\"font-size:10pt\" target\u003d\"_blank\"\u003ethis query\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e.\u003c/span\u003e\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Security-Features-Non-Vulnerabilities-\" /\u003eSecurity Features \u0026amp; Non-Vulnerabilities \u003c/h3\u003e\u003cdiv\u003eThere are a number of bugs we want to keep track of for security reasons, but shouldn't track as vulnerabilities. This includes new security features and improvements, or changes that simply have a security impact or warrant a closer inspection from a security perspective. In this case the bug should \u003ci\u003enot \u003c/i\u003ebe filed as \u003ci\u003eType-Security\u003c/i\u003e. Instead it should be filed as whatever type is relevant (generally \u003cb\u003eType-Bug\u003c/b\u003e) and also have the \u003cb\u003eFeature-Security\u003c/b\u003e label set. This ensures the security team will still receive updates, but keeps it out of the list of open vulnerabilities.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Assigning-Labels\" /\u003eAssigning Labels\u003c/h3\u003e\r\n\u003cp\u003e\u003cb\u003e\u003cu\u003eFirst verify the bug, requirements to trigger, and affected platforms\u003c/u\u003e\u003c/b\u003e; if you cannot verify the bug directly (e.g. nonavailability of the affected platform) then assign or CC an owner who can. Once you’ve verified the bug, you need to determine the appropriate labels. You should follow the severity guidelines \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/severity-guidelines\"\u003eSeverity Guidelines for Security Issues\u003c/a\u003e to determine the rating for the \u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity\u003c/b\u003e\u003cb\u003e-\u003c/b\u003e* label. Remember to also consider any mitigating factors that might reduce the severity, such as unusual or excessive interaction, or the feasibility of reliably triggering the condition in the wild (e.g. race conditions are notoriously difficult).\u003c/p\u003e\r\n\u003cp\u003eOnce you’ve determined the severity you can assign the milestone and priority according to the following guidelines:\r\n\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity-Critical\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003ePri-0\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003eCurrent stable milestone (or earliest milestone impacted)\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity-High\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003ePri-1\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003eCurrent stable milestone (or earliest milestone impacted)\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity-Medium\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003ePri-2\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003eNext stable milestone\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity-Low\u003c/b\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003ePri-3\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003eNext stable milestone\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity-\u003cspan style\u003d\"font-size:10pt\"\u003eNone\u003c/span\u003e\u003c/b\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003eNo priority required\u003c/li\u003e\u003cli\u003eNo milestone required\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\r\n\u003cp\u003eSet the SecImpacts flags to identify the affected branches, so we know what needs to be merged and have historical tracking data:\u003c/p\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003eSecImpacts-Stable\u003c/b\u003e - Affects shipping branch and should be considered for merge.\u003c/li\u003e\u003cli\u003e\u003cb\u003eSecImpacts-Beta\u003c/b\u003e - Affects beta branch and fix and should be considered for merge.\u003c/li\u003e\u003cli\u003e\u003cb\u003eSecImpacts-None\u003c/b\u003e - Doesn't affect a shipping branch (no merge required).\u003c/li\u003e\u003c/ul\u003e\u003cp\u003eThe milestone targets may shift slightly to adjust for a release schedule. For example, when the current stable is at the end of its cycle you will generally bump all open bugs to target the next stable milestone.\u003c/p\u003e\u003cp\u003eAlso, it's important to ensure that all security bugs are set to \u003cb\u003eType-Security\u003c/b\u003e and any security bugs with a severity other than \u003cb style\u003d\"font-family:arial,sans-serif\"\u003eSecurity-Severity\u003c/b\u003e\u003cb\u003e-None\u003c/b\u003e include the \u003cb\u003eRestrict-View-SecurityTeam\u003c/b\u003e flag.\u003c/p\u003e\r\n\u003cp\u003eThe remaining triage follows the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/getting-involved/bug-triage\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003estandard guidelines\u003c/a\u003e. Key points to remember are the following:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003eUpdate the status to \u003cb\u003eUntriaged\u003c/b\u003e, \u003cb\u003eAvailable\u003c/b\u003e, \u003cb\u003eAssigned\u003c/b\u003e, or \u003cb\u003eStarted\u003c/b\u003e (as appropriate).\u003c/li\u003e\r\n\u003cli\u003eApply the following labels as needed: \u003cb\u003eOS-\u003c/b\u003e*, \u003cb\u003eFeature-\u003c/b\u003e*, \u003cb\u003eArea-\u003c/b\u003e*, \u003cb\u003eInternals-\u003c/b\u003e*, \u003cb\u003eCrash\u003c/b\u003e.\u003c/li\u003e\r\n\u003cli\u003eAny changes that will be merged to the beta branch must be labeled as \u003cb\u003eReleaseBlock-Stable\u003c/b\u003e.\u003c/li\u003e\u003cli\u003eEnsure the comment adequately explains any status changes \u003ci\u003e(severity, milestone, and priority assignment generally require explanatory text)\u003c/i\u003e.\u003c/li\u003e\u003c/ul\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Upstreaming-WebKit-Bugs\" /\u003eUpstreaming WebKit Bugs\u003c/h3\u003e\u003cdiv\u003eAny WebKit bugs should be upstreamed to \u003ca href\u003d\"http://bugs.webkit.org/\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ebugs.webkit.org\u003c/a\u003e immediately after verification, basic analysis to isolate the issue, and reducing any test cases to a manageable size. When upstreaming WebKit security bugs, remember the following points:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eFile against the security component\u003c/li\u003e\u003cli\u003eInclude a link back to the Chromium bug in your comment\u003c/li\u003e\u003cli\u003eInclude a credit to the original reporter if appropriate\u003c/li\u003e\u003cli\u003eCC any Chromium Team members working on the bug downstream\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Getting-Access-to-WebKit-Security-Bugs\" /\u003eGetting Access to WebKit Security Bugs\u003c/h4\u003e\u003cdiv\u003eAny members of the Chromium Security Team involved in bug triage will need to join the \u003ca href\u003d\"http://www.webkit.org/security/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eWebKit Security Group\u003c/a\u003e. If you're not already on WebKit Security, please ask another Chromium Security Team member to nominate you. After joining you'll need to request security bug access (this can be done by replying to your confirmation email). Once bug access is granted, you'll need to configure your account to get emailed on all inbound security bugs. You do this by adding \u003cb\u003ewebkit-security-unassigned@lists.webkit.org\u003c/b\u003e to the \u003cb\u003eUser Watching\u003c/b\u003e section on the \u003ca href\u003d\"https://bugs.webkit.org/userprefs.cgi?tab\u003demail\" rel\u003d\"nofollow\"\u003eEmail Preferences\u003c/a\u003e tab on WebKit's bugzilla. (You'll probably want to create a Gmail filter on these messages as well.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eLanding WebKit Patches\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eTo contribute a patch to WebKit you can generally just follow the \u003ca href\u003d\"http://www.webkit.org/coding/contributing.html\" rel\u003d\"nofollow\"\u003einstructions on webkit.org\u003c/a\u003e. However, one additional step must be taken to land patches for security bugs, because the WebKit Commit Bot and the WebKit Review Bot are not included in the WebKit Security Group. This means your patch will not be placed in the commit queue after receiving cq+ unless the bots are explicitly given access to the bug. To do this, add these addresses to the cc: list of the WebKit bug:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003ewebkit.review.bot@gmail.com\u003c/li\u003e\u003cli\u003ecommit-queue@webkit.org\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Timeline\" /\u003eTimeline\u003c/h3\u003e\r\n\u003cp\u003eAs a rule, you’ll want to ensure that the full initial triage is performed and the bug is updated within 48 hours of the initial report. During business hours the basic triage and bug update should occur within four hours at most.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Erroneous-Reports\" /\u003eErroneous Reports\u003c/h3\u003e\r\n\u003cp\u003eSome reports are obviously not legitimate, or represent behavior that we do not intend to change. In those cases you should mark the bug as \u003cb\u003eWontFix \u003c/b\u003eor \u003cb\u003eInvalid \u003c/b\u003e(as appropriate) and provide a simple explanation to the reporter. For non-security bugs erroneously reported via the security template, you should remove all security labels, set the “Crash” label if appropriate, add in the appropriate area/feature labels, and set the status to “Untriaged.”\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Shepherding\" /\u003eShepherding\u003c/h2\u003e\r\n\u003cp\u003eThe shepherding process starts with finding an owner for a bug. If you have access to security bugs, you can find a list of all open security bugs without an owner \u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dType%3DBug-Security+-Security_SecSeverity%3DNone+-has%3Aowner\u0026amp;sort\u003d-security_secseverity\u0026amp;colspec\u003dID+Pri+Area+Feature+Status+Summary+Modified+Owner+Mstone+OS+Secseverity\u0026amp;x\u003dmstone\u0026amp;y\u003darea\u0026amp;cells\u003dtiles\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e. When analysing a bug for triage you’ll often find that you can work out a solution yourself. If that’s the case and you have time to develop a patch, then this is usually the most expedient solution to getting a fix out.\u003c/p\u003e\r\n\u003cp\u003eFor bugs that you can’t fix yourself, you’ll need to find an owner. If you don’t know who to assign a bug to, it’s often best to start by asking other members of the security team if they’re familiar with the code. Then they can either take the ownership of the bug, or point you to a developer who would make a good owner.\u003c/p\u003e\r\n\u003cp\u003eIf no one on the security team has a good suggestion, you’ll generally have to use svn blame or some other means to track back one of the original developers of the code. If you don’t have a checkout handy, you can always use the annotate feature on \u003ca href\u003d\"http://src.chromium.org/\"\u003ehttp://src.chromium.org/\u003c/a\u003e.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Following-Up\" /\u003eFollowing Up\u003c/h3\u003e\r\n\u003cp\u003ePriorities and schedules vary between developers. So, when you assign a security bug to an owner you should make sure you convey the timeline you’re expecting for a fix. If you don’t see regular progress in the bug report, you may need to manually follow up with the owner. Oftentimes, the bug just ended up being harder to reproduce or fix than it originally appeared, so it’s a good idea to offer help whenever there are unanticipated delays.\u003c/p\u003e\r\n\u003cp\u003eKeep in mind that on average we get high severity bugs fixed on the release branch within \u003ci\u003e30 days\u003c/i\u003e of the initial report, and almost always within \u003ci\u003e60 days\u003c/i\u003e at the most. For critical severity bugs we have a hard deadline of 60 days from initial report to a shipping fix.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Handling-a-Fix\" /\u003eHandling a Fix\u003c/h3\u003e\r\n\u003cp\u003eOnce a fix is applied to trunk either you or the owner will change the bug status to \u003cb\u003eMerge-Approved\u003c/b\u003e and switch the \u003cb\u003eRestrict-View-SecurityTeam\u003c/b\u003e label to \u003cb\u003eRestrict-View-SecurityNotify\u003c/b\u003e. At that point you’ll need to evaluate whether the bug is a good candidate for a merge.\u003c/p\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Merging\" /\u003eMerging\u003c/h2\u003e\r\n\u003cp\u003eSecurity fixes often need to be merged to the stable branch (this includes patches to Chrome, WebKit, or other dependencies). Generally this is done by one of the security team members. The first thing you need to do is evaluate whether a fix should be considered for merge. Generally any high or critical severity fixes should be seriously considered for merge. Medium and low-severity fixes can be considered as well if they're particularly worrisome (e.g. bad information leak), have significant non-security impact (e.g. top crasher), or are just very low risk.\u003c/p\u003e\u003cp\u003eOne of the key considerations in determining what to merge is assessing the risk of breakage, which the bug’s owner should be able to convey. For risky fixes you’ll often want to consider bumping it to a later milestone. When you've decided to merge a fix, you should verify with a release manager that the merge window is open for any affected branches. Normally a fix will need to be merged to both the current stable and beta branches.\u003c/p\u003e\u003cp\u003eYou should merge fixes via \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/drover\"\u003edrover\u003c/a\u003e, which automates most of the process. If the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/drover\"\u003edrover merge\u003c/a\u003e does not apply cleanly you may want to reconsider whether the fix will introduce an unacceptable breakage risk. In the event that you can’t use drover to merge a fix, you still have the option of manually merging from a branch checkout. In general, most team members should have a checkout for the current stable, beta and trunk branches. So, this can generally just follow the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/contributing-code\"\u003enormal patch process\u003c/a\u003e, but using a branch repository.\u003c/p\u003e\r\n\u003cp\u003eOnce the fix is successfully merged you will need to update the the bug with the merge revision numbers, and change the status to \u003cb\u003eFixUnreleased\u003c/b\u003e (or to \u003cb\u003eFixed\u003c/b\u003e if the stable branch is not affected) and set the merge status to \u003cb\u003eMerge-Completed\u003c/b\u003e (if drover didn't do so). For beta merges, you should also verify that the \u003cb\u003eReleaseBlock-Stable\u003c/b\u003e flag is present.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Updating-and-Release-Notes\" /\u003eUpdating and Release Notes\u003c/h3\u003e\r\n\u003cp\u003eAfter a patch has been landed (and potentially merged) you’ll need to update the \u003ca href\u003d\"https://docs.google.com/a/google.com/Doc?docid\u003d0AUtTDLyP_VtYY2dxczZrNHpfODhzajZzbWd6\u0026amp;hl\u003den\"\u003esecurity release document\u003c/a\u003e, which is used for tracking security bugs for release notes.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Vulnerability-Rewards-Nomination\" /\u003eVulnerability Rewards Nomination\u003c/h3\u003e\r\n\u003cp\u003eGenerally, once a fix has been applied to trunk we will consider a bug for a vulnerability reward. This will generally be done by the team member shepherding the bug, or the owner if it’s a security team member. To remind yourself that you may want to consider a specific bug you can add the \u003cb\u003ereward-topanel\u003c/b\u003e label in the tracker.\u003c/p\u003e\r\n\u003cp\u003eWhen nominating a bug for a reward, be sure to consider the overall quality, and any additional value the reporter brought to the process. For reference, the general guidelines are listed on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/vulnerability-rewards-program\"\u003eVulnerability Rewards Program\u003c/a\u003e page.\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/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-bug-lifecycle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/156343192838375503"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/156343192838375503"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/156343192838375503"}],"author":[{"name":{"$t":"Justin Schuh"},"email":{"$t":"jschuh@chromium.org"}}],"sites$pageName":{"$t":"security-bug-lifecycle"},"sites$revision":{"$t":"42"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2170430560608352949"},"published":{"$t":"2013-03-25T20:11:59.615Z"},"updated":{"$t":"2013-03-25T20:11:59.641Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-25T20:11:59.615Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Life of a Security Issue (3).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2170430560608352949"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-sheriff/Life%20of%20a%20Security%20Issue%20(3).png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2170430560608352949"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2170430560608352949"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2170430560608352949"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2170430560608352949"}],"author":[{"name":{"$t":"Parisa Tabriz"},"email":{"$t":"parisa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3573124672146951486"},"published":{"$t":"2013-03-25T16:09:05.773Z"},"updated":{"$t":"2013-03-25T16:09:05.781Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-25T16:09:05.773Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Life of a Security Issue (2).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3573124672146951486"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-sheriff/Life%20of%20a%20Security%20Issue%20(2).png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3573124672146951486"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3573124672146951486"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3573124672146951486"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3573124672146951486"}],"author":[{"name":{"$t":"Parisa Tabriz"},"email":{"$t":"parisa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1113107268566850807"},"published":{"$t":"2013-03-22T23:37:15.356Z"},"updated":{"$t":"2013-03-22T23:37:15.363Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-22T23:37:15.356Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Life of a Security Issue (1).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1113107268566850807"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-sheriff/Life%20of%20a%20Security%20Issue%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/1113107268566850807"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1113107268566850807"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1113107268566850807"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1113107268566850807"}],"author":[{"name":{"$t":"Parisa Tabriz"},"email":{"$t":"parisa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6835789967560963074"},"published":{"$t":"2013-03-22T23:34:08.038Z"},"updated":{"$t":"2013-03-22T23:34:08.050Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-22T23:34:08.038Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Life of a Security Issue.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6835789967560963074"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052022592259397387"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/security-sheriff/Life%20of%20a%20Security%20Issue.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6835789967560963074"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6835789967560963074"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6835789967560963074"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6835789967560963074"}],"author":[{"name":{"$t":"Parisa Tabriz"},"email":{"$t":"parisa@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/798840017862142395"},"published":{"$t":"2013-03-11T16:29:51.201Z"},"updated":{"$t":"2013-03-20T00:45:28.513Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-20T00:45:27.115Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Power Management 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb style\u003d\"font-size:10pt;background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e2013-03-11\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003ederat@\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API?\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe Chrome OS UI team.\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThis API is intended to provide a way for extensions and apps to temporarily disable aspects of system power management on Chrome OS. It is a modified version of \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:feecc0bcfef5fbc\" target\u003d\"_blank\" class\u003d\"disabled\"\u003ean earlier proposed API\u003c/a\u003e (see also \u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1CrZJRH5Eoh8A_6o8PwERzVSDSwEr2DDOOn14gekVCb0/edit#\" target\u003d\"_blank\"\u003eadditional implementation details\u003c/a\u003e).\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWhen the user is inactive, Chrome OS dims the screen, turns it off, and eventually suspends the system. It attempts to avoid some or all of these actions when the user is watching video or listening to audio. Some apps may wish to trigger similar behavior on their own; imagine e-book or presentation apps that need to prevent the screen from being dimmed or turned off, or a communication app that needs to prevent the system from suspending so that incoming calls may be received.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eYes, there is an internal need for this API (\u003ca href\u003d\"http://crbug.com/178944\" target\u003d\"_blank\"\u003ehttp://crbug.com/178944\u003c/a\u003e). External users have requested the ability to e.g. disable power management entirely on desktop machines; this API makes it possible to write a simple extension that does so.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eLikely, although the level of control over system power management available to Chrome may vary between different OSes.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eYes, it should be stable. I don't foresee any need to add additional levels of power-management-disabling.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003eRequests will be tracked per-extension.  Since requests are additive, conflicts should not be possible.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eNo UI changes are planned.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003eThis isn't currently planned. It would be possible to add UI that notifies the user when an extension creates a request, though.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eExtensions could use this API to disable power management features indefinitely.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e1) Disable power management features indefinitely while the extension is running, increasing power consumption, decreasing battery life, and possibly confusing the user.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e2) N/A\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e3) N/A\u003c/span\u003e\u003cbr /\u003e\u003cb style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eExtensions will only be able to override power management while the system's lid is open; closing the lid will still suspend the system.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003c/font\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNo. Any outstanding requests will be abandoned when an extension is stopped.\u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cfont\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAn extension could perform actions that trigger Chrome OS's existing automated power-management-disabling behavior.  For example, playing a silent audio file would prevent the system from suspending.\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ci\u003eManifest changes\u003c/i\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003cfont color\u003d\"#666666\"\u003epower\u003c/font\u003e\u003c/b\u003e permission\u003c/span\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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eA new permission that is required in order to call this API's methods.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003cbr /\u003e\u003ci\u003eMethods\u003c/i\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#666666\" face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003erequestKeepAwake\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eRegisters a request to disable power management. Each extension may hold at most one request; when multiple sequential calls are made, only the final one will be honored. When an extension is unloaded, its request will be automatically released.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003e\u003cspan\u003eParameter:\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003elevel (enum [\"system\", \"display\"])\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003eSpecifies the degree to which power management should be disabled.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\"system\"\u003c/font\u003e\u003cfont face\u003d\"Arial\"\u003e: The system will not suspend due to user inactivity, but the screen may still be dimmed or turned off.\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\"display\"\u003c/font\u003e\u003cfont face\u003d\"Arial\"\u003e: The screen will not be dimmed or turned off due to user inactivity. Additionally, the system will not suspend due to user inactivity. If the screen is currently dimmed or turned off due to inactivity, it will be turned on immediately.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#666666\" face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003ereleaseKeepAwake\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eUnregisters an outstanding request to disable power management. Does nothing if no request exists. Previously-deferred power-management-related actions may be performed immediately.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003enone\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent;font-size:10pt\"\u003e\u003cstrike\u003eCan the API initially be Chrome-OS-only?\u003c/strike\u003e This probably won't be an issue; content::PowerSaveBlocker should provide cross-platform support.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent;font-size:10pt\"\u003e\u003cstrike\u003eShould a \"power\" permission be added to the manifest specification or should extensions be able to use this API unconditionally?\u003c/strike\u003e Yes; added.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent;font-size:10pt\"\u003e\u003cstrike\u003eCan the \u003ci\u003ecallback\u003c/i\u003e parameter be omitted from both methods?\u003c/strike\u003e Yes; removed.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial;background-color:transparent;font-size:10pt\"\u003e\u003cstrike\u003eThe initial implementation of this API never made it out of experimental, although \u003ca href\u003d\"https://chrome.google.com/webstore/detail/keep-awake-extension/bijihlabcfdnabacffofojgmehjdielb/reviews?hl\u003den\" target\u003d\"_blank\"\u003ean extension which uses it\u003c/a\u003e was published. Can the new version of the API use the same method names?\u003c/strike\u003e Yes. I'm updating the existing extension to use the chrome.power API if it's present and chrome.experimental.power otherwise.\u003c/span\u003e\u003c/li\u003e\u003c/ol\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/power-management-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/798840017862142395"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/6"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798840017862142395"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798840017862142395"}],"author":[{"name":{"$t":"Dan Erat"},"email":{"$t":"derat@chromium.org"}}],"sites$pageName":{"$t":"power-management-api"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5172235710550263941"},"published":{"$t":"2013-03-13T14:52:01.086Z"},"updated":{"$t":"2013-03-13T14:52:01.099Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-13T14:52:01.086Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"snow-top-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5172235710550263941"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6973608406512395470"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook/snow-top-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5172235710550263941"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5172235710550263941"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5172235710550263941"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5172235710550263941"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3289772389723556100"},"published":{"$t":"2013-03-13T14:49:05.623Z"},"updated":{"$t":"2013-03-13T14:49:05.628Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-13T14:49:05.623Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"snow-top-guts.xcf"},"summary":{},"content":{"type":"image/x-xcf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3289772389723556100"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6973608406512395470"},{"rel":"alternate","type":"image/x-xcf","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook/snow-top-guts.xcf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3289772389723556100"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3289772389723556100"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3289772389723556100"},{"rel":"edit-media","type":"image/x-xcf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3289772389723556100"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1420732639707861641"},"published":{"$t":"2013-03-13T14:48:40.506Z"},"updated":{"$t":"2013-03-13T14:48:40.515Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-13T14:48:40.506Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"snow-bottom-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1420732639707861641"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6973608406512395470"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook/snow-bottom-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1420732639707861641"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1420732639707861641"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1420732639707861641"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1420732639707861641"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2498042481248688972"},"published":{"$t":"2013-03-12T03:11:29.426Z"},"updated":{"$t":"2013-03-12T13:31:21.962Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-12T13:31:21.948Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"alex-top-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2498042481248688972"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/alex-top-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2498042481248688972"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2498042481248688972"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2498042481248688972"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2498042481248688972"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5690571931608240759"},"published":{"$t":"2013-03-12T03:10:53.352Z"},"updated":{"$t":"2013-03-12T03:10:53.361Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-12T03:10:53.352Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"alex-bottom-guts-no-battery.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5690571931608240759"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/alex-bottom-guts-no-battery.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5690571931608240759"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5690571931608240759"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5690571931608240759"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5690571931608240759"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4638488096487314302"},"published":{"$t":"2013-03-12T02:44:52.781Z"},"updated":{"$t":"2013-03-12T03:09:21.283Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-12T03:09:21.267Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"alex-bottom-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4638488096487314302"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/alex-bottom-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4638488096487314302"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4638488096487314302"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4638488096487314302"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4638488096487314302"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5762536556576537762"},"published":{"$t":"2011-06-12T14:46:47.447Z"},"updated":{"$t":"2013-03-12T02:39:18.152Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-12T02:39:15.567Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cocoa 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\"\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003eIntroduction\u003c/h2\u003e\u003cdiv\u003eWhen writing code using Cocoa, there are rules to follow. Anything that uses Objective-C++ must of course follow the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/coding-style/cpp-dos-and-donts\"\u003eC++ guidelines\u003c/a\u003e. However, there are things in Cocoa that are more subtle than they look. Here are a few things to keep in mind.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Banned-Practices\" /\u003eBanned Practices\u003c/h2\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Const-NSObjects\" /\u003eConst NSObjects\u003c/h3\u003e\u003cdiv\u003eThe use of const NSObjects is \u003cb\u003eprohibited\u003c/b\u003e as it makes Clang unhappy. (This is enforced in the presubmit hooks.) See the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/clang-mac\"\u003eMac Clang page\u003c/a\u003e for more details.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Atomic-properties\" /\u003eAtomic properties\u003c/h3\u003e\u003cdiv\u003eThe use of atomic properties is \u003cb\u003eprohibited\u003c/b\u003e. There are differences between how our compilers handle them, and since we don't need them anyway we don't use them. See the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/clang-mac\"\u003eMac Clang page\u003c/a\u003e for more details.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Tracking-rects-and-raw-NSTrackingAreas\" /\u003eTracking rects and raw NSTrackingAreas\u003c/h3\u003e\u003cdiv\u003eTracking rects are tricky to get right. Apple realized that, and in Mac OS X 10.5 introduced the NSTrackingArea object. Unfortunately, that is \u003ci\u003ealso\u003c/i\u003e difficult to get right, and has historically led to \u003ca href\u003d\"http://crbug.com/48709\"\u003enasty crashes\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe use of \u003ccode\u003e-[NSView addTrackingRect:owner:userData:assumeInside:]\u003c/code\u003e is \u003cb\u003eprohibited\u003c/b\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe use of raw \u003ccode\u003eNSTrackingArea\u003c/code\u003es is \u003cb\u003eprohibited\u003c/b\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou are required to use \u003ccode\u003eCrTrackingArea\u003c/code\u003e. Find it at \u003ccode\u003eui/base/cocoa/tracking_area.h\u003c/code\u003e. There are currently (and unfortunately) lots of current usage of tracking rects and \u003ccode\u003eNSTrackingArea\u003c/code\u003es. Please convert them as you encounter them.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-YR-DOIN-IT-RONG\" /\u003eYR DOIN IT RONG\u003c/h2\u003e\u003cdiv\u003eThere are spots of Cocoa that are tricky. Watch out.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Coordinate-conversion\" /\u003eCoordinate conversion\u003c/h3\u003e\u003cdiv\u003eAll code that manages views is required to be correct, and that correctness is more heavily tested when running under \"resolution independence\" or \"HiDPI\", where window coordinates are not the same as view coordinates. (Turn on resolution independence in Quartz Debug.app.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAny time you need to compute window coordinates based on view coordinates, or vice versa, make sure you use the appropriate conversion calls (i.e. \u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e-convertRect:toView\u003c/code\u003e:\u003c/font\u003e and friends). There is a call for each data type and each conversion direction. Also, remember that views have both a \u003ccode\u003e-bounds\u003c/code\u003e and \u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ccode\u003e-frame\u003c/code\u003e\u003c/font\u003e. They are in different coordinate systems.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee \u003ca href\u003d\"http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html\" rel\u003d\"nofollow\"\u003ehttp://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Transforms/Transforms.html\u003c/a\u003e for details.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-base-coordinate-system\" /\u003eThe \"base\" coordinate system\u003c/h3\u003e\u003cdiv\u003eIn doing coordinate conversion, you may run into methods on views that convert to and from the \"base\" coordinate system. \u003ci\u003eThose are almost certainly \u003cb\u003enot\u003c/b\u003e what you are looking for.\u003c/i\u003e When talking about views, the \"base\" coordinate system is referring to the raw backing pixels. If you need to precisely align to pixels, they are correct, but most of the time they do not do what you think they are doing.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e(This problem is compounded by the references in methods on windows to the \"base\" coordinate system, which is indeed the window coordinate system.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee \u003ca href\u003d\"http://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/6b989dcbb79e9ba/029eeb633c5287cc\"\u003ehttp://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/6b989dcbb79e9ba/029eeb633c5287cc\u003c/a\u003e for details.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Zero-sized-windows\" /\u003eZero-sized windows\u003c/h3\u003e\u003cdiv\u003eThe Mac's windowserver has issues with zero-sized windows, \u003ca href\u003d\"http://crbug.com/78973\"\u003espewing tons of junk to the console\u003c/a\u003e, yet it's not immediately obvious when you resize them that it's a problem.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEnsure that you do not resize windows to be empty, either implicitly or explicitly.\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/cocoa-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/5762536556576537762"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5762536556576537762"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5762536556576537762"}],"author":[{"name":{"$t":"Avi Drissman"},"email":{"$t":"avi@chromium.org"}}],"sites$pageName":{"$t":"cocoa-dos-and-donts"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/903657469582497800"},"published":{"$t":"2011-12-20T00:49:39.887Z"},"updated":{"$t":"2013-03-11T20:22:04.259Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T01:14:59.151Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Proposed \u0026 Proposing New Changes"},"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:6;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":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/380426731291280413"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/903657469582497800"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/903657469582497800"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/903657469582497800"}],"author":[{}],"sites$pageName":{"$t":"proposed-changes"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"WSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7183202539050941057"},"published":{"$t":"2012-04-28T01:11:53.002Z"},"updated":{"$t":"2013-03-08T22:29:09.509Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-08T22:29:06.606Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"NFS-quickstart"},"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\" style\u003d\"font-size:20px\"\u003eWork In Progress.. \u003c/font\u003e\u003cfont size\u003d\"2\"\u003e(None of this is officially supported so \u003c/font\u003e\u003c/b\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003eCLs appreciated\u003c/font\u003e\u003c/b\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003e)\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Build-a-suitable-kernel-and-rootfs\" /\u003eBuild a suitable kernel and rootfs\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eOption 1:\u003c/b\u003e \u003cb\u003eWith ./build_packages\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./set_shared_user_password.sh \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#Needed only the first time in your chroot so you can login to the rootfs\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eUSE\u003dnfs ./build_packages --board\u003d${BOARD} --nowithfactory  \u003cfont color\u003d\"#a64d79\"\u003e#nowithfactory is important. If you miss it you will boot into factory installer mode\u003c/font\u003e\u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\nWith this option you can do your regular cros_workon + emerge commands (and any optimizations like cros_workon_make etc). But you have to run the mod_image_for_test scripts on the /build/\u0026lt;board\u0026gt; dir or hand edit they etc/shadow files etc to login\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eOption 2:\u003c/b\u003e \u003cb\u003eWith ./quickly\u003c/b\u003e \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e(DONT USE YET - if you want incremental compiles etc. This is useful to create a rootfs different from /build/\u0026lt;board\u0026gt; if you want to mod for test etc)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eQuickly is a simple script (integrated ./build_packages/image) to enable creating a rootfs ready for NFS boot. You can cherry-pick \u003ca href\u003d\"https://gerrit.chromium.org/gerrit/21579\"\u003ehttps://gerrit.chromium.org/gerrit/21579\u003c/a\u003e into src/scripts . This is not a supported script. It contains pieces of other scripts to speed up building a test image for developers. If you are not comfortable with editing the script, use option 1 above. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe advantage of using this script is \u003c/div\u003e\r\n\u003cdiv\u003e  1) It creates a new rootfs dir that you can hackon/delete unlike option 1 which reuses /build/\u0026lt;board\u0026gt; which is polluted with factory install hacks etc\u003c/div\u003e\r\n\u003cdiv\u003e  2) It runs mod_image_for_test for you so you should be running closer to a test image\u003c/div\u003e\r\n\u003cdiv\u003e  3) If you have to do any hacks to the rootfs generated feel free to update the ./quickly script and update the CL\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e./quickly --board\u003ddaisy --help         \u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e./quickly --board\u003ddaisy        #this runs build_packages and parts of mod_image_for_test\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eThe output is a ChromiumOS test image in \u003cb\u003e../build/images/\u0026lt;board\u0026gt;/quickly/\u003c/b\u003e. Use this as your rootfs in the NFS server setup if you go down this path. You will have to run your regular emerge commands and then run ./quickly to regenerate your rootfs again. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTODO(yournamehere):./quickly will need to incrementally update the rootfs and emerge only packages that have been updated. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Setting-up-an-NFS-server\" /\u003eSetting up an NFS server\u003c/h2\u003e\r\n\u003cb\u003e\r\nStep 1\u003c/b\u003e: install the NFS server package (these instructions for Ubuntu 10.04 Lucid). This enables the NFS server built into your kernel. When it starts you may notice that a number of new modules have been loaded into your kernel (nfsd, exportfs, lockd, etc.)\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo apt-get install nfs-kernel-server\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cb\u003eStep 2\u003c/b\u003e:The 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 vi /etc/exports\u003c/code\u003e) to look something like this (changing IP subnets as appropriate):\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003e/home/$USER/cros_i1/chroot 172.22.0.0/16(rw,fsid\u003d0,nohide,no_subtree_check,async)\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e/home/$USER/cros_i1/chroot/build/daisy 172.22.0.0/16(rw,nohide,no_subtree_check,async,no_root_squash)\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eStep 3\u003c/b\u003e:Restart the NFS kernel server:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cbr /\u003e\r\n\u003ccode\u003e$ sudo /etc/init.d/nfs-kernel-server restart\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e * Stopping NFS kernel daemon                                            [ OK ] \u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e * Unexporting directories for NFS kernel daemon...                      [ OK ] \u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e * Exporting directories for NFS kernel daemon...                        [ OK ] \u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e * Starting NFS kernel daemon                                            [ OK ]\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cb\u003eStep 4\u003c/b\u003e:If it is working you will see something like:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ rpcinfo -p localhost |grep nfs\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    100003    2   udp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    100003    3   udp   2049  nfs\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e    100003    4   udp   2049  nfs\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\u003cb\u003eStep 5\u003c/b\u003e:Test 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\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003e$ sudo mkdir -p /tmp/nfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e$ sudo mount -t nfs localhost:/nfsroot /tmp/nfs4\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e$ ls /tmp/nfs\u003c/code\u003e\u003c/div\u003e\r\n\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\r\n\u003cdiv\u003e\u003ccode\u003e$ sudo umount /tmp/nfs\u003c/code\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/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-U-Boot\" /\u003eU-Boot\u003c/h2\u003e\r\n\u003cdiv\u003eStep 0: Make sure you have \u003ca href\u003d\"https://gerrit.chromium.org/gerrit/#change,21213\" style\u003d\"font-family:arial,sans-serif;text-align:left\"\u003ehttps://gerrit.chromium.org/gerrit/#change,21213\u003c/a\u003e in your uboot. It enables netboot/nfs. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\nFirst, make sure that you have flashed the developer U-Boot onto your board/SD card (aka legacy_image.bin). 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 (outdated and refers only to seaboard). Email chromium-os-dev@ if you dont have uboot on your device. When 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\r\n\u003cbr /\u003e\r\n\u003cfont color\u003d\"#ff0000\"\u003eTODO(anush): Save it in a nice to run command. Keep in mind running dhcp will overwrite any serverip configuration with what is provided so we need to set serverip after getting a dhcp IP address. \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ff0000\"\u003eMake sure you connect to the onboard ethernet jack on Daisy NOT with a USB Dongle \u003cbr /\u003e\u003c/font\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003ccode\u003esetenv ethaddr 00:1A:11:XX:XX:XX                         # recommend using the hex version of your employee id to avoid collisions TODO(XXX):resolve with real MACs\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003edhcp                                                     # Get yourself a DHCP address. \u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eset nfsserverip 172.22.XX.XX                             # dhcp from the step above will overwrite your serverip\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eset serverip 172.22.XX.XX\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003eset rootpath /home/$USER/cros_i1/chroot/build/daisy      # point to quickly rootfs if you use that\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003esetenv bootdev_bootargs root\u003d/dev/nfs rw nfsroot\u003d${nfsserverip}:${rootpath} ip\u003ddhcp noinitrd daisy nfsrootdebug; run regen_all\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003enfs /home/$USER/cros_i1/chroot/build/daisy/boot/vmlinux.uimg\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003ebootm\u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-NFS-Troubleshooting-Debugging\" /\u003eNFS Troubleshooting/Debugging\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e* If you delete and recreate your NFS root directory make sure you restart the NFS server \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv\u003e* If you dont have network connectivity, try restarting shill from the console (I will send out a CL to fix this)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eTODO(yournamehere): Add notes on using debugging chrome with an NFS root\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/nfs-quickstart"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7183202539050941057"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/457899783549421505/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7183202539050941057"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7183202539050941057"}],"author":[{}],"sites$pageName":{"$t":"nfs-quickstart"},"sites$revision":{"$t":"30"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/346836078459610439"},"published":{"$t":"2010-12-13T17:22:51.504Z"},"updated":{"$t":"2013-03-06T21:32:38.564Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-06T21:32:36.206Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How to boot Ubuntu on a Cr-48"},"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-Free-up-some-SSD-space-for-Ubuntu\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eFree up some SSD space for Ubuntu\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Acquire-an-Ubuntu-filesystem\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eAcquire an Ubuntu filesystem\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Configure-the-kernel\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eConfigure the kernel\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Set-boot-priority\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eSet boot priority\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Footnotes\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eFootnotes\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Ugh\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eUgh\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Double-ugh\"\u003e\u003cstrong\u003e5.2 \u003c/strong\u003eDouble-ugh\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\u003cspan style\u003d\"font-size:20px;font-weight:bold\"\u003eIntroduction\u003c/span\u003e\r\n\u003cp\u003eWhile \u003ca href\u003d\"http://www.chromium.org/chromium-os/chromiumos-design-docs/verified-boot\" target\u003d\"_blank\"\u003eChrome OS verified boot\u003c/a\u003e protects against unintended system modification by malicious or buggy software, \u003cb\u003ethe ability to hack your own device is an \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/developer-mode\"\u003eintentional\u003c/a\u003e design feature of Google Chrome notebooks\u003c/b\u003e. The instructions for \u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide\"\u003ebuilding your own version of Chromium OS\u003c/a\u003e, and installing it on a Cr-48 are given elsewhere. Some enthusiasts, however, may want to install something completely different. This page provides an example, showing how the official Chrome OS software can coexist with \u003ca href\u003d\"http://www.ubuntu.com/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eUbuntu\u003c/a\u003e, a popular linux distribution. I'm assuming that you're already somewhat familiar with the Chromium OS development environment.\u003cbr /\u003e\u003c/p\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e\u003cb\u003eCaution: Modifications you make to the system are not supported by Google, may cause hardware\u003c/b\u003e\u003c/span\u003e\u003cb style\u003d\"font-size:10pt\"\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e, software or security\u003c/span\u003e\u003c/b\u003e\u003cb style\u003d\"font-size:10pt\"\u003e issues and may void warranty.\u003c/b\u003e\u003cspan style\u003d\"font-size:10pt\"\u003e Be very careful.\u003c/span\u003e\u003c/div\u003e\r\n\u003cp\u003eThese instructions work on the Cr-48 as originally shipped. There are several magic numbers that may change following software updates or on other Chromium OS-based machines. Even if the numbers don't exactly match, the basic idea is the same.\u003cbr /\u003e\u003c/p\u003e\r\n\u003cp\u003eIn the examples below:\u003c/p\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eThe Cr-48 shell is formatted like this.\u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003eThe Chromium OS build chroot is formatted like this.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:monospace;line-height:13px\"\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e\u003cfont color\u003d\"#783f04\"\u003eThe standard linux workstation shell is formatted like this.\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:20px;font-weight:bold;line-height:normal\"\u003eFair warning\u003c/span\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003eThis is kind of a cheat. The Cr-48's boot process does not support \u003ccode\u003e\u003ca href\u003d\"http://www.ibm.com/developerworks/linux/library/l-initrd.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003einitrd\u003c/a\u003e\u003c/code\u003e, which is required by Ubuntu. That leaves us three possibilities:\u003c/p\u003e\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003eUse the existing Chrome OS kernel with the Ubuntu rootfs.\u003c/li\u003e\r\n\u003cli\u003eRecompile the Ubuntu kernel to do without \u003ccode\u003einitrd\u003c/code\u003e (\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information/how-to-boot-ubuntu-on-a-cr-48#TOC-Ugh\"\u003eugh\u003c/a\u003e).\u003c/li\u003e\r\n\u003cli\u003eModify the Chrome OS bootstub to handle \u003ccode\u003einitrd\u003c/code\u003e (\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information/how-to-boot-ubuntu-on-a-cr-48#TOC-Double-ugh\"\u003edouble-ugh\u003c/a\u003e).\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eLet's take door #1.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Free-up-some-SSD-space-for-Ubuntu\" /\u003eFree up some SSD space for Ubuntu\u003c/h2\u003e\r\n\u003cdiv\u003eTo begin our journey, first switch the Cr-48 into \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information\" target\u003d\"_blank\"\u003edeveloper mode\u003c/a\u003e and reboot.  When you see the blue frowny face with the \"Chrome OS verification is turned off\" message, either wait 30 seconds or hit Ctrl-D to boot immediately. This screen is always shown when booting in developer mode, to ensure that someone doesn't change your OS without your knowledge.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSwitch to \u003ca href\u003d\"http://www.chromium.org/poking-around-your-chrome-os-device#TOC-Get-the-command-prompt-through-VT-2\" target\u003d\"_blank\"\u003eVT2\u003c/a\u003e (press [ Ctrl ] [ Alt ] [ \u003d\u0026gt; ]), and log in as user 'chronos' (no password required), then run \u003ccode\u003esudo bash\u003c/code\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo prevent the lock screen from logging you out of VT2, leave Chrome OS parked on the login screen. To prevent the backlight from dimming while in VT2, run \u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003esudo initctl stop powerd\u003c/span\u003e.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTake a look at the SSD layout. It should be something like this (the UUID values will all be different, of course):\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\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\u003elocalhost ~ # \u003cb\u003ecgpt show /dev/sda\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     start      size    part  contents\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e         0         1          PMBR (Boot GUID: 045E5C92-6F57-9B46-BDCC-99BFF876E469)\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e         1         1          Pri GPT header\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e         2        32          Pri GPT table\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    266240  22622208       1  Label: \"STATE\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: Linux data\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 1844A16D-AEC9-7C4B-9553-C3EB4814F6BB\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      4096     32768       2  Label: \"KERN-A\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: D176DC60-81F1-654E-8953-E3D28019738C\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Attr: priority\u003d3 tries\u003d0 successful\u003d1\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  27082752   4194304       3  Label: \"ROOT-A\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS rootfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 0193CA51-DA12-9847-A715-C90433E55F60\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     36864     32768       4  Label: \"KERN-B\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: F1A2C65C-CC22-FF4A-A8BC-67BA233F3D40\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Attr: priority\u003d0 tries\u003d15 successful\u003d0\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  22888448   4194304       5  Label: \"ROOT-B\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS rootfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: B3361FB5-4DAC-9344-B7E5-870B7AC5FEA1\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        34         1       6  Label: \"KERN-C\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: B6954485-4295-9749-956A-C315B01FB684\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Attr: priority\u003d0 tries\u003d15 successful\u003d0\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        35         1       7  Label: \"ROOT-C\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS rootfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 5B5202B5-F74B-714E-9538-ADE56B2E5662\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     69632     32768       8  Label: \"OEM\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: Linux data\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 84971802-0D1C-504B-9CB5-DEA896F0AD3F\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        36         1       9  Label: \"reserved\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS reserved\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 77375DA6-8F07-704A-BBF4-2BCA662BFDFF\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        37         1      10  Label: \"reserved\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS reserved\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 6880F478-EB05-8B4B-B951-94A96076263E\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        38         1      11  Label: \"reserved\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS reserved\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 12DDC236-8FDF-4049-9A2D-10FAB17D3AA9\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    233472     32768      12  Label: \"EFI-SYSTEM\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: EFI System Partition\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 045E5C92-6F57-9B46-BDCC-99BFF876E469\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  31277199        32          Sec GPT table\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  31277231         1          Sec GPT header\u003c/code\u003e\u003c/div\u003e\r\n\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\u003eThe units are 512-byte disk sectors.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eOn Chrome OS there are several bootable images, each composed of a kernel and a root filesystem (rootfs).  For a given image, the kernel and rootfs are stored on a pair of consecutive partitions.  Two of these images, Image-A and Image-B, are for official Chrome OS:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eKERN-A and ROOT-A on partitions \u003ccode\u003e/dev/sda2\u003c/code\u003e and \u003ccode\u003e/dev/sda3\u003c/code\u003e\u003c/li\u003e\r\n\u003cli\u003eKERN-B and ROOT-B on partitions \u003ccode\u003e/dev/sda4\u003c/code\u003e and \u003ccode\u003e/dev/sda5\u003c/code\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWhen the Chrome OS autoupdater downloads a new image (every six weeks or so, as new versions are pushed out), it alternately stores it in Image-A and Image-B - whichever image isn't currently running.  The autoupdater even runs in developer mode, as long as we are running an official Chrome OS image.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFor Ubuntu, we'll use the currently unassigned Image-C, composed of KERN-C and ROOT-C on partitions \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e/dev/sda6\u003c/code\u003e and \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e/dev/sda7\u003c/code\u003e, respectively.\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\u003eHowever, initially they are too small so, first we need to grow them by stealing from the upper half of the stateful partition, STATE (\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e/dev/sda1\u003c/code\u003e).  Initially, STATE is 22622208 512-byte sectors, or just under 11 GB.  From this we'll set aside 16 MB for KERN-C, and 5 GB for ROOT-C.\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\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003eumount /mnt/stateful_partition\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecgpt add -i 1 -b 266240    -s 12103680 -l STATE   /dev/sda\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecgpt add -i 6 -b 12369920  -s 32768    -l KERN-C  /dev/sda\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecgpt add -i 7 -b 12402688  -s 10485760 -l ROOT-C  /dev/sda\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\u003eUsing these values ensures that only the original STATE partition is affected.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNow the partition table should look something like this (changes in \u003cb\u003ebold\u003c/b\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\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003elocalhost ~ # \u003cb\u003ecgpt show /dev/sda\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     start      size    part  contents\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e         0         1          PMBR (Boot GUID: 045E5C92-6F57-9B46-BDCC-99BFF876E469)\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e         1         1          Pri GPT header\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e         2        32          Pri GPT table\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    \u003cb\u003e266240\u003c/b\u003e  \u003cb\u003e12103680\u003c/b\u003e       1  Label: \"STATE\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: Linux data\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 1844A16D-AEC9-7C4B-9553-C3EB4814F6BB\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e      4096     32768       2  Label: \"KERN-A\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: D176DC60-81F1-654E-8953-E3D28019738C\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Attr: priority\u003d3 tries\u003d0 successful\u003d1\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  27082752   4194304       3  Label: \"ROOT-A\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS rootfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 0193CA51-DA12-9847-A715-C90433E55F60\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     36864     32768       4  Label: \"KERN-B\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: F1A2C65C-CC22-FF4A-A8BC-67BA233F3D40\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Attr: priority\u003d0 tries\u003d15 successful\u003d0\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  22888448   4194304       5  Label: \"ROOT-B\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS rootfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: B3361FB5-4DAC-9344-B7E5-870B7AC5FEA1\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  \u003cb\u003e12369920\u003c/b\u003e     \u003cb\u003e32768\u003c/b\u003e       6  Label: \"KERN-C\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: B6954485-4295-9749-956A-C315B01FB684\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Attr: priority\u003d0 tries\u003d15 successful\u003d0\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  \u003cb\u003e12402688\u003c/b\u003e  \u003cb\u003e10485760\u003c/b\u003e       7  Label: \"ROOT-C\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS rootfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 5B5202B5-F74B-714E-9538-ADE56B2E5662\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e     69632     32768       8  Label: \"OEM\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: Linux data\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 84971802-0D1C-504B-9CB5-DEA896F0AD3F\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        36         1       9  Label: \"reserved\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS reserved\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 77375DA6-8F07-704A-BBF4-2BCA662BFDFF\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        37         1      10  Label: \"reserved\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS reserved\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 6880F478-EB05-8B4B-B951-94A96076263E\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e        38         1      11  Label: \"reserved\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: ChromeOS reserved\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 12DDC236-8FDF-4049-9A2D-10FAB17D3AA9\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e    233472     32768      12  Label: \"EFI-SYSTEM\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              Type: EFI System Partition\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e                              UUID: 045E5C92-6F57-9B46-BDCC-99BFF876E469\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  31277199        32          Sec GPT table\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e  31277231         1          Sec GPT header\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\r\n\u003cdiv\u003eAt this point we should destroy the STATE partition contents, because otherwise at the next boot the startup scripts may notice that it's corrupted and will erase it using the old size (obtained from dumpe2fs) and not the new one. Best to be safe and just zap it now. This will take a couple of minutes to run:\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\u003ccode\u003edd if\u003d/dev/zero of\u003d/dev/sda bs\u003d131072 seek\u003d1040 count\u003d47280\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\u003eTo speed up SSD access, we use a block size of 131,072 bytes (128 KB), which aligns with the SSD erase size.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAnd now reboot so that the startup script recreates the required files in the stateful partition. This will do a safe wipe first, so you'll have to wait a bit (again).\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAt this point we're through fiddling with the partition table, so you may want to go back to VT2 and set a password according to these \u003ca href\u003d\"http://www.chromium.org/poking-around-your-chrome-os-device#TOC-Get-the-command-prompt-through-VT-2\"\u003einstructions\u003c/a\u003e.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Acquire-an-Ubuntu-filesystem\" /\u003eAcquire an Ubuntu filesystem\u003c/h2\u003e\r\n\u003cdiv\u003eFirst, although the Cr-48 CPU and BIOS is 64-bit, the kernel and rootfs are presently 32-bit. Since we're reusing the Chrome OS kernel, we'll download and use the 32-bit ubuntu-10.10-desktop-i386.iso from an \u003ca href\u003d\"https://launchpad.net/ubuntu/+cdmirrors\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eUbuntu CD mirror\u003c/a\u003e.  For example:\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\u003cfont color\u003d\"#783f04\" face\u003d\"monospace\"\u003ewget http://mirror.anl.gov/pub/ubuntu-iso/CDs/10.10/ubuntu-10.10-desktop-i386.iso\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\u003eSecond, even in developer mode, the Cr-48 will only boot external drives that are signed by Google. That means we can't (easily) use the normal Ubuntu live installer. Instead, I'll create an empty disk image file with a 5G partition on it, and use \u003ca href\u003d\"http://www.virtualbox.org/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eVirtualBox\u003c/a\u003e to install into that. Then I'll transfer that raw partition onto the Cr-48.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo install VirtualBox (and its command line management tool, \u003ccode\u003eVBoxManage\u003c/code\u003e) on Ubuntu:\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\u003e\u003cfont color\u003d\"#783f04\"\u003esudo aptitude install virtualbox-ose\u003c/font\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\u003eI'll do this on my normal linux workstation, of course. I'll create the file inside the chroot so I can use the cgpt tool, but I'll run VirtualBox from outside. We could create the file using fdisk, but using cgpt ensures all the numbers match. You could also build the cgpt tool for use external to the chroot, but whatever. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWe'll need our disk image to be a little larger than 5G so it has room for the GPT headers.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSo, do the following in the \u003ca href\u003d\"http://www.chromium.org/chromium-os/developer-guide#TOC-Create-a-chroot\"\u003eChromium OS chroot\u003c/a\u003e:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\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\u003cfont color\u003d\"#9900ff\"\u003ecd /tmp\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003erm -rf test.bin\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003edd if\u003d/dev/zero bs\u003d512 seek\u003d10486015 count\u003d1 of\u003dtest.bin\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003ecgpt create test.bin\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003ecgpt boot -p test.bin\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900ff\"\u003ecgpt add -b 128 -s 10485760 -t data -l ubuntu test.bin\u003c/font\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\u003eFrom outside the chroot, translate the binary into a virtualbox disk:\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\u003e\u003cfont color\u003d\"#7f6000\"\u003ecd /path/to/chromiumos/chroot/tmp \u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace\"\u003e\u003ccode\u003e\u003cfont color\u003d\"#7f6000\"\u003eVBoxManage convertdd test.bin test.vdi --format VDI\u003c/font\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\u003cdiv\u003eLaunch the VirtualBox GUI (\u003ccode\u003e\u003cfont color\u003d\"#783f04\"\u003evirtualbox\u003c/font\u003e\u003c/code\u003e) and create a new virtual machine with 2G of RAM. Configure \u003ccode\u003etest.vdi\u003c/code\u003e as the existing hard disk (SATA port 0), and attach the Ubuntu .iso as the IDE secondary master. Everything else can be left as default.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eBoot the virtual machine and install Ubuntu onto \u003ccode\u003e/dev/sda1\u003c/code\u003e.  The Chrome OS kernel does not use swap memory, so be sure to specify partitions manually.  Select the middle \u003ccode\u003e/dev/sda1\u003c/code\u003e, and format it for \u003ccode\u003eext2\u003c/code\u003e, and mount on \u003ccode\u003e/\u003c/code\u003e.  The ubuntu installer should warn you that you have no swap partition, and it will therefore disable swap.  This is what we want.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eOnce Ubuntu is installed, working and updated, shut the virtual machine down and convert the \u003ccode\u003e.vdi\u003c/code\u003e image back into a binary:\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\u003e\u003cfont color\u003d\"#783f04\"\u003eVBoxManage internalcommands converttoraw test.vdi test_new.bin\u003c/font\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\u003eNow, we'll extract just the Ubuntu rootfs partition from the binary file:\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\u003e\u003cfont color\u003d\"#783f04\"\u003edd if\u003dtest_new.bin bs\u003d512 skip\u003d128 count\u003d10485760 of\u003drootfs.bin\u003c/font\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\u003eNext, we copy the ubuntu rootfs directly to the Cr-48 ROOT-C partition (\u003ccode\u003e/dev/sda7\u003c/code\u003e).  To copy the file, run the following command on the Cr-48, where USER@HOST refers to the account and host from which you are copying.  \u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eNote:\u003c/b\u003e the root filesystem is a huge file that will take quite a while to upload.  This is much less painful with a fast network connection, so, if possible, use a USB-to-ethernet adapter to avoid going through Wi-Fi.\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\u003essh USER@HOST cat /path/to/rootfs.bin | dd of\u003d/dev/sda7\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have to use Wi-Fi, you can reduce the wait with a bit of compression (thanks to Jay Lee for pointing this out):\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003essh USER@HOST bzip2 -c /path/to/rootfs.bin | bunzip2 -c | dd of\u003d/dev/sda7\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eIf your network is flaky you might find it easier to use \u003ccode\u003escp\u003c/code\u003e to copy the compressed image to the Cr-48 first, then uncompress and write to \u003ccode\u003e/dev/sda7\u003c/code\u003e. Or you could just copy the \u003ccode\u003erootfs.bin\u003c/code\u003e file to a USB stick instead of using the network, but it's likely to take about as long. You always want to use \u003ccode\u003edd\u003c/code\u003e to copy the rootfs image into \u003ccode\u003e/dev/sda7\u003c/code\u003e, of course.\u003cbr /\u003e\u003cbr /\u003eYou can see that it worked by mounting the new rootfs and looking around:\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\u003emkdir /tmp/urfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003emount /dev/sda7 /tmp/urfs\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003els /tmp/urfs\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\u003eWhile we're looking, let's copy the \u003ccode\u003ecgpt\u003c/code\u003e tool into Ubuntu's rootfs. Make sure it's executable. We'll need this later.\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\u003ecp /usr/bin/cgpt /tmp/urfs/usr/bin/\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003echmod a+rx /tmp/urfs/usr/bin/cgpt\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\u003eWe'll need to copy all the kernel modules too.\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\u003ecd /lib/modules\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecp -ar * /tmp/urfs/lib/modules/\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eThat should do it.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\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\u003eumount /tmp/urfs\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\u003ch2\u003e\u003ca name\u003d\"TOC-Configure-the-kernel\" /\u003eConfigure the kernel\u003c/h2\u003e\r\n\u003cdiv\u003eThe next step is to copy the currently running Chrome OS kernel to KERN-C (\u003ccode\u003e/dev/sda6\u003c/code\u003e).  Remember, an image consists of a kernel and a rootfs on consecutive partitions.  So, to figure out which kernel is running, we can check which partition is currently mounted as the 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\u003ccode\u003erootdev -s\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\u003eIf this prints \u003ccode\u003e/dev/sda3\u003c/code\u003e (ROOT-A), then our kernel is on \u003ccode\u003e/dev/sda2\u003c/code\u003e (KERN-A).\u003c/div\u003e\r\n\u003cdiv\u003eIf this prints \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e/dev/sda5\u003c/span\u003e (ROOT-B), then our kernel is on \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e/dev/sda4\u003c/span\u003e (KERN-B).\u003c/div\u003e\r\n\u003cdiv\u003eAssuming our kernel is on \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e/dev/sda2\u003c/span\u003e (KERN-A), copy it to \u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003e/dev/sda6\u003c/span\u003e (KERN-C):\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\u003edd if\u003d/dev/sda2 of\u003d/dev/sda6\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eNow we need to change the kernel command line to use our Ubuntu rootfs instead of a Chrome OS rootfs. For this, we'll use \u003ccode\u003emake_dev_ssd.sh\u003c/code\u003e, located in the Chromium OS source tree under \u003ccode\u003esrc/platform/vboot_reference/scripts/image_signing/\u003cfont color\u003d\"#000000\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e.\u003c/font\u003e\u003c/font\u003e\u003c/code\u003e  The \u003ca href\u003d\"http://git.chromium.org/cgi-bin/gitweb.cgi?p\u003dvboot_reference.git;a\u003dtree\"\u003elatest version\u003c/a\u003e has options to change individual kernel command lines.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eUse \u003ccode\u003escp\u003c/code\u003e to copy it from your host to the stateful partition of the Cr-48. Note we'll also need \u003ccode\u003ecommon_minimal.sh\u003cfont color\u003d\"#000000\" face\u003d\"Arial, Verdana, sans-serif\"\u003e from the same directory.\u003c/font\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 class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003ecd /mnt/stateful_partition\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003escp USER@HOST:/some/path/to/latest/make_dev_ssd.sh .\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003escp USER@HOST:/some/path/to/latest/common.sh .\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eExtract the existing kernel command line from KERN-C, and save it to a file named \u003ccode\u003efoo.6\u003c/code\u003e (the .6 extension is added by the script):\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\u003esh ./make_dev_ssd.sh --partitions '6' --save_config foo\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\u003e\r\n\u003cdiv\u003eThe default Chrome OS kernel command line looks something like this:\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\" style\u003d\"background-color:rgb(239,239,239);border:1px solid rgb(211,211,211);display:block;padding:0.5em 0px 0.5em 1em;line-height:13px\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cfont color\u003d\"#000000\"\u003equiet console\u003dtty2 init\u003d/sbin/init add_efi_memmap boot\u003dlocal rootwait ro noresume noswap i915.modeset\u003d1 loglevel\u003d1 cros_secure kern_guid\u003d%U tpm_tis.force\u003d1 tpm_tis.interrupts\u003d0 root\u003d/dev/dm-0 dm_verity.error_behavior\u003d3 dm_verity.max_bios\u003d-1 dm_verity.dev_wait\u003d1 dm\u003d\"vroot none ro,0 1740800 verity /dev/sd%D%P /dev/sd%D%P 1740800 1 sha1 50adbfb72bb1efda0c1a86dcd1c1d6a0b46726d1\" noinitrd\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\u003cbr /\u003e\r\n\u003cdiv\u003eThe only editor on the Cr-48 is qemacs, so open foo.6 with qemacs:\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\" style\u003d\"background-color:rgb(239,239,239);border:1px solid rgb(211,211,211);display:block;padding:0.5em 0px 0.5em 1em;line-height:13px\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eqemacs foo.6\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#006000\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003eEdit the file to look like this:\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\u003e\u003cfont color\u003d\"#000000\"\u003econsole\u003dtty1 init\u003d/sbin/init add_efi_memmap boot\u003dlocal rootwait ro noresume noswap i915.modeset\u003d1 loglevel\u003d7 kern_guid\u003d%U tpm_tis.force\u003d1 tpm_tis.interrupts\u003d0 root\u003d/dev/sda7 noinitrd\u003c/font\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\u003eThen save (Ctrl-x Ctrl-s) and exit (Ctrl-x Ctrl-c). qemacs occasionally gets confused, so double-check to be sure you have the right content:\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\u003ecat foo.6\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\u003eFinally, use \u003ccode\u003emake_dev_ssd.sh\u003c/code\u003e to replace the kernel command line in KERN-C:\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\u003esh ./make_dev_ssd.sh \u003c/code\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003e--partitions '6' \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003e--set_config foo\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\u003cdiv\u003eThe kernel command line is part of the kernel partition, and the entire partition must be cryptographically signed in order to work. We can't replace the command line part without affecting the entire kernel partition. The script will save a backup copy before replacing the partition content, but we shouldn't need it.\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-Set-boot-priority\" /\u003eSet boot priority\u003c/h2\u003e\r\n\u003cdiv\u003eAt this point we should have the following situation:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eImage-A is an official Google Chrome OS which can boot either in normal mode or dev-mode.\u003c/div\u003e\r\n\u003cdiv\u003eImage-B is (or will be after the first autoupdate) another official Google Chrome OS which can boot either in normal mode or dev-mode.\u003c/div\u003e\r\n\u003cdiv\u003eImage-C is Chrome OS kernel with a modified command line and an Ubuntu rootfs, which can only boot in dev-mode.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNext, we adjust the priority among the images so we can try out our Ubuntu image. The image priority is an attribute of its kernel partition.  Run \u003ccode\u003ecgpt show /dev/sda\u003c/code\u003e again, to see the kernel priorities:\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\u003cspan style\u003d\"font-family:monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\r\n\u003cdiv\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003elocalhost ~ # \u003cb\u003ecgpt show /dev/sda\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cb\u003e\u003cfont color\u003d\"#38761d\"\u003e...\u003c/font\u003e\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e      4096     32768       2  Label: \"KERN-A\"\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e                              Type: ChromeOS kernel\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e                              UUID: D176DC60-81F1-654E-8953-E3D28019738C\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e                              Attr: \u003cb\u003epriority\u003d3 tries\u003d0 successful\u003d1\u003c/b\u003e\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e...\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace\"\u003e\u003cfont color\u003d\"#38761d\"\u003e     36864     32768       4  Label: \"KERN-B\"\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e                              Type: ChromeOS kernel\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e                              UUID: F1A2C65C-CC22-FF4A-A8BC-67BA233F3D40\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e                              Attr: \u003cb\u003epriority\u003d0 tries\u003d15 successful\u003d0\u003c/b\u003e\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#38761d\"\u003e\r\n\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e...\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e  12369920     32768       6  Label: \"KERN-C\"\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e                              Type: ChromeOS kernel\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e                              UUID: B6954485-4295-9749-956A-C315B01FB684\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003ccode\u003e                              Attr: \u003cb\u003epriority\u003d0 tries\u003d15 successful\u003d0\u003c/b\u003e\u003c/code\u003e\u003c/div\u003e\r\n\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\u003eThe priority determines the order in which the BIOS tries to find a valid kernel (bigger is higher, zero means don't even try). The tries field is decremented each time the BIOS tries to boot it, and if it's zero, the kernel is considered invalid (this lets us boot new images without looping forever if they don't work). The successful field overrides the tries field, but is only set by the OS once it's up and running.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eLet's change the priority of KERN-C to 5:\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\u003ecgpt add -i 6 -P 5 -T 1 -S 0 /dev/sda\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eThis makes KERN-C the highest priority, but only gives us one chance to boot it. That way if it doesn't work, we're not completely stuck.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf you reboot now, you should come up in Ubuntu!  Note that Computer Science Standard Answer #1 applies: It Works For Me™\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf something went wrong and Ubuntu crashes or you powered off, the tries field for KERN-C will have been decremented to 0 and you'll fall back to booting Chrome OS.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAssuming that Ubuntu booted and you could log in, go to Applications-\u0026gt;Accessories-\u0026gt;Terminal to get a shell, and run\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\u003e\u003cfont color\u003d\"#783f04\"\u003esudo cgpt add -i 6 -P 5 -S 1 /dev/sda\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv\u003eThis will mark the Ubuntu kernel as valid, so it will continue to boot next time.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNow you can switch back and forth between the official Chrome OS release and Ubuntu just by flipping the dev-mode switch. Going from dev-mode to normal mode erases STATE (\u003ccode\u003e/dev/sda1\u003c/code\u003e), but much more quickly. Going from normal to dev-mode again would normally do a slow erase of \u003ccode\u003e/dev/sda1\u003c/code\u003e, but since we're booting Ubuntu that doesn't happen.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThis works because although KERN-C has the highest priority, it isn't signed by Google. In dev-mode that's okay, but in normal mode it will be rejected by the BIOS. Since we've set the successful flag to 1, the BIOS won't mark it invalid but will just skip it each time. This makes the normal-mode boot time slightly longer, but only by a second or two. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eOf course you could also switch between images from within dev-mode just by manually setting the priorities with \u003ccode\u003ecgpt\u003c/code\u003e before rebooting.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNote that if the normal image autoupdates, it will probably change the kernel priorities so that Image-C is no longer the highest and the next time you switch to dev mode, you will\u003c/div\u003e\r\n\u003cdiv\u003e  a) have a long wait, \u003c/div\u003e\r\n\u003cdiv\u003e  b) still be running Chrome OS, and \u003c/div\u003e\r\n\u003cdiv\u003e  c) have to use cgpt to raise the KERN-C priority again. \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eBut, because autoupdate only switches between Image-A and Image-B, the Ubuntu kernel and rootfs shouldn't be affected.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Footnotes\" /\u003eFootnotes\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Ugh\" /\u003eUgh\u003c/h3\u003e\r\n\u003cdiv\u003eRecompiling the Ubuntu kernel should be possible, with a few caveats:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eFirst, you'll have to modify or reconfigure the kernel to not use initrd. initramfs should work though.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSecond, official Chrome OS still has a few closed-source hardware drivers.  The pure open-source Chromium OS experience is therefore a bit sub-optimal, although still quite useable.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThird, if you use the 32-bit image, you'll also have to modify the kernel source to boot correctly from the 64-bit Chrome OS BIOS.\u003c/div\u003e\r\n\u003cdiv\u003eSee \u003ca href\u003d\"http://git.chromium.org/cgi-bin/gitweb.cgi?p\u003dkernel.git;a\u003dcommit;h\u003da7cfa1075c04df162d58dc2ed93df6045e9c3271\"\u003ehttp://git.chromium.org/cgi-bin/gitweb.cgi?p\u003dkernel.git;a\u003dcommit;h\u003da7cfa1075c04df162d58dc2ed93df6045e9c3271\u003c/a\u003e for details.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf you use a 64-bit image it shouldn't need the boot hacks, but driver support is much less robust.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFinally, you'll have to sign the kernel yourself and put it into the KERN-C partition. That is actually the easiest step, but it's not really well documented. Look in the developer pages.\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\u003ch3\u003e\u003ca name\u003d\"TOC-Double-ugh\" /\u003eDouble-ugh\u003c/h3\u003e\r\n\u003cdiv\u003e\u003ccode\u003einitrd\u003c/code\u003e is typically handled by the bootloader, which reads the specified image from the disk into RAM and passes the address to the kernel as it's invoked.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe Chrome OS BIOS is a modified EFI BIOS. The bootstub is a standard EFI Application, but it's embedded in the kernel image in a dedicated partition type, rather than accessible through a FAT filesystem. To decrease boot time, the BIOS does not discover or pass the standard disk drive handles to the bootstub, so the bootstub doesn't know anything about disks or filesystems. There is also no Compatibility Support Module in the BIOS. In theory \u003ccode\u003eelilo\u003c/code\u003e or \u003ccode\u003egrub2\u003c/code\u003e could replace the bootstub, but they would have to reimplement some of the device discovery functions normally done by an EFI BIOS.\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 take this on, go for it. That would let us create a kernel partition that just contained an EFI bootloader, which could then chain-boot to external USB drives, etc. That might be kind of cool.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003chr size\u003d\"2\" width\u003d\"100%\" /\u003eSome \u003ca href\u003d\"http://xkcd.com/386/\" rel\u003d\"nofollow\"\u003eclarification\u003c/a\u003e in response to the wharrgarbl resulting from this howto...\u003cbr /\u003e\u003cul\u003e\u003cli\u003eThe dev-mode switch is purely for hackers who want to jailbreak their notebook. The people who build the notebook don't need it (duh).\u003c/li\u003e\u003cli\u003eThings are locked down by default to try to prevent Bad People from rooting your device without your knowledge. It's always been intended that you should be able to root it yourself. Go read the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/developer-mode\"\u003edesign document\u003c/a\u003e for details and background.\u003c/li\u003e\u003cli\u003eIt's not a trick. We really don't care what you do with your own property. As long as you don't crack open the case, you should always be able to \u003ca href\u003d\"http://www.google.com/chromeos/recovery\"\u003erestore it to the original state\u003c/a\u003e.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eI put this hack together in about a day (with another day or so for my coworkers to proofread it) which is why it's so complicated. I \r\nfigured you'd want to see an example sooner rather than later.\u003c/li\u003e\u003cli\u003ewfrichar@chromium.org wrote this. I work for Google, on the Chrome OS verified boot stuff.\u003cbr /\u003e\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/6898459593441562844"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information/how-to-boot-ubuntu-on-a-cr-48"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/346836078459610439"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/346836078459610439"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/346836078459610439"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$pageName":{"$t":"how-to-boot-ubuntu-on-a-cr-48"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4143167531583309928"},"published":{"$t":"2013-02-25T13:55:16.724Z"},"updated":{"$t":"2013-03-05T11:39:20.877Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-05T11:39:19.024Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging NaCl apps in 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\"\u003eIt is not possible to run debugger on Chrome OS without using dev mode. Luckily, debugger uses network connection to communicate with the NaCl debug stub. This makes remote debugging possible with debugger running on a remote machine and NaCl application running on Chrome OS machine.\u003ch2\u003e\u003ca name\u003d\"TOC-Prepare-Chrome-OS-for-NaCl-debugging\" /\u003ePrepare Chrome OS for NaCl debugging\u003c/h2\u003e\u003cdiv\u003eOn chrome://flags page there are two flags related to NaCl debugging. We need to enable \"Native Client GDB-based debugging\" flag and switch \"Restrict Native Client GDB-based debugging by pattern\" to \"Debug everything except secure shell\" or \"Debug only if URL manifest ends with debug.nmf\" value. Changes on chrome://flags page require browser restart to take effect. Log out, close and open the lid to restart the browser. If they are set properly, secure shell extension should work, but NaCl application we are trying to debug should hang waiting for debugger to connect.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Tunneling-debugger-connection\" /\u003eTunneling debugger connection\u003c/h2\u003e\u003cdiv\u003eOnce you launch your NaCl application now, the NaCl debug stub opens 4014 port on Chrome OS machine. This port is not accessible from outside, so we need to tunnel it through ssh connection to remote machine. There are two ways to do this.\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eThe first way is to open new secure shell tab or window and add \"\u003cfont face\u003d\"courier new, monospace\"\u003e-R port-number:localhost:4014\u003c/font\u003e\" to \"SSH Arguments\" field before connecting to remote computer. Then you can use secure shell to launch NaCl debugger on that machine where you should use \"\u003cfont face\u003d\"courier new, monospace\"\u003etarget remote :port-number\u003c/font\u003e\" command to connect to debug stub running on Chrome OS.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eThe second way is to use an existing secure shell tab or window. Press enter, ~, shift+c. This combination opens ssh-prompt where you can enter \"\u003cfont face\u003d\"courier new, monospace\"\u003e-R port-number:localhost:4014\u003c/font\u003e\" command. Pressing enter returns control to normal shell where you can launch NaCl debugger and use \"\u003cfont face\u003d\"courier new, monospace\"\u003etarget remote :port-number\u003c/font\u003e\" command to connect to debug stub running on Chrome OS.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\u003eIn both cases t\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt\"\u003ehe port number can be any free port number on the remote machine above 1024 including 4014.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:10pt\"\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/1711274123824581083"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-chrome-os"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4143167531583309928"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4143167531583309928"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4143167531583309928"}],"author":[{"name":{"$t":"Andrey Khalyavin"},"email":{"$t":"halyavin@chromium.org"}}],"sites$pageName":{"$t":"debugging-nacl-apps-in-chrome-os"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4646031196284912326"},"published":{"$t":"2013-02-06T18:40:03.471Z"},"updated":{"$t":"2013-03-05T05:06:32.190Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-05T05:06:32.176Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"mario-bottom-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4646031196284912326"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6898459593441562844"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information/mario-bottom-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4646031196284912326"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4646031196284912326"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4646031196284912326"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4646031196284912326"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3142364825708442616"},"published":{"$t":"2013-02-06T16:04:12.646Z"},"updated":{"$t":"2013-03-04T18:51:55.204Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-04T18:51:53.192Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Pwnium 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\u003cb style\u003d\"font-weight:normal\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:serif;text-align:center;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium Security Reward Program\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:serif;text-align:center;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ePwnium3@CanSecWest2013 Official Rules\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Pwnium3@CanSecWest2013 Chromium Security Reward Program (\"Program\") is designed to encourage involvement in improving the security of the Chromium project. Participants submit original and unreported exploits relying on security bugs in Chrome OS including Chrome coupled with Flash / Chrome OS kernel and firmware / default apps on Chrome OS (an “Exploit”). Rewards will be awarded to participants who submit full and reliable Exploits (or Incomplete Exploits as described below) with critical impact as determined in the sole discretion of the Judges. NO PURCHASE NECESSARY TO ENTER OR WIN. VOID WHERE PROHIBITED.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eSPONSOR: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Program is sponsored by Google Inc. (“Google” or \"Sponsor\"), a Delaware corporation with principal place of business at 1600 Amphitheatre Parkway, Mountain View, CA, 94043, USA.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eBINDING AGREEMENT: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIn order to enter the Program, you must agree to these Official Rules (“Rules”). Therefore, please read these Rules prior to entry and submission to ensure you understand and agree. You agree that submission of an Exploit in the Program constitutes agreement to these Rules. You may not submit an Exploit to the Program and are not eligible to receive the rewards described in these Rules unless you agree to these Rules. These Rules form a binding legal agreement between you and Google with respect to the Program.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eELIGIBILITY: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTo be eligible to enter the Program, you must be above the age of majority in the country, state, province or jurisdiction of residence (or at least twenty years old in Taiwan) at the time of submission (“You” or “Entrant”). The Program is void in, and not open to residents of, Cuba, Iran, Syria, North Korea or Sudan or to individuals and entities restricted by U.S. export controls and sanctions, and is void in any other nation, state, or province where prohibited or restricted by U.S. or local law.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eEmployees, interns, contractors, and official office-holders of Google and their subsidiaries, affiliates, and their respective directors, officers, employees, advertising and promotion agencies, representatives, and agents (“Program Entities”), and members of the Program Entities’ and their immediate families (parents, siblings, children, spouses, and life partners of each, regardless of where they live) and members of the households (whether related or not) of such employees, officers and directors are ineligible to participate in the Program. Google reserves the right to verify eligibility and to adjudicate on any dispute at any time. If you are entering as part of a company or on behalf of your employer, these rules are binding on you, individually, and/or your employer. If you are acting within the scope of your employment, as an employee, contractor, or agent of another party, you warrant that such party has full knowledge of your actions and has consented thereto, including your potential receipt of a reward. You further warrant that your actions do not violate your employer’s or company’s policies and procedures.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ePROGRAM PERIOD: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Program begins at 10:00 A.M. local time (in Vancouver, Canada) at the CanSecWest 2013 on March 7th, 2013 and ends at 2:00 P.M. local time on March 7th, 2013 (“Program Period”). Google may extend the Program Period in its sole discretion. ENTRANTS ARE RESPONSIBLE FOR DETERMINING THE CORRESPONDING TIME ZONE IN THEIR RESPECTIVE JURISDICTIONS.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHOW TO ENTER:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e NO PURCHASE NECESSARY TO ENTER OR WIN. To enter the Program, visit the Google desk at CanSecWest 2013 in Vancouver, Canada during the Program Period. Entrants are entirely responsible for all costs and fees associated with attending the CanSecWest 2013, including (but not limited to) admission fees, transportation, accommodation and living costs. For additional information visit the Program website located at \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/Home/chromium-security/pwnium-3\" style\u003d\"font-size:medium;font-family:serif\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(17,85,204);vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://sites.google.com/a/chromium.org/dev/Home/chromium-security/pwnium-3\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e before or during the Program Period and follow the instructions for submitting an Exploit that highlights a critical importance security issue, which has not yet been reported to, or otherwise come to attention of, the Chromium project. The Exploit must meet the “Exploit Requirements,” described below. All entries must be received before the end of the Program Period. Entries are void if they are in whole or part illegible, incomplete, damaged, altered, counterfeit, obtained through fraud, or late. All entries will be deemed made by the authorized account holder of the email address submitted at the time of submission, and potential reward recipients may be required to show proof of being the authorized account holder for that email address. The \"authorized account holder\" is the natural person assigned to an email address by an Internet service provider, online service provider, or other organization responsible for assigning email address for the domain.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eEXPLOIT REQUIREMENTS:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e The Exploit must meet the following criteria:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e• Be an unreported and original exploit, which has not been shared or partially shared with anyone else or submitted in any other contests until it has been submitted to, and judged by, Google.\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e• Be an exploit relying on an unreported and original bug, bugs or security feature in Chrome OS, Flash or other software e.g. drivers.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e• Be an \u003c/span\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eattack that’s demonstrated against a base (WiFi) model of the Samsung Series 5 550 Chromebook, running the latest stable version of Chrome OS.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e• Be a remote exploit accessible through the Chrome browser, which works and is reliable.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e• Be present in the most recent supported channel(s) of Chrome OS.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e• Be a critical vulnerability of high impact.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e• Be authored or created by You.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e• B\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(34,34,34);vertical-align:baseline;white-space:pre-wrap\"\u003ee submitted with corresponding documentation that details each bug exploited.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDuring the Program Period, Google and/or its agents will be evaluating each Exploit to ensure that it meets the Exploit Requirements. Google reserves the right, in its sole discretion, to disqualify any entrant who submits an Exploit that does not meet the Exploit Requirements.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eJUDGING: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eEach Exploit submission will be judged by a panel of experts who are employees of Google (“Judges”). Each Exploit will be evaluated by the Judges as to whether the Exploit is a critical importance vulnerability of high impact based on the potential for persistent access to the user’s account or Guest mode on the Chrome operating system.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eJudges will evaluate each Exploit based upon the above criteria to determine whether it is critical impact and qualifies for a reward. Rewards will be allocated on a first-come-first-served basis, based on time of submission during the Program Period specified above, until such time as the total reward pool of $3,141,592 USD (PI million U.S. dollars) is exhausted.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIn the event a potential reward recipient is disqualified for any reason, the reward allocated to that recipient will be returned to the total reward pool. The potential reward recipients will be selected and notified by telephone and/or email, at Sponsor’s discretion. If a potential reward recipient does not respond to the notification attempt within five days from the first notification attempt, then such potential recipient may be disqualified and their allocated reward will be returned to the total reward pool. With respect to notification by telephone, such notification will be deemed given when the potential reward recipient engages in a live conversation with Sponsor or when a message is left on the potential reward recipient’s voicemail service or answering machine by the Sponsor, whichever occurs first. Except where prohibited by law, each potential reward recipient may be required to sign and return a Declaration of Eligibility and Liability and Publicity Release and provide any additional information that may be required by Sponsor. If required, potential reward recipients must return all such required documents within seven days following attempted notification or such potential reward recipient may be deemed to have forfeited the reward and the reward may be returned to the total reward pool. In the event the potential reward recipient is a minor, his or her parent or legal guardian must sign the documents and return them as described herein. All notification requirements, as well as other requirements within these Rules, will be strictly enforced. In the event that no Exploits are received, no rewards will be awarded. Determinations of judges are final and binding.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eREWARDS:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAn Entrant submitting an Entry demonstrating an exploit against Chrome OS delivered via a web page and triggerable when browsing in Guest mode and affecting all subsequent Guest mode sessions across reboots (“persistent Guest-to-Guest exploit”) using bugs in Chrome OS, as determined in the sole discretion of the Judges, will receive a reward of $150,000 USD (one hundred and fifty thousand U.S. dollars).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAn Entrant submitting an Exploit demonstrating a critical importance high impact Chrome browser level compromise delivered via a web page using only bugs in Chrome OS as determined in the sole discretion of the Judges, will receive a reward of $110,000 USD (one hundred and ten thousand U.S. dollars).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eEach reward recipient will also receive a Chromebook, provided they reside in a country to which Chromebooks can be legally shipped.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAll rewards are contingent on Entrant's compliance with these Rules. The rewards will be awarded within approximately two weeks of receipt by Sponsor of final reward acceptance documents. No transfer, substitution or cash equivalent for rewards is allowed, except at Sponsor’s sole discretion. Sponsor reserves the right to substitute a reward, in whole or in part, of equal or greater monetary value if a reward cannot be awarded, in whole or in part, as described for any reason. Value is subject to market conditions, which can fluctuate and any difference between actual market value and ARV will not be awarded. The reward(s) may be subject to restrictions and/or licenses and may require additional hardware, software, service, or maintenance to use. The reward recipient shall bear all responsibility for use of the rewards(s) in compliance with any conditions imposed by such manufacturer(s), and any additional costs associated with its use, service, or maintenance. Program Entities have not made and Program Entities are not responsible in any manner for any warranties, representations, or guarantees, express or implied, in fact or law, relating to the reward(s), regarding the use, value or enjoyment of the reward(s), including, without limitation, its quality, mechanical condition, merchantability, or fitness for a particular purpose, with the exception of any standard manufacturer's warranty that may apply to the reward or any components thereto.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eTAXES:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e PAYMENTS TO POTENTIAL REWARD RECIPIENTS ARE SUBJECT TO THE EXPRESS REQUIREMENT THAT THEY SUBMIT TO GOOGLE ALL DOCUMENTATION REQUESTED BY GOOGLE TO PERMIT IT TO COMPLY WITH ALL APPLICABLE STATE, FEDERAL, LOCAL, PROVINCIAL AND FOREIGN TAX REPORTING AND WITHHOLDING REQUIREMENTS. ALL REWARDS WILL BE NET OF ANY TAXES GOOGLE IS REQUIRED BY LAW TO WITHHOLD. ALL TAXES IMPOSED ON REWARDS ARE THE SOLE RESPONSIBILITY OF THE REWARD RECIPIENTS.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIn order to receive a reward, potential reward recipients must submit the tax documentation requested by Google or otherwise required by applicable law, to Google or the relevant tax authority, all as determined by applicable law, including, where relevant, the law of the potential recipient’s country of residence. The potential reward recipients are responsible for ensuring that (s)he complies with all the applicable tax laws and filing requirements. If a potential reward recipient fails to provide such documentation or comply with such laws, the reward may be forfeited and Google may, in its sole discretion, return the reward to the total reward pool.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eGENERAL CONDITIONS:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e All federal, state, provincial and local laws and regulations apply. Google reserves the right to disqualify any entrant from the Program if, in Google’s sole discretion, it reasonably believes that the entrant has attempted to undermine the legitimate operation of the Program by cheating, deception, or other unfair playing practices or annoys, abuses, threatens or harasses any other entrants, Google, or the Judges.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eINTELLECTUAL PROPERTY RIGHTS:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e As between Google and the entrant, the entrant retains ownership of all intellectual and industrial property rights (including moral rights) in and to the Exploit. As a condition of submission, entrant grants Google, its subsidiaries, agents and partner companies, a perpetual, irrevocable, worldwide, royalty-free, and non-exclusive license to use, reproduce, adapt, modify, publish, distribute, publicly perform, create a derivative work from, and publicly display the Exploit (1) for the purposes of allowing Google and the Judges to evaluate the Exploit for purposes of the Program, (2) for the purposes of evaluating the Exploit and improving Google and third party products, services, systems and networks and (3) in connection with advertising and promotion via communication to the public or other groups, including, but not limited to, the right to make screenshots, animations and Exploit clips available for promotional purposes.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ePRIVACY: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParticipants agree that personal data entered during the registration, including name, mailing address, phone number, and email address may be processed, stored, shared and otherwise used for the purposes and within the context of the Program. This data will also be stored in / transferred into the United States. By entering, entrants agree to the transmission, processing, sharing and storage of this personal data in the United States. Participants also understand this data may be used by Sponsor in order to verify an Entrant’s identity, postal address and telephone number in the event a submission qualifies for a reward. Participants have the right to access, review, rectify or cancel any personal data held by Google in connection with the Program by writing to Google at the address listed above. If a participant does not provide the data require at registration, that participant’s submission will be ineligible. Otherwise, all personal information that is collected from the entrant is subject to Google’s Privacy Policy, located at http://www.google.com/privacy.html. By accepting a reward, participant agrees and consents to Google and its agencies use of entrant’s name and/or likeness to name the entrant for a reasonable time after completion of the Program in promotional and advertising material of Google (or its agents) as a recipient of a reward of the Program without additional compensation, unless prohibited by law. For residents of the EU: pursuant to EU law pertaining to data collection and processing, you are informed that: - the data controller is Google and the data recipients are Google and its agents; - your data is collected for purposes of administration of the Program and for marketing purposes; - you have a right of access to and withdrawal of your personal data. You also have a right of opposition to the data collection, under certain circumstances. To exercise such right, you may write to security@chromium.org.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003ePUBLICITY: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eBy accepting a reward, Entrant agrees to Sponsor and its agencies use of his or her name and/or likeness and Exploit for advertising and promotional purposes without additional compensation, unless prohibited by law.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWARRANTY AND INDEMNITY:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e Participants warrant that their Exploits are their own original work and, as such, they are the sole and exclusive owner and rights holder of the submitted Exploit and that they have the right to submit the Exploit in the Program and grant all required licenses. Each entrant agrees not to submit any Exploit that (1) infringes any third party proprietary rights, intellectual property rights, industrial property rights, personal or moral rights or any other rights, including without limitation, copyright, trademark, patent, trade secret, privacy, publicity or confidentiality obligations; or (2) otherwise violates the applicable state, federal, provincial or local law.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTo the maximum extent permitted by law, each Entrant indemnifies and agrees to keep indemnified Sponsor at all times from and against any liability, claims, demands, losses, damages, costs and expenses resulting from any act, default or omission of the Entrant and/or a breach of any warranty set forth herein. To the maximum extent permitted by law, each Entrant agrees to defend, indemnify and hold harmless the Sponsor from and against any and all claims, actions, suits or proceedings, as well as any and all losses, liabilities, damages, costs and expenses (including reasonable attorneys fees) arising out of or accruing from (a) any or other material uploaded or otherwise provided by the entrant that infringes any copyright, trademark, trade secret, trade dress, patent or other intellectual property right of any person or defames any person or violates their rights of publicity or privacy, (b) any misrepresentation made by the entrant in connection with the Program; (c) any non-compliance by the entrant with these Rules; (d) claims brought by persons or entities other than the parties to these Rules arising from or related to the Entrant’s involvement with the Program; (e) acceptance, possession, misuse or use of any reward or participation in any Program-related activity or participation in this Program; (f) any malfunction or other problem with the Program site; (g) any error in the collection, processing, or retention of submission information; or (h) any typographical or other error in the printing, offering or announcement of any reward or reward recipients.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eELIMINATION:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e Any false information provided within the context of the Program by any Entrant concerning identity, mailing address, telephone number, email address, ownership of right or non-compliance with these Rules or the like may result in the immediate elimination of the entrant from the Program.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eNETWORK:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e Sponsor is not responsible for any malfunction of the entire Program site or any late, lost, damaged, misdirected, incomplete, illegible, undeliverable, or destroyed Exploits due to system errors, failed, incomplete or garbled computer or other telecommunication transmission malfunctions, hardware or software failures of any kind, lost or unavailable network connections, typographical or system/human errors and failures, technical malfunction(s) of any telephone network or lines, cable connections, satellite transmissions, servers or providers, or computer equipment, traffic congestion on the Internet or at the Program site, or any combination thereof, including other telecommunication, cable, digital or satellite malfunctions which may limit an entrant’s ability to participate.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eRIGHT TO CANCEL, MODIFY OR DISQUALIFY: \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eIf for any reason the Program is not capable of running as planned, including infection by computer virus, bugs, tampering, unauthorized intervention, fraud, technical failures, or any other causes which corrupt or affect the administration, security, fairness, integrity, or proper conduct of the Program, Google reserves the right at its sole discretion to cancel, terminate, modify or suspend the Program. Google further reserves the right to disqualify any entrant who tampers with the submission process or any other part of the Program or Program site. Any attempt by an entrant to deliberately damage any web site, including the Program site, or undermine the legitimate operation of the Program is a violation of criminal and civil laws and should such an attempt be made, Google reserves the right to seek damages from any such entrant to the fullest extent of the applicable law.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eNOT AN OFFER OR CONTRACT OF EMPLOYMENT:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e Under no circumstances shall the submission of a Exploit into the Program, the awarding of a reward, or anything in these Rules be construed as an offer or contract of employment with either Google, or any other Program entities. You acknowledge that you have submitted your Exploit voluntarily and not in confidence or in trust. You acknowledge that no confidential, fiduciary, agency or other relationship or implied-in-fact contract now exists between you and Google or any other Program entities and that no such relationship is established by your submission of an Exploit under these Rules.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eFORUM AND RECOURSE TO JUDICIAL PROCEDURES:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e These Rules shall be governed by, subject to, and construed in accordance with the laws of the State of California, United States of America, excluding all conflict of law rules. If any provision(s) of these Rules are held to be invalid or unenforceable, all remaining provisions hereof will remain in full force and effect. To the extent permitted by law, the rights to litigate, seek injunctive relief or make any other recourse to judicial or any other procedure in case of disputes or claims resulting from or in connection with this Program are hereby excluded, and all Participants expressly waive any and all such rights.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eARBITRATION:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e By entering the Program, you agree that exclusive jurisdiction for any dispute, claim, or demand related in any way to the Program will be decided by binding arbitration. All disputes between you and Google of whatsoever kind or nature arising out of these Rules, shall be submitted to Judicial Arbitration and Mediation Services, Inc. (“JAMS”) for binding arbitration under its rules then in effect in the San Jose, California, USA area, before one arbitrator to be mutually agreed upon by both parties. The parties agree to share equally in the arbitration costs incurred.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eREWARD RECIPIENT’S LIST:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e Reward recipients will be posted on the Program site for three months following the conclusion of the Program.\u003c/span\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/6743906577140407009"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/chromium-security/pwnium-3"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3142364825708442616"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3142364825708442616"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3142364825708442616"}],"author":[{"name":{"$t":"Jorge Lucangeli Obes"},"email":{"$t":"jorgelo@chromium.org"}}],"sites$pageName":{"$t":"pwnium-3"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5219125013438890990"},"published":{"$t":"2013-03-02T08:44:07.720Z"},"updated":{"$t":"2013-03-02T08:44:07.729Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-02T08:44:07.720Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"butterfly-top-wp.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5219125013438890990"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1656014237960155922"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook/butterfly-top-wp.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5219125013438890990"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5219125013438890990"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5219125013438890990"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5219125013438890990"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/232565240898954617"},"published":{"$t":"2013-03-02T08:17:19.433Z"},"updated":{"$t":"2013-03-02T08:17:19.444Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-02T08:17:19.433Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"butterfly-cpanel.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/232565240898954617"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1656014237960155922"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook/butterfly-cpanel.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/232565240898954617"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/232565240898954617"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/232565240898954617"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/232565240898954617"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8902143614192875732"},"published":{"$t":"2013-03-02T08:15:40.160Z"},"updated":{"$t":"2013-03-02T08:15:40.174Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-02T08:15:40.160Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"butterfly-keyboard.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8902143614192875732"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1656014237960155922"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook/butterfly-keyboard.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8902143614192875732"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8902143614192875732"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8902143614192875732"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8902143614192875732"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1169766553504259017"},"published":{"$t":"2013-03-02T08:10:48.285Z"},"updated":{"$t":"2013-03-02T08:10:48.295Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-02T08:10:48.285Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"butterfly-dpanel.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1169766553504259017"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1656014237960155922"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook/butterfly-dpanel.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1169766553504259017"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1169766553504259017"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1169766553504259017"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1169766553504259017"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3114423272641746265"},"published":{"$t":"2013-03-02T00:27:09.104Z"},"updated":{"$t":"2013-03-02T00:27:09.141Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-02T00:27:09.104Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"butterfly-bottom-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3114423272641746265"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1656014237960155922"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook/butterfly-bottom-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3114423272641746265"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3114423272641746265"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3114423272641746265"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3114423272641746265"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7128952797261159690"},"published":{"$t":"2013-03-02T00:25:43.360Z"},"updated":{"$t":"2013-03-02T00:25:43.375Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-03-02T00:25:43.360Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"butterfly-top-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7128952797261159690"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1656014237960155922"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/hp-pavilion-14-chromebook/butterfly-top-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7128952797261159690"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7128952797261159690"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7128952797261159690"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7128952797261159690"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/385489908336410688"},"published":{"$t":"2013-02-21T21:02:01.194Z"},"updated":{"$t":"2013-02-26T04:58:22.349Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-26T04:58:22.336Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"link-bottom-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/385489908336410688"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5384573906228610929"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/chromebook-pixel/link-bottom-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/385489908336410688"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/385489908336410688"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/385489908336410688"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/385489908336410688"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4839144786343252670"},"published":{"$t":"2010-04-15T21:08:24.958Z"},"updated":{"$t":"2013-02-14T15:08:42.319Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-14T15:08:40.519Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chromium Print 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\u003cspan style\u003d\"font-family:Verdana\"\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-Abstract\" /\u003e\u003cb\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-1\"\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\"#Goals_48003258649259806_471658_4832919519394636\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eGoals\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Audience_05567728541791439_445_5526163401082158\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eAudience\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Design_12618436850607395_85637_472863782197237\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eDesign\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#Open_issues_649896128103137_82_2739420058205724\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eOpen issues\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003eAbstract\u003c/b\u003e\u003c/h2\u003e\r\nA cloud print proxy enables cloud printing support for legacy (non-cloud-aware) printers. The proxy acts as a \u003ca href\u003d\"http://code.google.com/apis/cloudprint/docs/proxyinterfaces.html\"\u003eprotocol bridge\u003c/a\u003e between Google Cloud Print and the native print driver stack on existing PCs. The cloud print proxy runs on Windows (XP SP2 and higher), Mac OS X (10.5 and higher on Intel), and Linux desktops and laptops. The proxy code is built as a part of the Google Chrome browser and is an end-user opt-in feature. It should be noted that in parallel to developing the cloud print proxy for legacy printer support, Google will be working with third parties to help create solutions (based on open/documented standards) for allowing printers to connect directly to Google Cloud Print without the need for a dedicated PC or cloud print proxy on that PC. \u003cb\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"Goals_48003258649259806_471658_4832919519394636\" /\u003e\u003cb\u003eGoals\u003c/b\u003e\u003c/h2\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eProvide cloud printing support for legacy printers.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eServe as a reference implementation for the \u003ca href\u003d\"http://code.google.com/apis/cloudprint/docs/proxyinterfaces.html\"\u003eservice interfaces\u003c/a\u003e provided by Google Cloud Print.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"Audience_05567728541791439_445_5526163401082158\" /\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eAudience\u003c/b\u003e\u003c/font\u003e\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe cloud print proxy code acts as a reference implementation for implementing the \u003ca href\u003d\"http://code.google.com/apis/cloudprint/docs/proxyinterfaces.html\" style\u003d\"color:rgb(71,18,100)\"\u003eservice interfaces\u003c/a\u003e provided by Google Cloud Print. This document is intended for Google Chrome browser developers as well as future implementers of the \u003ca href\u003d\"http://code.google.com/apis/cloudprint/docs/proxyinterfaces.html\" style\u003d\"color:rgb(71,18,100)\"\u003eservice interfaces\u003c/a\u003e (for example, printer vendors).\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"Design_12618436850607395_85637_472863782197237\" /\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eDesign\u003c/b\u003e\u003c/font\u003e\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe Google Chrome browser exposes the cloud print proxy as an end-user opt-in feature in the Options dialog. When the user chooses to enable this feature, the proxy code asks for the user's Google account credentials (if this has not already been entered for another cloud-related feature such as Bookmarks Sync). Upon successful authentication, the client proxy code runs a background thread that performs the following steps:\u003c/div\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIt enumerates all the local and network printers connected to the client machine. It then requests Google Cloud Print for a list of printers already registered to this specific proxy for this specific user.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe cloud print proxy then registers any local and network printers that have not already been registered with the user's Google account. Printer registration includes publishing the capabilities as well as printer default settings for each printer in an extensible format. Printer registration follows the steps outlined in the \u003ca href\u003d\"http://code.google.com/apis/cloudprint/docs/proxyinterfaces.html\" style\u003d\"color:rgb(71,18,100)\"\u003eservice interfaces\u003c/a\u003e document.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eFor each registered printer, the proxy does the following:\u003c/li\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eChecks to see if the printer still exists locally. If it does not, it deletes the printer from the server.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eCompares the hash of the printer's current capabilities against the last uploaded hash to the server. Any changes are then uploaded to Google Cloud Print.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eChecks for any pending jobs assigned to the printer. Pending jobs are downloaded and spooled to the local printer. See below for details of job status reporting.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eRegisters for notifications of changes or deletions to the printer. Changes or deletions are synced with Google Cloud Print.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe proxy code also listens for print request notifications from Google Cloud Print. Print request notifications are delivered using the XMPP protocol. Upon receiving a print request, the proxy fetches the print jobs for that specific proxy from Google Cloud Print and spools them to the local printer. The printer notification code above checks for changes to the status of the job and updates Google Cloud Print with the status of the job.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe proxy code registers for notifications of printer additions. Newly added printers are registered with Google Cloud Print.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWith the exception of the code to talk to the operating system print spooler and to perform printer-specific tasks, all of the cloud print proxy code is platform-independent. The platform-dependent code is abstracted behind a platform-agnostic interface.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eCloud services in the Google Chrome browser such as cloud print proxy and Bookmarks Sync share a common framework for signing in to the user's Google account as well as for receiving XMPP-based notifications. Users enter their Google credentials only once to enable one or more of these features.\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cfont face\u003d\"verdana, sans-serif\"\u003eThe cloud print proxy background thread continues to run in a persistent process even when the user closes all visible browser windows. In addition, upon user login, an invisible instance of this process with this background thread running is launched automatically.\u003c/font\u003e\u003c/span\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eAs listed in the table below, the cloud print proxy fetches print jobs in PDF format. The format used for the user-selected printer settings (print ticket) on each platform is also listed in this table. On Windows, the proxy code will use a PDF interpreter library to print the PDF. The proxy code leverages platform support on Mac OS X and Linux to print PDF documents.\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cb\u003eData formats\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003eThe following table summarizes the data formats used for the current proxy implementations. Note that these formats are specific to the current proxy implementations. Google Cloud Print supports multiple formats and the actual data formats used for cloud-aware printers will likely be different from the ones listed below.\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cb\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/p\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#000000\" cellpadding\u003d\"3\" cellspacing\u003d\"0\" style\u003d\"font-size:1em;line-height:inherit;border-collapse:collapse\" width\u003d\"100%\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd width\u003d\"20%\"\u003e\u003cb\u003eProxy operating system\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003e\u003cb\u003eData format for document to be printed\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003e\u003cb\u003eData format for printer capabilties\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003e\u003cb\u003eData format for printer defaults\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003e\u003cb\u003eData format for print job settings\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd width\u003d\"20%\"\u003eWindows\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePDF\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003eXML-based Print Schema. \u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/ms716431%28VS.85%29.aspx\" target\u003d\"_blank\" title\u003d\"See here\" rel\u003d\"nofollow\"\u003eSee here for details\u003c/a\u003e.\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003eXML-based Print Schema. \u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/ms715314%28VS.85%29.aspx\" target\u003d\"_blank\" title\u003d\"See here for details\" rel\u003d\"nofollow\"\u003eSee here for details\u003c/a\u003e.\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003eXML-based Print Schema. \u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/ms715314%28VS.85%29.aspx\" style\u003d\"color:rgb(85,26,139)\" target\u003d\"_blank\" title\u003d\"See here for details\" rel\u003d\"nofollow\"\u003eSee here for details\u003c/a\u003e.\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd width\u003d\"20%\"\u003eMac OS\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePDF\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePPD. \u003ca href\u003d\"http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf\" style\u003d\"color:rgb(85,26,139)\" target\u003d\"_blank\" title\u003d\"See here for details\" rel\u003d\"nofollow\"\u003eSee here for details\u003c/a\u003e.\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePPD. \u003ca href\u003d\"http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf\" style\u003d\"color:rgb(85,26,139)\" target\u003d\"_blank\" title\u003d\"See here for details\" rel\u003d\"nofollow\"\u003eSee here for details\u003c/a\u003e.\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePPD. \u003ca href\u003d\"http://partners.adobe.com/public/developer/en/ps/5003.PPD_Spec_v4.3.pdf\" style\u003d\"color:rgb(85,26,139)\" target\u003d\"_blank\" title\u003d\"See here for details\" rel\u003d\"nofollow\"\u003eSee here for details\u003c/a\u003e.\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd width\u003d\"20%\"\u003eLinux\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePDF\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePPD.\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePPD.\u003c/td\u003e\r\n\u003ctd width\u003d\"20%\"\u003ePPD.\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\u003e\r\n\u003cbr /\u003e\r\n\u003cb\u003eNote: \u003c/b\u003eNot enough research has been done on the details of formats on the Mac OS, and our decision might change. \u003cbr /\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"Open_issues_649896128103137_82_2739420058205724\" /\u003eOpen issues\u003c/h2\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003ePrinter defaults for specific printers can be changed on the client OS. Should we upload the new set of defaults when they change? Or should we maintain a separate set of defaults in the cloud? If so, we need server-side UI to change defaults.\u003c/li\u003e\u003c/ul\u003e\r\n\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/google-cloud-print-proxy-design"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4839144786343252670"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4839144786343252670"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4839144786343252670"}],"author":[{}],"sites$pageName":{"$t":"google-cloud-print-proxy-design"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7328535452881194694"},"published":{"$t":"2013-02-12T20:02:08.208Z"},"updated":{"$t":"2013-02-12T20:02:08.215Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-12T20:02:08.208Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"mario-top-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7328535452881194694"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6898459593441562844"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/cr-48-chrome-notebook-developer-information/mario-top-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7328535452881194694"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7328535452881194694"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7328535452881194694"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7328535452881194694"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6177135647450298245"},"published":{"$t":"2012-02-22T22:56:04.054Z"},"updated":{"$t":"2013-02-12T03:43:10.780Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-29T21:57:08.971Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Modem debugging with mmcli (from the modemmanager-next package)"},"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\u003eListing modems/finding the index number of a modem (The modem index frequently changes during a suspend-resume cycle):\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -L\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e(Further examples will assume modem index 0. Substitute your own modem index where necessary.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee the status of a modem:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003emmcli -m 0\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eEnable a modem (useful side effects usually include registering on a network and getting an operator ID and name)\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -m 0 -e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eMinimal connection and disconnection:\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -m 0 --simple-connect\u003d\"apn\u003dfoo.carrier.com\"\u003c/font\u003e\u003c/div\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003emmcli -m 0 --simple-disconnect\u003c/span\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSet logging level to maximium (equivalent to the old \u003cfont face\u003d\"'courier new', monospace\"\u003emm_debug debug\u003c/font\u003e):\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -G DEBUG\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\u003cdiv\u003eSet logging level to minimum (equivalent to the old \u003cfont face\u003d\"'courier new', monospace\"\u003emm_debug err\u003c/font\u003e):\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -G ERR\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\u003eArbitrary AT commands - available if ModemManager is started with the --debug flag:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis is a good test command to see if ModemManager is speaking to the modem. The modem should already be in state E0 (no command echo); you should immediately get an empty reply. You can check /var/log/messages for the message exchange if you've previously turned up the logging level to maximum.\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -m 0 --command\u003d\"E0\" \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eDo a network scan and list the carriers found - this requires a longer-than-default timeout. \u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003emmcli -m 0 \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e--command-timeout\u003d120\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e --command\u003d\"+COPS?\" \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/7533640312110703966"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/debugging-3g/modem-debugging-with-mmcli"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6177135647450298245"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6177135647450298245"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6177135647450298245"}],"author":[{}],"sites$pageName":{"$t":"modem-debugging-with-mmcli"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4252691647615192658"},"published":{"$t":"2013-02-11T06:32:39.204Z"},"updated":{"$t":"2013-02-11T15:24:27.913Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-11T15:24:27.912Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Instant"},"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'%3D249'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'%3D250'%3D297'dim'%5C%3D10'%3D10'%3D250'%3D297'vdim'%5Cbox1'b%5Cva%5CF6F6F6'fC%5CC8C8C8'eC%5C'a%5C%5Do%5CLauto'f%5C\u0026amp;sig\u003d4Bm9qaJUdSqYajg2_Fmi3qRL9R0\" data-type\u003d\"subpages\" data-props\u003d\"align:left;borderTitle:Subpage Listing;displayAs:TOC;maxDepth:6;rootPage:THIS_PAGE;width:250;\" width\u003d\"250\" height\u003d\"300\" style\u003d\"display:block;text-align:left;margin-right:auto;\" /\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/instant"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4252691647615192658"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4252691647615192658"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4252691647615192658"}],"author":[{}],"sites$pageName":{"$t":"instant"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8375442684990087021"},"published":{"$t":"2013-02-04T23:40:25.820Z"},"updated":{"$t":"2013-02-04T23:40:25.838Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-04T23:40:25.820Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-zgb-top-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8375442684990087021"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798767683952072355"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-ac700-chromebook/acer-zgb-top-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8375442684990087021"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8375442684990087021"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8375442684990087021"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8375442684990087021"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6022473880184223688"},"published":{"$t":"2013-02-04T23:40:19.262Z"},"updated":{"$t":"2013-02-04T23:40:19.268Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-04T23:40:19.262Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-zgb-bottom.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6022473880184223688"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798767683952072355"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-ac700-chromebook/acer-zgb-bottom.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6022473880184223688"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6022473880184223688"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6022473880184223688"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6022473880184223688"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3293426094130512932"},"published":{"$t":"2013-02-04T23:40:03.332Z"},"updated":{"$t":"2013-02-04T23:40:03.338Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-04T23:40:03.332Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-zgb-bottm-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3293426094130512932"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798767683952072355"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-ac700-chromebook/acer-zgb-bottm-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3293426094130512932"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3293426094130512932"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3293426094130512932"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3293426094130512932"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7366443145020246012"},"published":{"$t":"2013-01-16T16:29:42.197Z"},"updated":{"$t":"2013-02-04T14:14:19.480Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-02-04T14:14:19.471Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-c7-bottom-guts.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7366443145020246012"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6261796016295893248"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c7-chromebook/acer-c7-bottom-guts.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7366443145020246012"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7366443145020246012"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7366443145020246012"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7366443145020246012"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5201542370495091332"},"published":{"$t":"2013-01-31T15:03:36.515Z"},"updated":{"$t":"2013-01-31T16:04:15.094Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-31T16:04:14.158Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Disk Cache Benchmarking \u0026 Performance Tracking"},"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\" /\u003e\u003cfont size\u003d\"4\"\u003eSummary\u003c/font\u003e\u003c/h2\u003e\u003cp\u003eMore backend work in the disk cache is demanding good tools for ongoing disk cache performance tracking. The \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/disk-cache/very-simple-backend\"\u003eVery Simple Backend\u003c/a\u003e implementation needs continuous A/B testing to show its implementation is advancing in speed. To track progress on this backend, and also to permit comparisons between alternative backends provided in net, two ongoing methodologies are proposed.\u003cspan style\u003d\"font-size:10pt\"\u003e \u003c/span\u003e\u003c/p\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Proxy-Backend-with-Replay\" /\u003e\u003cfont size\u003d\"4\"\u003eProxy Backend with Replay\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003eThe Proxy Backend is a simple \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/disk-cache\"\u003eDisk Cache Backend\u003c/a\u003e and Entry implementation that pass through to an underlying Entry and Backend, but recording a short log with parameter information \u0026amp; timing information to allow replay.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis log can then be replayed in a standalone replay application which takes the log, constructs a backend (perhaps a standard blockfile backend, a \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/disk-cache/very-simple-backend\"\u003every simple backend\u003c/a\u003e or a log structured backend), and performs the same operations at the same delays, all calls as if from the IO thread. The average latency of calls, as well as system load during the test can then permit A/B comparison between backends.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePros:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eWell suited to use on developer workstations.\u003c/li\u003e\u003cli\u003eVery simple to collect logs and run.\u003c/li\u003e\u003cli\u003eVery fast to run tests.\u003c/li\u003e\u003cli\u003eLow level, includes very little noise from outside of the disk cache.\u003c/li\u003e\u003cli\u003eUsing logs with multiple versions of the same backend allows tracking progress over time of a particular backend.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eCons:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSensitive to evictions: if two different backends have different eviction algorithms, the same operations on two backends can result in different logs. For instance an OpenEntry() on the foo backend could find an entry that then is Read/Written to when the same log played on a bar backend.\u003c/li\u003e\u003cli\u003eCompares all low level operations equally: backend operations in the critical path of requests block launching requests. Other backend operations (like WriteData) almost never occur in the critical path, and so performance may impact rendering less. Without a full renderer, this impact is hard to measure.\u003c/li\u003e\u003cli\u003eDoes not track system resource consumption. Besides answering requests, the backend is consuming finite system resources (RAM, buffer cache, file handles, etc...), competing with the renderer for resources. This impact isn't very well measured in the replay benchmark.\u003cspan style\u003d\"font-size:10pt\"\u003e \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-browser_test-with-corpus\" /\u003ebrowser_test with corpus\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eStarting up with a backend, the browser_test loads a large corpus of pages (either from a local server, or a web server simulating web latency, or possibly even the actual web), with an initially empty cache, and then runs either that same corpus or a second corpus immediately afterwards with the warm cache. This can be repeated using different backends, to permit A/B comparisons.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe browser test should introspect on UMA; outputs should include HttpCache.* benchmarks, as well as PLT.BeginToFirstPaint/PLT.BeginToFinish.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePros:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eWell suited to ongoing performance dashboards.\u003c/li\u003e\u003cli\u003eTracks a metric more closely connected to user experience.\u003c/li\u003e\u003cli\u003eAllows comparison of backends with wildly different eviction behaviour.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eCons:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eNoisier, since it includes much, much more than just the Chrome renderer.\u003c/li\u003e\u003cli\u003eSlower to run.\u003c/li\u003e\u003cli\u003eBecause of ongoing renderer changes, comparisons of the same backend over time are problematic without a lot of patch cherry picking.\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\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/3254066387191849349"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/disk-cache/disk-cache-benchmarking"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5201542370495091332"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5201542370495091332"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5201542370495091332"}],"author":[{"name":{"$t":"Gavin Peters"},"email":{"$t":"gavinp@chromium.org"}}],"sites$pageName":{"$t":"disk-cache-benchmarking"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3589166801194924826"},"published":{"$t":"2013-01-28T17:21:51.036Z"},"updated":{"$t":"2013-01-28T17:21:51.041Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-28T17:21:51.036Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lumpy-internals-bare.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3589166801194924826"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/lumpy-internals-bare.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3589166801194924826"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3589166801194924826"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3589166801194924826"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3589166801194924826"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6988537089481202860"},"published":{"$t":"2013-01-22T17:30:47.086Z"},"updated":{"$t":"2013-01-22T17:32:30.153Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-22T17:32:28.459Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Chrome OS Volume Keys"},"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\u003ch1 dir\u003d\"ltr\" style\u003d\"text-align:left;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Current-intended-behavior-since-mid-2011-\" /\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Current-intended-behavior-since-mid-2011-1\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrent, intended behavior (since mid-2011)\u003c/span\u003e\u003c/h2\u003e\u003c/b\u003e\u003c/h1\u003e\u003cdiv\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-1\" /\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\u003c/b\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen the user presses one of the three volume-related keys (Mute, Volume Down, or Volume Up), a bubble appears in the lower-right corner of the screen displaying the current volume level.\u003c/span\u003e\u003c/b\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\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\u003cfont face\u003d\"Times New Roman\" size\u003d\"3\"\u003e\u003cspan style\u003d\"margin-right:auto;margin-left:auto\"\u003e\u003cimg height\u003d\"116px;\" src\u003d\"https://lh5.googleusercontent.com/Nm9_2BQJ5T3Sqt3rD6ZYejyox3OcpxsoA61mc8NM9Aug_19_i4bnXDmZtO3BA0uFIXMXfBkCoMVvpdheGIIxHjwZpUWz1wAp811TBxJ_Ry79bd1X6hQ\" style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\" width\u003d\"330px;\" /\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;text-align:center;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eNon-muted and ~60% of maximum level\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt the left, an icon shows whether the system is muted or not, and if not muted, a coarse approximation of the current volume level (via zero, one, or two sound waves emanating from a speaker).  To the right of the icon, a toggle button displays the current muting status.\u003c/span\u003e\u003c/b\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\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\u003cfont face\u003d\"Times New Roman\" size\u003d\"3\"\u003e\u003cspan style\u003d\"margin-right:auto;margin-left:auto\"\u003e\u003cimg height\u003d\"116px;\" src\u003d\"https://lh3.googleusercontent.com/aFZMhLBlyas-l9XSOCg8W-KMonwPhnf4J9pt0iK9MbVaBnlRANM0_gck1ZsDH9vLHZkoZ5xu842ZviGA84WVzhj5BuGU__9LWai_R9g5KekYmB6sNDs\" style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\" width\u003d\"330px;\" /\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;text-align:center;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eMuted with ~60% level saved\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEither the icon or the toggle button can be clicked to toggle the muting status.  At the right side of the bubble, a horizontal slider displays the current volume level.  If the system is muted, the slider is displayed in an inactive state; note that the previously-set volume level is still visible, though.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe same controls are present in the larger bubble that is displayed when the user clicks the system / status tray in the lower-right corner of the screen:\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\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\u003cfont face\u003d\"Times New Roman\" size\u003d\"3\"\u003e\u003cimg height\u003d\"362px;\" src\u003d\"https://lh4.googleusercontent.com/ibZ7w_Ljo-MURsOQhV0Dx-XZPpdDU5fLEKNKSOSLkh6BlyyiTvsk94XiNWQfLpVSpYLemRluuqywKIFvTKJDB_uUbLyl381r2Zby4kUUkkkpzSrdRJ8\" style\u003d\"display:block;margin-right:auto;margin-left:auto;text-align:center\" width\u003d\"324px;\" /\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe volume keys’ current behavior was initially proposed in \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium-os/issues/detail?id\u003d13618\" style\u003d\"font-family:Times New Roman;font-size:medium\"\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\"\u003echromium-os bug 13618\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.  Briefly,\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-When-not-muted:\" /\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\"\u003eWhen not muted:\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMute: mutes instantly\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eVolume Down: decreases the volume\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eVolume Up: increases the volume\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-When-muted:\" /\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\"\u003eWhen muted:\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMute: does nothing\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eVolume Down: sets the saved volume to zero, keeping the system muted\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eVolume Up: unmutes and restores saved volume (increasing it slightly if zero)\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Objections\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eObjections\u003c/span\u003e\u003c/h2\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Many-other-operating-systems-A-V-equipment-etc.-provide-a-toggle-mute-button-instead.\" /\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\"\u003eMany other operating systems, A/V equipment, etc. provide a “toggle mute” button instead.\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen in an environment where sound is undesirable (e.g. library, shared office, etc.), the user is guaranteed that pressing the Mute key will instantly mute the system; there is no risk of toggling sound back on if the system was already muted.  If the user wants to set the volume to the lowest audible level, only three key-presses are needed (Mute, Volume Down, and then Volume Up).\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-But-the-user-can-just-hold-the-Volume-Down-key-if-they-want-to-make-sure-the-volume-is-at-0-.\" /\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\"\u003eBut the user can just hold the Volume Down key if they want to make sure the volume is at 0%.\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis is a poor substitute; decreasing the volume from 100% to 0% takes more than a second and the user is unable to easily restore the original volume level later.\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-The-toggle-button-between-the-icon-and-the-slider-is-confusing-see-e.g.-this-bug-.\" /\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\"\u003eThe toggle button between the icon and the slider is confusing (see e.g. \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d170935\"\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ethis bug\u003c/span\u003e\u003c/a\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\"\u003e).\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe button was originally labeled, but the label’s visual appearance was sub-optimal (\u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d143426\" style\u003d\"font-family:Times New Roman;font-size:medium\"\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\"\u003echromium bug 143426\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e).  Per \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d152070\" style\u003d\"font-family:Times New Roman;font-size:medium\"\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\"\u003echromium bug 152070\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, the unlabeled button will be merged into a more-meaningful icon (as tracked in \u003c/span\u003e\u003ca href\u003d\"https://code.google.com/p/chromium/issues/detail?id\u003d137947\" style\u003d\"font-family:Times New Roman;font-size:medium\"\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\"\u003echromium bug 137947\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e).\u003c/span\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/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chrome-os-volume-keys"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6988537089481202860"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6988537089481202860"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6988537089481202860"}],"author":[{"name":{"$t":"Dan Erat"},"email":{"$t":"derat@chromium.org"}}],"sites$pageName":{"$t":"chrome-os-volume-keys"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6165044286682424571"},"published":{"$t":"2013-01-18T23:24:24.654Z"},"updated":{"$t":"2013-01-18T23:24:24.660Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-18T23:24:24.654Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lumpy-case.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6165044286682424571"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/lumpy-case.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6165044286682424571"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6165044286682424571"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6165044286682424571"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6165044286682424571"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4055761228015895314"},"published":{"$t":"2013-01-18T01:22:09.031Z"},"updated":{"$t":"2013-01-18T01:22:12.057Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-18T01:22:09.050Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"suite_scheduler"},"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\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/suite_scheduler"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4055761228015895314"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4055761228015895314"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4055761228015895314"}],"author":[{"name":{"$t":"Scott Zawalski"},"email":{"$t":"scottz@chromium.org"}}],"sites$pageName":{"$t":"suite_scheduler"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"UCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4326769457085824926"},"published":{"$t":"2009-10-19T20:00:54.583Z"},"updated":{"$t":"2013-01-17T20:52:38.978Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-01T01:13:36.206Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"API Specification"},"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:small\"\u003e\u003cspan style\u003d\"font-size:medium;color:rgb(204,0,0)\"\u003eThis is a DRAFT specification and subject to change. \u003c/span\u003e\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\"\u003eNote that the latest version of the \u003ci\u003espec\u003c/i\u003e is here: \u003c/span\u003e\u003ca href\u003d\"http://dev.w3.org/2006/webapi/WebNotifications/publish/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont color\u003d\"#000000\"\u003ehttp://dev.w3.org/2006/webapi/WebNotifications/publish/\u003c/font\u003e\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:small\"\u003e but this page reflects what's implemented in the latest version of Chromium.\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\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003eThe Notification interface\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eThis interface represents a notification object.\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\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003einterface Notification : EventTarget {\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e // display methods\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e void show();\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e void cancel();\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e // event handler attributes\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e attribute Function ondisplay;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e attribute Function onerror;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e attribute Function onclose;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e attribute Function onclick;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e}\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ci\u003eAttributes\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eondisplay\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eevent listener function corresponding to event type \"display\".  This listener must be called when the notification is displayed to the user, which need not be immediately when show() is called.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eonerror\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eevent listener function corresponding to event type \"error\".  This listener must be called when the notification cannot be displayed to the user because of an error.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eonclose\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eevent listener function corresponding to event type \"close\".  This listener must be called when the notification is closed by the user.  This event must not occur until the \"display\" event.\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cb style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eonclick\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eevent listener function corresponding to event type \"click\".  This listener must be called when the notification has been clicked on by the user.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003ci\u003eMethods\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eshow\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eCauses the notification to displayed to the user.  This may or may not happen immediately, depending on the constraints of the presentation method.\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ecancel\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eCauses the notification to not be displayed.  If the notification has been displayed already, it must be closed.  If it has not yet been displayed, it must be removed from the set of pending notifications.\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003eThe NotificationCenter interface\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eThe NotificationCenter interface exposes the ability for web pages to create Notification objects.\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\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003einterface NotificationCenter {\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e // Notification factory methods.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e Notification createNotification(in DOMString iconUrl, in DOMString title, in DOMString body) throws(Exception);\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e optional Notification createHTMLNotification(in DOMString url) throws(Exception);\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e // Permission values\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e const unsigned int PERMISSION_ALLOWED \u003d 0;\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e const unsigned int PERMISSION_NOT_ALLOWED \u003d 1;\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e const unsigned int PERMISSION_DENIED \u003d 2;\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan\u003e // Permission methods\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e int checkPermission();\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e void requestPermission(in Function callback);\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e}\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe NotificationCenter interface is available via the Window interface through the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ewebkitNotifications\u003c/span\u003e property.\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\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:small\"\u003einterface Window {\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e...\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e attribute NotificationCenter webkitNotifications;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e...\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e}\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\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:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003ci\u003eMethods\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ecreateNotification\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eCreates a new notification object with the provided content.  \u003ci\u003eiconUrl\u003c/i\u003e contains the URL of an image resource to be shown with the notification; \u003ci\u003etitle\u003c/i\u003e contains a string which is the primary text of the notification; \u003ci\u003ebody\u003c/i\u003e contains a string which is secondary text for the notification.  If the origin of the script which executes this method does not have permission level \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ePERMISSION_ALLOWED\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e, this method will throw a security exception.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ecreateHTMLNotification\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eThe parameter \u003ci\u003eurl\u003c/i\u003e contains the URL of a resource which contains HTML content to be shown as the content of the notification.  If the origin of the script which executes this method does not have permission level \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ePERMISSION_ALLOWED\u003c/span\u003e, this method will throw a security exception.  In Chromium, only http:, https:, and chrome-extension: schemes are allowed for \u003ci\u003eurl\u003c/i\u003e.\u003cbr /\u003e\u003c/span\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;font-weight:bold\"\u003echeckPermission\u003c/span\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eReturns an integer, either \u003cfont face\u003d\"'courier new', monospace\"\u003ePERMISSION_ALLOWED\u003c/font\u003e, \u003cfont face\u003d\"'courier new', monospace\"\u003ePERMISSION_NOT_ALLOWED\u003c/font\u003e, or \u003cfont face\u003d\"'courier new', monospace\"\u003ePERMISSION_DENIED\u003c/font\u003e, which indicates the permission level granted to the origin of the script currently executing.\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ePERMISSION_ALLOWED\u003c/font\u003e\u003cfont\u003e (0) \u003c/font\u003eindicates that the user has granted permission to scripts with this origin to show notifications.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ePERMISSION_NOT_ALLOWED\u003c/font\u003e\u003cfont\u003e (1) \u003c/font\u003eindicates that the user has not taken an action regarding notifications for scripts from this origin.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ePERMISSION_DENIED\u003c/font\u003e\u003cfont\u003e \u003c/font\u003e(2)\r\n indicates that the user has explicitly blocked scripts with this origin\r\n from showing notifications.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cb\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003erequestPermission\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eRequests that the user agent ask the user for permission to show notifications from scripts.  This method should only be called while handling a user gesture; in other circumstances it will have no effect. This method is asynchronous.  The function provided in \u003ci\u003ecallback\u003c/i\u003e will be invoked when the user has responded to the permission request.  If the current permission level is PERMISSION_DENIED, the user agent may take no action in response to \u003cfont face\u003d\"'courier new', monospace\"\u003erequestPermission\u003c/font\u003e.\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\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:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eLifetime of notifications\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf the page which generates a notification was generated is closed, the notification itself will not be closed, but events will not be delivered, as the script execution context is no longer present.\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\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:small\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:13px\"\u003e\u003cblockquote style\u003d\"margin:0px 0px 0px 40px;border-style:none;padding:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/span\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/5153557688383760058"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/desktop-notifications/api-specification"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4326769457085824926"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4326769457085824926"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4326769457085824926"}],"author":[{}],"sites$pageName":{"$t":"api-specification"},"sites$revision":{"$t":"19"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4943706090728846181"},"published":{"$t":"2012-11-19T16:43:27.563Z"},"updated":{"$t":"2013-01-17T09:38:12.373Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-17T09:38:10.829Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"WebNavigation API internals"},"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-size:medium;font-weight:normal\"\u003e\r\n\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-This-document-aims-at-explaining-how-the-webNavigation-API-is-tracking-the-navigation-state-of-a-WebContents-aka-RenderViewHostDelegate-.-If-you-re-interested-in-the-source-the-WebContentsObserver-is-defined-in-src-chrome-browser-extensions-api-web_navigat\" /\u003e\u003cb style\u003d\"font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis document aims at explaining how the \u003c/span\u003e\u003ca href\u003d\"http://developer.chrome.com/extensions/webNavigation.html\"\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\"\u003ewebNavigation API\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 tracking the navigation state of a WebContents (aka RenderViewHostDelegate). If you’re interested in the source, the WebContentsObserver is defined in \u003c/span\u003e\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc\"\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\"\u003esrc/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc\u003c/span\u003e\u003c/a\u003e\u003c/b\u003e\u003c/h1\u003e\r\n\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-What-is-the-current-RenderViewHost-\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat is the current RenderViewHost?\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eContrary to popular belief, a WebContents has not a 1:1 relation to a RenderViewHost, but in fact, it's a 1:n relation. A WebContents has one visible RenderViewHost at a time, but the RenderViewHost can change during navigation, and the WebContents keeps around previous RenderViewHosts in case the user comes back to them. Therefore, a WebContentsObserver has to pay close attention to which RenderViewHost triggered a given signal.\u003c/span\u003e\u003c/b\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe WebNavigation API tracks two RenderViewHosts per WebContents, the current RenderViewHost, and the pending RenderViewHost. The former is the visible one: the latest RenderViewHost in which a top-level navigation was committed, or, if no such RenderViewHost exists, the first RenderViewHost connected to the WebContents.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe latter is the latest RenderViewHost in which a provisional top-level navigation was started other than the current RenderViewHost.\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe ignore all navigations from RenderViewHosts but those two RenderViewHosts. We also do not observe navigation events from interstitial pages such as SSL certificate errors - these are rendered with an InterstitialPage as RenderViewHostDelegate.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThose two RenderViewHosts are determined as follows.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003e WebContentsObserver::AboutToNavigateRenderView\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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\"\u003eEvery top-level navigation starts with this call. If this is the first call, the passed in RenderViewHost becomes the current RenderViewHost, otherwise, if it isn't the current RenderViewHost, it becomes the pending RenderViewHost.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidCommitProvisionalLoadForFrame\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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\"\u003eAs soon as a top-level navigation is committed, the corresponding RenderViewHost becomes the current RenderViewHost. We discard the pending RenderViewHost.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidFailProvisionalLoad\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 pending RenderViewHost fails the provisional load, we discard it.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::RenderViewGone:\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 current RenderViewHost crashes, we discard both RenderViewHosts.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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\r\n\u003c/span\u003e\u003c/p\u003e\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::RenderViewDeleted:\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 pending RenderViewHost is deleted for whatever reason, we discard it. If the current RenderViewHost is deleted, we discard it and if there is a pending RenderViewHosts it becomes the current RenderViewHost.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 the current RenderViewHost is not only deleted when the tab is closed. The instant search and prerender features can swap in a different WebContents of a tab.\u003c/span\u003e\u003c/p\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Navigation-of-a-top-level-Frame\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNavigation of a top-level Frame\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFor a successful navigation, a frame has to go through several states (see also Adam’s recent presentation “\u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/presentation/pub?id\u003d1ZRIQbUKw9Tf077odCh66OrrwRIVNLvI_nhLm2Gi__F0#slide\u003did.p\" style\u003d\"font-family:Times;font-size:medium\"\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\"\u003eHow WebKit works\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e”). Keep in mind that you can receive these signals from any number of RenderViewHosts. You should ignore all signals but from the current RenderViewHost or the pending RenderViewHost.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSince a frame is only uniquely identified within a renderer process, and a WebContents can be a delegate for several RenderViewHosts in different renderer processes, we need the tuple (RenderViewHost, frame_id) to identify a frame uniquely within a given WebContents.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidStartProvisionalLoadForFrame\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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\"\u003eAt this point, the URL load is about to start, but might never commit (invalid URL, download, etc..). Only when the subsequently triggered resource load actually succeeds and results in a navigation, we will know what URL is going to be displayed.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003econtent::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 not strictly necessary to track the navigation state, we observe this notification to determine whether a server-side redirect happened.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidCommitProvisionalLoadForFrame\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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\"\u003eAt this point, the navigation was committed, i.e. we received the first headers, and an history entry was created.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 navigation only changed the reference fragment, or was triggered using the history API (e.g. \u003c/span\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/docs/DOM/window.history\" 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\"\u003ewindow.history.replaceState\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), we will receive this signal without a prior DidStartProvisionalLoadForFrame signal.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DocumentLoadedInFrame\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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\"\u003eWebKit finished parsing the document. At this point scripts marked as defer were executed, and content scripts marked “document_end” get injected into the frame.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidFinishLoad\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 navigation is done, i.e. the spinner of the tab will stop spinning, and the onload event was dispatched.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 we’re displaying replacement content, e.g. network error pages, we might see a DidFinishLoad event for a frame which we didn’t see before. It is safe to ignore these events.\u003c/span\u003e\u003c/p\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Navigation-of-a-sub-frame\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNavigation of a sub-frame\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe navigation events for sub-frames do not differ from the events for the top-level frame. Sub-frame navigations can start at any time after the provisional load of their parent frame was committed. If a sub-frame is part of the parent document (as opposed to created by JavaScript), the parent frame’s DidFinishLoad signal will be sent after all of its sub-frames DidFinishLoad signals.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIt’s also possible for sub-frames of a frame to send navigation signals while their parent frame already started a new provisional load.\u003c/span\u003e\u003cbr /\u003e\r\n\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Navigation-failures\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNavigation failures\u003c/span\u003e\u003c/h2\u003e\r\n\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA navigation can fail for a number of reasons. Since we’re tracking the state of all frames (and extensions using the webNavigation API might do the same), it is important to not have frames hanging around forever. They should either finish navigation, or fail.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe following is a list of events we observe to determine whether a navigation has failed.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\r\n\u003c/span\u003e\u003c/font\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003econtent::NOTIFICATION_RENDER_VIEW_HOST_DELETED\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 frame’s RenderViewHost was deleted, the navigation failed.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::AboutToNavigateRenderView\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 pending RenderViewHost is replaced by a new pending RenderViewHost, all frames navigating in the old pending RenderViewHost fail.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidCommitProvisionalLoadForFrame\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 main frame of the current RenderViewHost commits, all navigations in the pending RenderViewHost fail. If the main frame committed a real load (as opposed to a reference fragment navigation or an history API navigation), all sub frames in the current RenderViewHost fail.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 a frame in the pending RenderViewHost commits, all navigations in the current RenderViewHost fail.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidFailProvisionalLoad\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 error would occur if e.g. the host could not be found.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::DidFailLoad\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 error would occur if e.g. window.stop() is invoked, or the user hits ESC.\u003c/span\u003e\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"font-family:Times;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\"\u003eWebContentsObserver::WebContentsDestroyed\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium;margin-left:36pt;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 frames we know about fail.\u003c/span\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/webnavigation-api-internals"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4943706090728846181"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4943706090728846181"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4943706090728846181"}],"author":[{"name":{"$t":"Jochen Eisinger"},"email":{"$t":"jochen@chromium.org"}}],"sites$pageName":{"$t":"webnavigation-api-internals"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3480660358243557906"},"published":{"$t":"2013-01-16T16:42:55.949Z"},"updated":{"$t":"2013-01-16T16:42:55.956Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-16T16:42:55.949Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-c7-bottom-screws.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3480660358243557906"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6261796016295893248"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c7-chromebook/acer-c7-bottom-screws.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3480660358243557906"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3480660358243557906"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3480660358243557906"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3480660358243557906"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3808973889243409779"},"published":{"$t":"2013-01-16T16:20:08.121Z"},"updated":{"$t":"2013-01-16T16:20:08.129Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-16T16:20:08.121Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"acer-c7-case-bottom.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3808973889243409779"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6261796016295893248"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-c7-chromebook/acer-c7-case-bottom.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3808973889243409779"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3808973889243409779"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3808973889243409779"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3808973889243409779"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3425137477067944961"},"published":{"$t":"2013-01-10T20:01:22.259Z"},"updated":{"$t":"2013-01-11T00:03:42.731Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-11T00:03:41.534Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Auto-install of android companion 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\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e12/12/2012\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eFrancois Dermu (\u003ca href\u003d\"mailto:mwd743@chromium.org\"\u003emwd743@chromium.org\u003c/a\u003e)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Verdana,sans-serif;margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"background-color:transparent\"\u003eApps Extension API Team\u003c/span\u003e \u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eA way for third parties that have both an Android app and a Chrome extension to get their companion chrome extensions automatically installed on the user's chrome browser without having to ask them to go to their browser and type in a URL to download it or to do a search in the Chrome web store.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eMy use case is that I have an app that let the user transfer informations to a chrome extension. My problem is that the chrome extension is not easily discoverable and there is no easy way for me to send the user from his phone over to the right page on his chrome browser. I can create a short URL for him to remember and manually type in his browser but this is far from the ease of use I had in mind. Also the user may not be in front of his computer when he installs my app.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eA good example would be for Evernote. They have an android app and an extension that lets the user take snippets of web pages and save them in their notes that they can then view on their phone. Wouldn't it be great if once the user installed the android app he is presented with the option to also automatically install the chrome extension so that when he goes to his computer it's already there for him to use.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eI don't think so since this is dealing with chrome extensions specifically.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUnless you change the way extensions are installed this API shouldn't ever change.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003eIf multiple 3rd party call this API the browser should just queue up the installations. I don't foresee any issues with that. The only issue I could imagine is if you are trying to install an extension that is incompatible with your version of chrome or other already installed extensions but is that even possible ?\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThis API shouldn't affect any UI.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003eWe could simply use the existing way that Chrome tells users that there is a new extension (Chrome shows a balloon next to the new button saying that the extension is installed)\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eIll-intentioned app developers could try to abuse this api by making you install thing you don't want.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) \u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003etry to purposely send installation requests for thousands of extensions (\u003c/span\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eDenial of Service type of attach by sending an insane amount of requests\u003c/span\u003e\u003c/font\u003e\u003cb style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) \u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ethe same one multiple times\u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3) \u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003emake you install paid apps or extensions without your knowledge\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e4) \u003c/span\u003e\u003c/font\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003emaking you install extensions that they didn't create for a profit\u003c/span\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cb style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThese abuses would obviously need to be adressed by limiting the amount of extension an app can install, the delay between installation and probably handling paid apps differently like for example opening the store page but not pursuing the purchase or simple forbidding this API for paid apps. Performance shouldn't be degraded any further than when the user installs extensions manually and there is already a synching mechanism in place to auto-install extensions and apps to match it across all your chrome instances. On the android side an app that calls that API should have that functionality listed in the same place where they put all the warnings about accessing your data during installation.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eIf the API is called for an extension that is already installed nothing would happen.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Times\"\u003e\u003cfont\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe extensions would have to be registered to the same author than the android app to prevent bloatware installation.\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Times\"\u003e\u003cfont\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSince the user would have to be logged in to the same Google account on both the phone and chrome there shouldn't be any security risks.\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eDoesn't apply here.\u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cfont\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eOne could make an extension that essentially allows other third parties to install extensions remotely. The user would have to manually install that extension but once he has it and the API is public the door would be open for anyone to remotely install extensions on that browser.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-weight:bold\"\u003eDraft Manifest Changes \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eDoesn't apply here.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThere would be an android API that once called the android system would then transfer the installation request to Chrome's already existing mechanism of extension installation (as part of the sync mechanism)\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe Chrome API itself wouldn't be disclosed to the public (only the android one)\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe android API could be apart of the android version of Chrome (that the user would have logged in with the same account as the one on his computer)\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/auto-install-of-android-companion-extensions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3425137477067944961"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3425137477067944961"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3425137477067944961"}],"author":[{}],"sites$pageName":{"$t":"auto-install-of-android-companion-extensions"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2861127565655091558"},"published":{"$t":"2013-01-09T07:15:08.714Z"},"updated":{"$t":"2013-01-09T07:15:08.721Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-09T07:15:08.714Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"4-autoscale.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2861127565655091558"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7257777504967824123"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-v8-profiling-timeline-plots/4-autoscale.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2861127565655091558"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2861127565655091558"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2861127565655091558"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2861127565655091558"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4449765245100991331"},"published":{"$t":"2013-01-09T07:14:46.476Z"},"updated":{"$t":"2013-01-09T07:15:02.096Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-09T07:15:02.081Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"3-undistorted.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4449765245100991331"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7257777504967824123"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-v8-profiling-timeline-plots/3-undistorted.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4449765245100991331"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4449765245100991331"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4449765245100991331"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4449765245100991331"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3095739835235793880"},"published":{"$t":"2013-01-09T07:14:09.889Z"},"updated":{"$t":"2013-01-09T07:14:09.905Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-09T07:14:09.889Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"2-distorted.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3095739835235793880"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7257777504967824123"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-v8-profiling-timeline-plots/2-distorted.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3095739835235793880"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3095739835235793880"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3095739835235793880"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3095739835235793880"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/957753064218770025"},"published":{"$t":"2013-01-09T07:11:59.990Z"},"updated":{"$t":"2013-01-09T07:11:59.997Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-09T07:11:59.990Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"1-plot-internal.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/957753064218770025"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7257777504967824123"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-v8-profiling-timeline-plots/1-plot-internal.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/957753064218770025"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/957753064218770025"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/957753064218770025"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/957753064218770025"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/15918124023221052"},"published":{"$t":"2013-01-09T07:11:37.918Z"},"updated":{"$t":"2013-01-09T07:11:37.931Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-09T07:11:37.918Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"0-prof-only.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/15918124023221052"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7257777504967824123"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/creating-v8-profiling-timeline-plots/0-prof-only.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/15918124023221052"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/15918124023221052"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/15918124023221052"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/15918124023221052"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4948028195785987511"},"published":{"$t":"2013-01-02T22:31:21.926Z"},"updated":{"$t":"2013-01-07T20:45:20.111Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-07T20:45:18.789Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Spellcheck 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDecember 27, 2012\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erlp@\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSpelling team\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe proposed API would allow the user to load a new dictionary.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrently there are many languages which neither Chrome spellchecking nor our third party library Hunspell support (e.g., Zulu, Klingon, etc.). We routinely see bug reports requesting languages not yet supported (approximately 20-30% of Spellcheck bugs). There are avid users who have put together or would put together dictionaries if they knew they could use them. This API would provide an interface to allow them to write extensions to load the dictionary of their choice making it available for spellchecking.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe have several bugs that are for languages which we do not support and cannot find libraries. If we provided this API, those users could maintain their own dictionaries.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIt is unlikely that spellchecking will become part of the web platform. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYes. We will allow users to specify which format their dictionary is in. If at some point we change the format which we read dictionaries in, we will be able to update the API to keep the current format and simply convert to the new format.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWith this API we'd be adding the ability to have multiple dictionaries. If multiple extensions provided dictionaries, the only problem might be on loading if the user had an excessive number of dictionary-loading extensions as the loading was queued up.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSettings-\u0026gt;Language Settings: We would need to show the new dictionary as a language being used for spellcheck.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen spellchecking, red underlines and other spelling features would now be dependent on the dictionary available through this API.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn the Settings-\u0026gt;Language Settings dialog, we would show an icon or tag to indicate that a given dictionary came from an extension rather than a built in library.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDictionaries are just text files which are loaded in to Chrome. Possible abuse could be adding words which one would normally expect to be spellchecked such that they are not any more or adding \"bad\" words such as cursing or swear words. Someone could also attempt to add a dictionary which is really code to be executed upon loading. \u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb style\u003d\"font-weight:normal\"\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-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1) Buffer overflow with a loaded dictionary.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2) Killing a normal spellcheck by creating a dictionary of common misspellings.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3) Creating a dictionary with code that executes upon loading.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe would not allow binary dictionaries and we would sanitize all dictionaries before loading them, ensuring that they only consisted of words in the format we expect. This would eliminate 1 and 3. 2 is difficult to eliminate because if the user wants to add common misspellings as \"correct\" words, that's their choice and we would not want to prevent them from doing so.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNo. Once an extension using this API was removed, the dictionary it loads would no longer be loaded and the user would not see the dictionary in their Settings. Thus there would be no trace of this extension.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe could provide a command line option for users to load a dictionary from a file on their system. The unfortunate aspect of this method is that users then have to find the file on the web and figure out how to pass it in from the command line which means only power users are likely to do so. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft Manifest Changes \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUnknown -- see additional questions at bottom.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eMethods\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eloadDictionary\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.spellcheck.loadDictionary\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:13.5pt;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\"\u003eLoads a dictionary based on the format specified by the user. This dictionary is automatically set to be used for spellchecking, but the user can stop using it for spellchecking via the Settings-\u0026gt;Language Settings dialog at any time.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edictionaryFile (string)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  The path for the dictionary file. This may be either a url or a local file path.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003edictionaryFormat(enumerated string [\"hunspell\", \"text\"])\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  The user must indicate which format their dictionary is in: hunspell dictionary (concatentation of .aff and .dic files) or plain text.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eresult (int)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  The result is a int indicating success or an error code in loading the dictionary.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eExample:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003efunction loadMyDictionary(myDictionaryFile) {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  var result \u003d chrome.experimental.spellcheck.loadDictionary(myDictionaryFile);\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  if (!result) {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    // Indicate to user that dictionary load failed through dialog/infobar/etc.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e  }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIs a dictionaryLoaded event necessary?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDo we need an optional permission to load the dictionary?\u003c/span\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/903657469582497800"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/spellcheck-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4948028195785987511"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/6"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4948028195785987511"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4948028195785987511"}],"author":[{"name":{"$t":"Rachel Weinstein Petterson"},"email":{"$t":"rlp@chromium.org"}}],"sites$pageName":{"$t":"spellcheck-api"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1643039316111941160"},"published":{"$t":"2012-03-30T17:09:31.536Z"},"updated":{"$t":"2013-01-06T05:33:06.673Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-06T05:33:05.621Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Fast Intro to Git Internals"},"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-on sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003ch4 class\u003d\"sites-embed-title\"\u003eFast Intro to Git Internals\u003c/h4\u003e\u003cdiv class\u003d\"sites-embed-object-title\" style\u003d\"display:none;\"\u003eFast Intro to Git Internals\u003c/div\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-writely\"\u003e\u003ciframe src\u003d\"http://docs.google.com/document/preview?hgd\u003d1\u0026amp;id\u003d1X5SnleaX4qpLCc4QMAMWdvrA5QRsUO-YxXKjhSZRPpY\" width\u003d\"100%\" height\u003d\"600\" title\u003d\"Fast Intro to Git Internals\" frameborder\u003d\"0\" /\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/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/fast-intro-to-git-internals"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1643039316111941160"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1643039316111941160"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1643039316111941160"}],"author":[{"name":{"$t":"Eugene Girard"},"email":{"$t":"girard@chromium.org"}}],"sites$pageName":{"$t":"fast-intro-to-git-internals"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/920129665217275985"},"published":{"$t":"2009-12-01T11:33:31.563Z"},"updated":{"$t":"2013-01-05T20:14:39.433Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-05T20:14:39.432Z"},"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/920129665217275985"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/920129665217275985"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/920129665217275985"}],"author":[{}],"sites$revision":{"$t":"5"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Asus Eee PC 901"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":""},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://computers.shop.ebay.com/PC-Laptops-Netbooks-/177/i.html?_nkw\u003dEEEPC+901\u0026_catref\u003d1\u0026_fln\u003d1\u0026_trksid\u003dp3286.c0.m282 "}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7399025284715861081"},"published":{"$t":"2009-11-23T00:46:48.332Z"},"updated":{"$t":"2013-01-05T19:50:02.879Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-05T19:50:02.879Z"},"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/7399025284715861081"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7399025284715861081"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7399025284715861081"}],"author":[{"name":{"$t":"Dan Erat"},"email":{"$t":"derat@chromium.org"}}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Asus Eee PC 900HA"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"fans may not work?"},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.amazon.com/Eee-PC-900-8-9-Inch-Processor/dp/B00191PKJK"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/79914823222633186"},"published":{"$t":"2009-11-25T18:18:02.661Z"},"updated":{"$t":"2013-01-05T19:49:52.663Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-05T19:49:52.663Z"},"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/79914823222633186"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/79914823222633186"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/79914823222633186"}],"author":[{}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Asus Eee PC 700"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":""},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":""}]},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1766848398781090471"},"published":{"$t":"2009-11-19T23:22:32.708Z"},"updated":{"$t":"2013-01-05T19:49:38.390Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-05T19:49:38.389Z"},"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/1766848398781090471"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1766848398781090471"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1766848398781090471"}],"author":[{}],"sites$revision":{"$t":"6"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Asus Eee PC 1008HA Seashell 10.1-Inch Pearl Black Netbook"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":""},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.amazon.com/1008HA-Seashell-10-1-Inch-Pearl-Netbook/dp/B0029QMDZI"}]},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1547640317813419507"},"published":{"$t":"2009-12-01T11:24:57.817Z"},"updated":{"$t":"2013-01-05T19:48:58.361Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-05T19:48:58.361Z"},"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/1547640317813419507"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1547640317813419507"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1547640317813419507"}],"author":[{}],"sites$revision":{"$t":"4"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Asus Eee PC 1005HA"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":""},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"http://www.amazon.com/s/ref\u003dnb_ss?url\u003dsearch-alias%3Delectronics\u0026field-keywords\u003d1005HA\u0026x\u003d0\u0026y\u003d0"}]},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5649985049009937634"},"published":{"$t":"2013-01-02T19:22:57.181Z"},"updated":{"$t":"2013-01-02T19:23:19.899Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2013-01-02T19:23:17.826Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Profile Extension 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDecember 27, 2012\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003erlp@\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProfiles team (sub team of Frontend team)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAccess to profile information for extensions. This requires adding one method and extending another.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe addition would be a method which returns a list of all existing users on a machine. Users would be an object consisting of to two pieces of data: profile name and icon.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe second part of this proposal would be adding an optional profile parameter to the \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.window.create \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emethod, allowing extensions to open a window for another user.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAn API to open windows in new profiles has been requested by the marketing team. Furthermore, providing access to the list of profiles would allow extensions to open windows in a selected profile. We've had several profile bugs about not being able to open a link or otherwise in the expected and/or desired profile.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe marketing team has requested access to multiple users for demos. This API would allow for writing an extension to give them the needed access.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNo, because profiles are specific to Chrome.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eYes, this API should be stable due to its simplicity. Even if the underlying structure of profiles change, this should not affect this API.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdditional access to profiles could be added in the future.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis API is read-only. It cannot change or create new profiles. So there can be no conflict between multiple extensions.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis would not add any new UI.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFor the extension to creating a new window, we would be piggybacking on existing methods for indicating a new window was opened by an extension. For getting the list of users, there is no external action which would be visible to users.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis would provide the extension access to know which users are on a given instance of Chrome. Some may view this as as security concern although this information is already available.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBy allowing the extension to open new windows, you could potentially switch users on someone.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e1) Open up a website requiring a password with a different user. The original user doesn't realize the newly opened window is from a different user, enters their password which is then stored for the other user.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2) Get a list of the users on a computer and send that information back to a nefarious server (though I don't know what they'd do with that information).\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3) Share information about one user with another.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUser icons from the extension API could be tagged to indicate they are from the extension api.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNo they could not. All information is read-only so they could not make any permanent changes to the state of a user's Chrome.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrently there is no way to get this information or allow someone to open a window with a different profile.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft Manifest Changes \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNone.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eTypes\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eProfile (object)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eProperties of Profile\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e  name (string)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe name of the profile.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eicon (ImageData)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e    The icon of the profile.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eMethods\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003egetProfileList\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.users.getProfileList\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:4.5pt;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\"\u003eReturns a list of current users known for this instance of Chrome. If the current user is in managed mode or on ChromeOS, this list will only contain the current user.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eresult (array of \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eProfile\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eAdditional Parameter for \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.windows.create\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eprofileName (string)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe name of the profile which the window should be created for. If the current user is in managed mode or on ChromeOS, this parameter will have no effect as they can only open windows for the current user.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this be a function under \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.windows\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e?\u003c/span\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/profile-extension-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5649985049009937634"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/6"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5649985049009937634"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5649985049009937634"}],"author":[{"name":{"$t":"Rachel Weinstein Petterson"},"email":{"$t":"rlp@chromium.org"}}],"sites$pageName":{"$t":"profile-extension-api"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2801740348409333263"},"published":{"$t":"2011-12-18T00:34:13.131Z"},"updated":{"$t":"2012-12-24T06:14:32.352Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-24T06:14:30.612Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SPDY Best Practices"},"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\"text-align:left;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-size:15px;font-weight:bold;white-space:pre-wrap\"\u003eApplication level\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUse a single connection\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - it’s better for SPDY performance and for the internet to use as few connections as possible. For SPDY, this will result in better packing of data into packets, better header compression, less connection state, fewer handshakes, etc. It improves TCP behavior across the internet and reduces bufferbloat. Interacts better with NATs as well as it requires less state.\u003c/span\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan\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/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eDon’t shard hostnames\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - This is a hack used by web apps to work around browser parallelism limits. For all the reasons that we suggest using a single connection, hostname sharding is suboptimal when you can use SPDY instead. Furthermore, hostname sharding requires extra DNS queries and complicates web apps due to using multiple origins.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUse server push instead of inlining\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - This is a hack used by web apps to reduce RTTs. Inlining reduces the cacheability of web pages and may increase web page sizes due to base64 encoding. Instead, the server can just push the content.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUse request prioritization\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - Clients can advise the server on relative priorities for resources. Some basic heuristics which clients should all do generally is to make sure that html \u0026gt; js, css \u0026gt; *.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUse reasonable SPDY frame sizes\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - Although the spec allows for large frames, it is often desirable to use smaller frames, because this allows for better interleaving of frames from different streams.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003ci\u003eDon't use CSS sprites with external stylesheets\u003c/i\u003e - Resources in external stylesheets are obviously only discovered after the external stylesheet has been downloaded, and only once the rule matches an element. The advantage they provide of reducing HTTP requests is unnecessary with SPDY due to its multiplexing. Therefore, CSS sprites just make it slower.\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSSL\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUse smaller, but complete, certificate chains\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - The size of certificate chains can substantially affect connection startup performance due to increased serialization latency and using up precious bytes in the initcwnd, costing extra RTTs. Also, when the server does not present the full certificate chain, then clients have to fetch intermediate certificates, adding yet more roundtrips before the connection becomes usable by the application.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUse wildcard certs\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - SPDY allows for connection sharing, which helps reduce the number of connections, which is beneficial for all the reasons already stated.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eDon’t use overly large SSL write buffers\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - Large TLS application records will span multiple packets. Since applications must process complete TLS application records, this may add latency. Google servers use 2k buffers.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTCP\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eServers should ensure initcwnd is at least 10\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - initcwnd is a major bottleneck that impacts initial page load times. HTTP works around this by opening multiple connections simultaneously, essentially achieving \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003en * initcwnd\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e initial congestion window sizes.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eTurn off tcp_slow_start_after_idle\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - Linux by default will have tcp_slow_start_after_idle set to 1. This drops cwnd back down to initcwnd and goes back to slow start after the connection has been “idle” (defined as the RTO). This kills persistent single connection performance and should be turned off.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ePersist cwnd\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - SPDY provides a SETTINGS frame to allow for persisting settings across connections. Clients can use this information to remember their previous stable cwnd level and replay that to the server. Servers can use kernel modifications to set the cwnd for the connection.\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/5048080902362104097"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/spdy/spdy-best-practices"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2801740348409333263"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2801740348409333263"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2801740348409333263"}],"author":[{"name":{"$t":"William Chan"},"email":{"$t":"willchan@chromium.org"}}],"sites$pageName":{"$t":"spdy-best-practices"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3993106963075089633"},"published":{"$t":"2012-12-22T02:01:31.256Z"},"updated":{"$t":"2012-12-22T02:03:54.430Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-22T02:03:52.530Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"about-signin-internals"},"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 dir\u003d\"ltr\"\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\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe “chrome://signin-internals” webpage is a special URL in chromium that displays a summary of all signin and authentication related information in Google Chrome. It is useful in the triage and pinpointing of errors that could potentially be authentication related.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Summary\" /\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\"\u003eSummary\u003c/span\u003e\u003c/h3\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Information-Displayed\" /\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\"\u003eInformation Displayed\u003c/span\u003e\u003c/h4\u003e\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome Version - The version, branch and channel of chrome\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSignin Status - Whether the user is signed in or not\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUser Id - The id for the currently signed in user or none if not signed in.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSid/Lsid - The hash of the SID/LSID for this session.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Last-Signin-Details\" /\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\"\u003eLast Signin Details\u003c/span\u003e\u003c/h3\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Information-Displayed1\" /\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\"\u003eInformation Displayed\u003c/span\u003e\u003c/h4\u003e\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eType - Is this a credential or a cookie jar/OAuth based login\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTime - The time stamp of the most recent login\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLast OnClientLogin Status/Time - The status and timestamp of the last credential based login attempt. ‘Successful’ if everything went right, an error message if something went wrong.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLast OnOAuthLogin Status/Time - The status and timestamp of the last OAuth based login attempt. ‘Successful’ if everything went right, an error message if something went wrong.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003cli dir\u003d\"ltr\" style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLast OnGetUserInfo Status/Time - The status and timestamp of the last attempt to fetch information about the currently authenticated user on a successful login. The user info is fetched immediately after a Client or OAuth login, so the timestamp should be close to one of the preceding values.\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Room-for-improvement\" /\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\"\u003eRoom for improvement\u003c/span\u003e\u003c/h4\u003e\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd ChromeOS specific information (Retail login, etc).\u003c/span\u003e\u003c/p\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Token-Details\" /\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\"\u003eToken Details\u003c/span\u003e\u003c/h3\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:justify;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\"\u003eFor each service, displays the hash of the current token (or 0 if we don’t have a token), the time stamp of the last token fetch attempt, and the status of the last token fetch attempt. Currently the following services are tracked.\u003c/span\u003e\u003c/p\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Services-managed-by-TokenService\" /\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\"\u003eServices managed by TokenService\u003c/span\u003e\u003c/h4\u003e\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echromiumsync\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003egaia\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003elso\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003emobilesync\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoauth2LoginAccessToken\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoauth2LoginRefreshToken\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Services-using-OAuth2AccessTokenConsumer\" /\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\"\u003eServices using OAuth2AccessTokenConsumer\u003c/span\u003e\u003c/h4\u003e\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eAppNotifyChannelSetup\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eChromeToMobile\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eOperationsBase\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eProfileDownloader\u003c/span\u003e\u003c/li\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;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eUserCloudPolicyManager\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Room-for-improvement1\" /\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\"\u003eRoom for improvement\u003c/span\u003e\u003c/h4\u003e\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;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce OAuth2AccessTokenConsumers are migrated to use OAuth2TokenService, centralize signin-internals notifications from those services similar to how TokenService behaves now.\u003c/span\u003e\u003c/li\u003e\u003c/ul\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/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/about-signin-internals"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3993106963075089633"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3993106963075089633"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3993106963075089633"}],"author":[{}],"sites$pageName":{"$t":"about-signin-internals"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/398530755474506003"},"published":{"$t":"2012-12-18T09:43:49.797Z"},"updated":{"$t":"2012-12-18T09:43:49.797Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-18T09:43:49.797Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/398530755474506003"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/398530755474506003"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/398530755474506003"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"Aura"},{"index":"B","name":"Title","$t":"Aura Design Docs"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://dev.chromium.org/developers/design-documents/aura\"\u003ehttp://dev.chromium.org/developers/design-documents/aura\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2682574781624044543"},"published":{"$t":"2012-12-18T09:42:36.133Z"},"updated":{"$t":"2012-12-18T09:42:36.133Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-18T09:42:36.133Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2682574781624044543"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2682574781624044543"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2682574781624044543"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"GEM"},{"index":"B","name":"Title","$t":"GEM v. TTM"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://lwn.net/Articles/283793/\"\u003ehttp://lwn.net/Articles/283793/\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7022400417956445647"},"published":{"$t":"2012-12-18T09:42:24.056Z"},"updated":{"$t":"2012-12-18T09:42:24.056Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-18T09:42:24.056Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7022400417956445647"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7022400417956445647"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7022400417956445647"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"GEM"},{"index":"B","name":"Title","$t":"Memory Management for GPUs"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://lwn.net/Articles/257417/\"\u003ehttp://lwn.net/Articles/257417/\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6291529737352703301"},"published":{"$t":"2012-12-18T09:41:42.918Z"},"updated":{"$t":"2012-12-18T09:41:42.918Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-18T09:41:42.918Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6291529737352703301"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6291529737352703301"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6291529737352703301"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"DRM/X11/GL"},{"index":"B","name":"Title","$t":"How DRI And DRM Work"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://www.bitwiz.org.uk/s/how-dri-and-drm-work.html\"\u003ehttp://www.bitwiz.org.uk/s/how-dri-and-drm-work.html\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8231986835551888216"},"published":{"$t":"2012-12-17T23:58:28.494Z"},"updated":{"$t":"2012-12-17T23:59:21.552Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-17T23:58:28.499Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Unhealthy tests report"},"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\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/unhealthy-tests-report"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8231986835551888216"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8231986835551888216"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8231986835551888216"}],"author":[{"name":{"$t":"Anantha Keesara"},"email":{"$t":"anantha@chromium.org"}}],"sites$pageName":{"$t":"unhealthy-tests-report"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2826676621924804154"},"published":{"$t":"2012-12-14T23:04:50.119Z"},"updated":{"$t":"2012-12-14T23:04:50.127Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-14T23:04:50.119Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Fragment padding.png.1355408184699.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2826676621924804154"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/349937782470366506"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/pnacl/aligned-bundling-support-in-llvm/Fragment%20padding.png.1355408184699.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2826676621924804154"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2826676621924804154"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2826676621924804154"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2826676621924804154"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/459322066456068423"},"published":{"$t":"2012-06-07T22:38:14.853Z"},"updated":{"$t":"2012-12-10T22:07:36.896Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-10T22:07:35.558Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Compositor Thread 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\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"text-align:left;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-jamesr-enne-vangelis-nduca-chromium.org\" /\u003e\u003cb style\u003d\"font-size:medium;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:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;jamesr, enne, vangelis, nduca\u0026gt; @chromium.org\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/h2\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Goals\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGoals\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe main render thread is a pretty scary place. This is where HTML, CSS, Javascript and pretty much everything on the web platform runs... or originates. It routinely stalls for tens to hundreds of milliseconds. On ARM, stalls can be seconds long. Sadly, it is not feasible to prevent all these stalls: style recalculation, synchronous network requests, long painting times, garbage collection, all these things have content-dependent costs.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe compositor thread architecture allows us to snapshot a version of the page and allow the user to scroll and see animations directly on the snapshot, presenting the illusion that the page is running smoothly.\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Background\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBackground\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSome background on the basic frontend compositor archtecture, as well as Chrome’s gpu architecture, can be found here: \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome\"\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://dev.chromium.org/developers/design-documents/gpu-accelerated-compositing-in-chrome\u003c/span\u003e\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Basic-Approach\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBasic Approach\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe compositor is architected into two halves: the main thread half, and the “impl thread” half. The word “impl” is horribly chosen, sorry! :)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe main thread half of the world is a typical layer tree. A layer has transformation, size, and content. Layers are filled in on-demand: layers can be damaged (setNeedsDisplayInRect). The compositor decides when to run the layer delegate to tell it to paint. This is similar to InvalidateRect/Paint model you see in most operating systems, but just with layers. Layers have children, and can clip/reflect/etc, allowing all sorts of neat visual effects to be created.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe impl-side of the compositor is hidden from users of the layer tree. It is a nearly-complete clone of the main thread tree --- when we have a layer on the main thread, it has a corresponding layer on the impl thread. Our naming is a little strange but:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eLayerChromium : the main thread version of a layer\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eCCLayerImpl : the impl-side verison of a layer\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe main thread tree is a model of what webkit wants to draw. The main thread paints layer contents into textures. These are handed to the impl tree. The impl tree is actually what gets drawn to the screen. We can draw the impl tree anytime, even while the main thread is blocked.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUsers of the LayerChromium tree can specify that layers are scrollable. By routing all input events to the impl thread before passing them to the main thread, we can scroll and redraw the tree without ever consulting the main thread. This allows us to implement “smooth scrolling” even when the main thread is blocked.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUsers of the LayerChromium tree can add animations to the tree. We can run those animations on the impl tree, allowing hitch-free animations.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Tree-Synchronization-Hosts-and-Commits\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTree Synchronization, Hosts and Commits\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eEvery tab in Chromium has a different layer tree. Each tab has a layer tree host, which manages the tab-specific state for the tree. Again:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eCCLayerTreeHost: owns a tree of LayerChromiums, CCLayerTreeHost::m_rootLayer\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eCCLayerTreeHostImpl: owns a tree of CCLayerImpls, CCLayerTreeHostImp::m_rootLayer\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThese two trees, the main thread tree and the impl tree are completely isolated from one another. The impl tree is effectively a copy of the main thread tree, although with a different data type. We manually synchronize the impl tree to the main thread tree periodically, a process we call “commit”. A commit is a recursive walk over the main tree’s layers where we push “pushPropertiesTo” the impl-side equivalent of a layer. We do this on the impl thread with the main thread completely \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eblocked.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe basic logic of when to perform a commit is delayed. When the main tree changes, we simply make a note that a commit is needed (setNeedsCommit). When a layer’s contents change, e.g. we change a HTML div text somehow, we treat it as a commit. Later (under the discretion of a scheduler, discussed later) we decide to perform the commit. A commit is a blocking operation but still very cheap: it typically takes no more than a few milliseconds.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAn aside on our primitive thread model: we assume that both the main thread and the impl thread are message loops. E.g. they have postTask and postDelayedTask primitives. We try to keep both threads idle as often as possible and prefer async programming to taking a lock and blocking the thread.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe commit flow is as follows (see CCThreadProxy for implementation):\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eThe main thread gets damage. This turns into a setNeedsCommit\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eWe post the setNeedCommit message to the impl thread.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eThe impl thread passes the setNeedsCommit to the CCScheduler. Note, the scheduler is an impl-side concept --- it cannot access any state on the main thread.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eThe scheduler will consider the overall system state (whether we recently drew, when the next frame is, many other things) and will eventually say “okay, begin a commit”\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eThe beginFrameAndCommit command from the scheduler turns into a postTask back to the main thread.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eWhen the bFAC message runs on the main thread we do the following things:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eApply any impl-side scrolls to the main thread\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eCall the requestAnimationFrame callback\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003ePerform any pending layout (namely, HTML layout)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003ePaint any layers that need to be painted (software rasterization)\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli 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\"\u003eOnce painting is done, we post a message to the impl thread saying “beginCommit.” The main thread then waits on a “commit done” event. This event will be signaled by the impl thread when it finishes the commit.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eThe beginCommit message on the impl thread uploads textures, and then synchronizes the trees. When both are done, it signals the “commit done” event, which unblocks the main thread which was previously waiting on that event. This finishes the commit and the two trees are synchronized.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt this point, the impl tree can draw as often as it wants without consulting the main thread. Similarly, the main thread (thus javascript, etc) can mutate the main thread tree as much as it wants without consulting the impl thread.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe have one very important rule in the CCThreadProxy architecture: the main thread can make blocking calls to the impl thread, but \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ethe impl thread cannot make a blocking call to the main thread\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. Breaking this rule can lead to deadlocks.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-CCProxy\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCCProxy\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTo allow development of the threaded compositor while still shipping a single-threaded compositor, we have made it possible to run the same basic two-tree architecture in both single- and threaded modes. In single threaded mode, we still have two trees and delayed commits, but simply run a different synchronization/scheduling algorithm and host the tree on the main thread. This is implemented by the CCProxy interface, which abstracts the types of communication that go on between the main thread and the impl thread. For instance:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003esetNeedsCommit: tells the proxy to schedule a commit of the main thread tree to the impl tree\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003esetNeedsRedraw: tells the proxy to draw the impl tree (without synchronizing the trees)\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003esetVisible: tells the proxy to make the impl visible/invisible.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003ecompositeAndReadback(void* buf)\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003e… lots more\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThus, there are two subclasses of CCProxy:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eCCSingleThreadProxy: runs the compositor in single thread mode, where the impl tree exists and is drawn on the main thread\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eCCThreadProxy: runs the compositor on another thread, the impl thread. This is the “threaded compositor” mode.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-CCScheduler\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCCScheduler\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn addition to synchronizing trees, we have a lot of logic in the compositor that deals with when to commit, when to draw, whether to run animations, when to upload textures, and so on. This logic is not specific to whether the impl is running on the compositor thread or the main thread, so is put inside a standalone class called the CCScheduler. The scheduler exists logically as part of the impl side of tree, and thus in threaded mode lives on the impl thread.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe scheduler itself is a very simple class that glues together two key systems:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eCCFrameRateController: decides when good times to draw are. It listens to the underlying OS’ vsync api to detect vsync intervals as well as progress updates from the GPU. Its job is to dynamically pick a target frame rate and periodically kick the scheduler and tell it “now is a good time to draw.”\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eCCSchedulerStateMachine: tracks all the state of the compositing operation, e.g. screen dirty, commit needed, commit begun, and so on. We try to keep all corner case logic (“oops, you cant draw now”) inside this code so that it can be exhaustively unit tested.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eInput Handling\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA key use of the compositor thread is to scroll pages smoothly even when the main thread is blocked. We do this by intercepting input events before they arrive on the main thread’s event loop and redirecting them onto the impl thread.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce on the impl thread, they hit the WebCompositorInputHandler. This handler looks at the events and can ask the impl tree to try to scroll particular layers. However, scrolls can sometimes fail: WebKit does not give every scrollable area a layer (and associated clip objects). Therefore, on the impl tree, we track on each layer areas that cannot be impl-side scrolled. If the scroll request from the WebCompositorInputHandler fails because of hitting one of these areas, then we post the scrolling event to the main thread for normal processing. We call main-thread handled scrolls “slow scrolls” and impl-thread-side scrolls “fast scrolls.”\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eMemory Management\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe compositor is based around the idea of caching the contents of a layer in texture (or other GPU-friendly representation). This uses memory, of course. Chrome, being a tabbed browser, can sometimes have hundreds of tabs open and we need to somehow manage memory between all those tabs.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe use a two-level memory management scheme. In the GPU process, we have a GpuMemoryManager that tracks the visibility of all the tabs, and the association of graphics contexts to those tabs. Roughly, it figures out which graphics contexts should get what amount of the total GPU resources based on visibility and recently-used-ness. The global memory manager also factors in the workload requested by each tab, so that a big gmail tab can actually get more than, for example, a little popup window.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt the compositor level, each LayertTreeHost/Impl pair get an allocation from the GPU process for a certain memory budget. They are to do their best to not exceed this memory budget. We do this by prioritizing all the tiles on all layers, and then giving out memory budget to each tile in descending priority order until we hit our limit. Prioritization includes things like visibility, distance from viewport, whether the tile is on an animating layer, and whether the current layer velocity is likely to bring the tile onscreen.\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Texture-Upload\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTexture Upload\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOne challenge with all these textures is that we rasterize them on the main thread of the renderer process, but need to actually get them into the GPU memory. This requires handing information about these textures (and their contents) to the impl thread, then to the GPU process, and once there, into the GL/D3D driver. Done naively, this causes us to copy a single texture over and over again, something we definitely don't want to do.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe have two tricks that we use right now to make this a bit faster. To understand them, an aside on “painting” versus “rasterization.”\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003ePainting is the word we use for telling webkit to dump a part of its RenderObject tree to a GraphicsContext. We can pass the painting routine a GraphicsContext implementation that executes the commands as it receives them, or we can pass it a recording context that simply writes down the commands as it receives them.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eRasterization is the word we use for actually executing graphics context commands. We typically execute the rasterization commands with the CPU (software rendering) but could also execute them directly with the GPU using Ganesh.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eUpload: this is us actually taking the contents of a rasterized bitmap in main memory and sending it to the GPU as a texture.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWith these definitions in mind, we deal with texture upload with the following tricks:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003ePer-tile painting: we pass WebKit paint a recording context that simply records the GraphicsContext operations into an SkPicture data structure. We can then rasterize several texture tiles from that one picture.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eSHM upload: instead of rasterizing into a void* from the renderer heap, we allocate a shared memory buffer and upload into that instead. The GPU process then issues its glTex* operations using that shared memory, avoiding one texture copy.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe holy grail of texture upload is “zero copy” upload. With such a scheme, we manage to get a raw pointer inside the renderer process’ sandbox to GPU memory, which we software-rasterize directly into. We can’t yet do this anywhere, but it is something we fantasize about.\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Animation\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnimation\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe allow animations to be added with layers. They allow you to fade or translate layers using “curves,” which are keyframed representations of the position or opacity of a layer over time. Although animations are added on the main thread, they are executed on the impl thread. Animations done with the compositor are thus “hitch free.”\u003c/span\u003e\u003cbr /\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/b\u003e\u003c/b\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cb style\u003d\"font-weight:normal\"\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Terminology\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTerminology\u003c/span\u003e\u003c/h3\u003e\u003c/b\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThreads:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eWebKit thread \u003d\u003d Main Thread. This is the thread on which the LayerChromium hierarchy lives.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eCompositor thread \u003d\u003d the thread on which we will perform compositing. We call it impl thread because this is where the implementation of compositing happens.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eIO Thread \u003d\u003d the chromium thread that receives IPCs\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImpl thread is a word we use often. The compositor can operate in either single or threaded mode. Impl thread merely means “this lives on the impl half of the system.” Seeing the word “impl thread” does not mean that that code only runs on the compositor thread  -- it just means that it handles data that is part of the impl part of the architecture.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSuffixes indicate which thread data lives on:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eImpl class lives on the compositor thread. Eg cclayertreehostimpl\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eLack of suffix means data on the main thread. Eg cclayertreehost\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe use words that are ordinarily synonyms to mean very important and distinct steps in the updating of the screen:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003ePainting: this is the process of asking Layers for their content. This is where we ask webkit to tell us what is on a layer. We might then rasterize that content into a bitmap using software, or we might do something fancier. Painting is a main thread operation.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eDrawing: this is the process of taking the layer tree and smashing it together with OpenGL onto the screen. Drawing is an impl-thread operation.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/b\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/compositor-thread-architecture"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/459322066456068423"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/459322066456068423"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/459322066456068423"}],"author":[{}],"sites$pageName":{"$t":"compositor-thread-architecture"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8321442767738068933"},"published":{"$t":"2012-12-07T22:39:14.682Z"},"updated":{"$t":"2012-12-07T22:39:49.065Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-07T22:39:14.695Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"WebUI accessibility audit"},"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\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/8942633318364261387"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/domui-testing/webui-browser_tests/webui-accessibility-audit"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8321442767738068933"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8321442767738068933"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8321442767738068933"}],"author":[{"name":{"$t":"Alice Boxhall"},"email":{"$t":"aboxhall@chromium.org"}}],"sites$pageName":{"$t":"webui-accessibility-audit"},"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6358984594901687209"},"published":{"$t":"2012-12-01T00:53:14.272Z"},"updated":{"$t":"2012-12-01T00:53:14.313Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-12-01T00:53:14.272Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"favicon.ico"},"summary":{},"content":{"type":"image/x-icon","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6358984594901687209"},"link":[{"rel":"alternate","type":"image/x-icon","href":"https://sites.google.com/a/chromium.org/dev/favicon.ico"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6358984594901687209"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6358984594901687209"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6358984594901687209"},{"rel":"edit-media","type":"image/x-icon","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6358984594901687209"}],"author":[{"name":{"$t":"Viet-Trung Luu"},"email":{"$t":"viettrungluu@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8553407713550957425"},"published":{"$t":"2012-11-29T22:51:31.682Z"},"updated":{"$t":"2012-11-29T22:51:31.682Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-29T22:51:31.682Z"},"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/8553407713550957425"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8553407713550957425"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8553407713550957425"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Packard Bell EasyNote TS11-HR-868"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":""},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"function keys are working"},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":"laptop is not being sold anymore (bought it Jul 2011)"}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3687878305456139040"},"published":{"$t":"2012-11-02T22:35:42.479Z"},"updated":{"$t":"2012-11-29T03:45:49.159Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-29T03:45:49.159Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3687878305456139040"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3687878305456139040"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3687878305456139040"}],"author":[{}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Area","$t":"GEM"},{"index":"B","name":"Title","$t":"i915/GEM Crashcourse"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://blog.ffwll.ch/2012/10/i915gem-crashcourse.html\"\u003ehttp://blog.ffwll.ch/2012/10/i915gem-crashcourse.html\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8331342279804133578"},"published":{"$t":"2012-11-25T06:03:29.225Z"},"updated":{"$t":"2012-11-25T06:03:29.225Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-25T06:03:29.225Z"},"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/8331342279804133578"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8331342279804133578"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8331342279804133578"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"Samsung N150+ (Samsung NP-N150-KP01CZ)"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":""},{"index":"D","name":"Trackpad","$t":""},{"index":"E","name":"Suspend/Resume","$t":"on"},{"index":"F","name":"Comments \u0026 Caveats","$t":"Brightness is not configurable: high when powered by external source, low when running on battery. Suspend takes a while to finish."},{"index":"G","name":"Contact","$t":"noxx2cz@gmail.com"},{"index":"H","name":"Buy Link","$t":""}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5521641433259640619"},"published":{"$t":"2012-11-21T00:49:42.563Z"},"updated":{"$t":"2012-11-21T00:49:42.572Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-21T00:49:42.563Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"meh2.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5521641433259640619"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9017008956811641725"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/poking-around-your-chrome-os-device/meh2.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5521641433259640619"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5521641433259640619"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5521641433259640619"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5521641433259640619"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6741137576014464277"},"published":{"$t":"2012-11-17T07:02:40.857Z"},"updated":{"$t":"2012-11-17T07:02:40.864Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-17T07:02:40.857Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"arm-chromebook-inside-annotated.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6741137576014464277"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6973608406512395470"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook/arm-chromebook-inside-annotated.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6741137576014464277"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6741137576014464277"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6741137576014464277"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6741137576014464277"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5707505310692312188"},"published":{"$t":"2012-11-17T06:30:41.353Z"},"updated":{"$t":"2012-11-17T06:30:41.360Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-17T06:30:41.353Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"arm-chromebook-bottom-screw.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5707505310692312188"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6973608406512395470"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-arm-chromebook/arm-chromebook-bottom-screw.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5707505310692312188"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5707505310692312188"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5707505310692312188"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5707505310692312188"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8794183160416672910"},"published":{"$t":"2012-11-08T02:59:05.080Z"},"updated":{"$t":"2012-11-08T02:59:05.080Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-08T02:59:05.080Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8794183160416672910"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8794183160416672910"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8794183160416672910"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"Intel"},{"index":"B","name":"Title","$t":"Intel Driver Summary circa 2009"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://keithp.com/blogs/Sharpening_the_Intel_Driver_Focus/\"\u003ehttp://keithp.com/blogs/Sharpening_the_Intel_Driver_Focus/\u003c/a\u003e"}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1798904976644460149"},"published":{"$t":"2012-10-19T12:43:08.387Z"},"updated":{"$t":"2012-11-06T13:04:07.845Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-06T13:04:07.167Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SafeSearch"},"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-Design\" /\u003eDesign\u003c/h2\u003eWe wanted to introduce the option to enforce SafeSearch being active on all Google Search queries done in Chrome.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn order to do that we introduced both a preference(currently prefs::kForceSafeSearch) and a policy in Chrome which when set active will make sure that the parameters \u003cfont face\u003d\"courier new, monospace\"\u003esafe\u003dactive\u003c/font\u003e and \u003cfont face\u003d\"courier new, monospace\"\u003essui\u003don\u003c/font\u003e are present.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe implementation of this feature is done in \u003cfont face\u003d\"courier new, monospace\"\u003echrome/browser/net/chrome_network_delegate.cc\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e, where we see if it is a Google search URL (if the feature is active of course). Since an extension could come and modify the URL after us we let the extensions (if any) do their work first. If the extension modifies the URL the network stack will detect that and it will generate a \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eOnBeforeRedirect\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e which is followed by \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eOnBeforeURLRequest\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.\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\"\u003eIn \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003eOnBeforeURLRequest\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e we have two scenarios:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eeither the extensions(if any) return immediately and we enforce the SafeSearch parameters there.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eor the extensions(if any) use the callback to announce completion. For this case we use a wrapper that enforces the SafeSearch parameters and then calls the regular callback.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWhile enforcing the SafeSearch parameters we split the query part of the URL (everything between ? and #) into parameters. Then \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ewe remove any \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003esafe\u003d\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e and \u003c/font\u003e\u003cfont face\u003d\"courier new, monospace\"\u003essui\u003d\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e parameters and add the correct values at the end. As stated \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/chromium-string-usage\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e the query part is in ASCII..\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Other-search-engines\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOther search engines\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAt the current time this change only affects Google Web Search queries which come form any source (omnibox, google.tld websites). This is the result of a lack of standardization when it comes to setting SafeSearch. Maybe in the future we will pursue implementing this option for multiple search engines or thorugh OpenSearch.\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Tests\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTests\u003c/font\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThis feature is tested using unit tests in \u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003echrome/browser/net/chrome_network_delegate_unittest.cc.\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e To run the test simply compile the unit_tests executable and run:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e\u003cspan\u003e    \u003c/span\u003eout/Debug/unit_tests \"--gtest_filter\u003dChromeNetworkDelegateSafesearchTest.*\"\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eThe policy part of it is tested using browser tests in \u003c/span\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome/browser/policy/policy_browsertest.cc.\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e To run it:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e    out/Debug/browser_tests --gtest_filter\u003dPolicyTest.ForceSafeSearch\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\"arial, sans-serif\" size\u003d\"1\"\u003eNote: This feature is still in review and has not landed yet in Chrome. Initially it will also not be visible to the users.\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safesearch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1798904976644460149"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1798904976644460149"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1798904976644460149"}],"author":[{"name":{"$t":"Sergiu Iordache"},"email":{"$t":"sergiu@chromium.org"}}],"sites$pageName":{"$t":"safesearch"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7697541602749341341"},"published":{"$t":"2012-11-05T07:29:57.692Z"},"updated":{"$t":"2012-11-05T07:29:57.692Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-05T07:29:57.692Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7697541602749341341"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7697541602749341341"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7697541602749341341"}],"author":[{"name":{"$t":"Daniel Kurtz"},"email":{"$t":"djkurtz@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"Overview"},{"index":"B","name":"Title","$t":"The Linux Graphics Stack"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://blog.mecheye.net/2012/06/the-linux-graphics-stack/\"\u003ehttp://blog.mecheye.net/2012/06/the-linux-graphics-stack/\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3803051280907360225"},"published":{"$t":"2012-11-02T22:34:19.069Z"},"updated":{"$t":"2012-11-02T22:34:19.069Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-02T22:34:19.069Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3803051280907360225"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3803051280907360225"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3803051280907360225"}],"author":[{}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"DRM"},{"index":"B","name":"Title","$t":"DRM Developer's Guided (unofficial, revised)"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://www.ideasonboard.org/media/drm/\"\u003ehttp://www.ideasonboard.org/media/drm/\u003c/a\u003e"}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/73297239492970802"},"published":{"$t":"2012-11-02T22:33:40.271Z"},"updated":{"$t":"2012-11-02T22:33:40.271Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-11-02T22:33:40.271Z"},"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/408337301204496940"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/73297239492970802"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/73297239492970802"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/73297239492970802"}],"author":[{}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Area","$t":"DRM"},{"index":"B","name":"Title","$t":"DRM Developer's Guide"},{"index":"C","name":"URL","$t":"\u003ca xmlns\u003d\"http://www.w3.org/1999/xhtml\" href\u003d\"http://www.kernel.org/doc/htmldocs/drm.html\"\u003ehttp://www.kernel.org/doc/htmldocs/drm.html\u003c/a\u003e"}]},{"gd$etag":"\"UCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7921257303775631488"},"published":{"$t":"2012-01-17T08:22:07.986Z"},"updated":{"$t":"2012-10-25T00:49:22.936Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-25T00:49:21.402Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Font Settings"},"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-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eFont Settings API is now stable! See the \u003c/span\u003e\u003cb\u003e\u003ca href\u003d\"http://developer.chrome.com/stable/extensions/fontSettings.html\"\u003echrome.fontSettings\u003c/a\u003e documentation.\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eJan 17, 2012\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eMatt Falkenhagen (falken\u003ci\u003e@)\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eChrome Tokyo team / Chrome i18n team\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eExpose Chrome/WebKit font preferences to extensions, much like the Proxy Settings API.\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWe want to add a more advanced font settings UI than is currently available, and it might be decided that it should be an extension in interest of keeping the Chrome UI simple.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSpecifically, Chrome/WebKit recently added per-script font settings, so e.g., the \"sans-serif\" font setting for Simplified Chinese script can be different than the one for Traditional Chinese, or Japanese, etc. We want users to have access to these preferences. This is \u003ca href\u003d\"http://crbug.com/2685\"\u003ecrbug.com/2685\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eFurthermore, there are other font settings not currently exposed in the UI, such as for fantasy and cursive fonts. This API would allow extensions for those settings.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eNo.\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eNo, this is simply client-side Chrome/WebKit settings. I don't see how it could be part of the web platform.\u003ci\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eYes, it will be fairly stable, only changing when the underlying Chrome/WebKit settings change. Some reasons it may change are:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003eIt could be extended if support for additional scripts or CSS font families is needed.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003eThe per-script settings may be extended to be per-script+language. For example, \u003c/span\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eFarsi/Persian may need to use a different font than the one for Arabic language although both are written in Arabic script.\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003eSome settings like default font size, default fixed font size, minimum font size that are currently global settings may become per-script settings in the future.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003eWe could also add more parameters like font settings for certain URL patterns.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSince it's exposing Chrome/WebKit font settings, it should affect only the web content \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003erenderer\u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003e. These settings are not used in native UI surfaces to my knowledge.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eDescribe any concerns you have with exposing this API. Particular attention should be given to issues of security, privacy and performance.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eSince Chrome observes font settings changes and propagates them to WebKit, which redraws as necessary, maybe an extension can cause performance disruptions.\u003c/span\u003e\u003c/div\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e1) An extension that trashes the font settings. Uninstalling the extension would undo the damage.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"Arial\"\u003e2) An extension that rapidly keeps changing the fonts. It could conceivably be a DOS attack as WebKit tries to keep up.\r\n3) An extension that reads font settings and uploads to a server to try to build a database fingerprinting users by the font settings. Also, if the API exposes a list of fonts installed on the system, it can also be a source of information for fingerprinting. See: \u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ca href\u003d\"http://trac.webkit.org/wiki/Fingerprinting\" rel\u003d\"nofollow\"\u003ehttp://trac.webkit.org/wiki/Fingerprinting\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eNo. It just uses the standard \u003ca href\u003d\"http://www.chromium.org/developers/design-documents/preferences#TOC-Extension-Controlled-Preferences\"\u003eextension-controlled preferences\u003c/a\u003e feature \u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003ewhich handles cleanup when the extension is uninstalled.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-style:italic;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eIt could be part of the built-in Settings UI instead of relying on extensions.\u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eFor the appropriate style, please refer to \u003c/span\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/docs.html\" style\u003d\"font-family:Verdana,sans-serif;font-weight:bold\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,153);font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eexisting APIs\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e as well as the \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/developers/design-documents/extensions/\" style\u003d\"font-family:Verdana,sans-serif;font-weight:bold\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,153);font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eother API proposals\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eFor example, note that API calls that affect the browser process must be asynchronous, to prevent extension JavaScript from blocking on the browser UI.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003eSee the \u003ca href\u003d\"http://code.google.com/chrome/extensions/trunk/experimental.fontSettings.html\"\u003ecurrent API spec\u003c/a\u003e on trunk documentation.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003eOriginally I planned to use \u003ca href\u003d\"http://code.google.com/chrome/extensions/types.html#ChromeSetting\" style\u003d\"color:rgb(85,26,139)\"\u003eChromeSetting\u003c/a\u003e to expose all preferences, but there would be too many of them (about 30 scripts with 6 font families each...).\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eNote any unanswered questions that require further discussion.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThere was a possibility of putting per-script and other advanced font settings in the built-in UI, but to keep Chrome UI simple this is unlikely to happen.\u003c/span\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/font-settings"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7921257303775631488"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7921257303775631488"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7921257303775631488"}],"author":[{"name":{"$t":"Matt Falkenhagen"},"email":{"$t":"falken@chromium.org"}}],"sites$pageName":{"$t":"font-settings"},"sites$revision":{"$t":"19"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2369137934790367090"},"published":{"$t":"2012-10-24T22:21:45.431Z"},"updated":{"$t":"2012-10-24T22:21:45.438Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-24T22:21:45.431Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ClassHierarchy.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2369137934790367090"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/ClassHierarchy.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2369137934790367090"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2369137934790367090"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2369137934790367090"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2369137934790367090"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6782038401249602003"},"published":{"$t":"2012-10-24T22:19:37.170Z"},"updated":{"$t":"2012-10-24T22:19:37.175Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-24T22:19:37.170Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"KeyHierarchy.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6782038401249602003"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/KeyHierarchy.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6782038401249602003"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6782038401249602003"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6782038401249602003"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6782038401249602003"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4294237808498008196"},"published":{"$t":"2012-10-24T22:07:10.554Z"},"updated":{"$t":"2012-10-24T22:07:10.561Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-24T22:07:10.554Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChapsArchitecture.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4294237808498008196"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/ChapsArchitecture.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4294237808498008196"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4294237808498008196"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4294237808498008196"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4294237808498008196"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4116416979668138456"},"published":{"$t":"2012-10-24T21:00:33.088Z"},"updated":{"$t":"2012-10-24T21:00:33.096Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-24T21:00:33.088Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChapsStack.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4116416979668138456"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1642147871835167400"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chaps-technical-design/ChapsStack.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4116416979668138456"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4116416979668138456"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4116416979668138456"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4116416979668138456"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7206001826454418851"},"published":{"$t":"2012-10-22T19:47:53.623Z"},"updated":{"$t":"2012-10-22T19:47:53.713Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-22T19:47:53.623Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ninja"},"summary":{},"content":{"type":"application/x-shellscript","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7206001826454418851"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8862287037771446359"},{"rel":"alternate","type":"application/x-shellscript","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/-quickly-building-for-cros-arm-x64/ninja"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7206001826454418851"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7206001826454418851"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7206001826454418851"},{"rel":"edit-media","type":"application/x-shellscript","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7206001826454418851"}],"author":[{"name":{"$t":"Ami Fischman"},"email":{"$t":"fischman@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4195712908670722108"},"published":{"$t":"2012-10-22T19:47:42.127Z"},"updated":{"$t":"2012-10-22T19:47:42.178Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-22T19:47:42.127Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"goma-ninja"},"summary":{},"content":{"type":"application/x-shellscript","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4195712908670722108"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8862287037771446359"},{"rel":"alternate","type":"application/x-shellscript","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/-quickly-building-for-cros-arm-x64/goma-ninja"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4195712908670722108"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4195712908670722108"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4195712908670722108"},{"rel":"edit-media","type":"application/x-shellscript","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4195712908670722108"}],"author":[{"name":{"$t":"Ami Fischman"},"email":{"$t":"fischman@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6179800621093498723"},"published":{"$t":"2012-10-18T18:27:30.310Z"},"updated":{"$t":"2012-10-18T18:27:50.534Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-18T18:27:49.324Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Existing Autotest Utilities"},"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 is currently a placeholder.\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/existing-autotest-utilities"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6179800621093498723"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6179800621093498723"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6179800621093498723"}],"author":[{}],"sites$pageName":{"$t":"existing-autotest-utilities"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6836822063074691206"},"published":{"$t":"2012-10-11T16:11:13.930Z"},"updated":{"$t":"2012-10-12T13:28:33.469Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-12T13:28:33.407Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"compile_current_file.py"},"summary":{},"content":{"type":"text/x-python","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6836822063074691206"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6698293990290653964"},{"rel":"alternate","type":"text/x-python","href":"https://sites.google.com/a/chromium.org/dev/developers/sublime-text/compile_current_file.py"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6836822063074691206"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6836822063074691206"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6836822063074691206"},{"rel":"edit-media","type":"text/x-python","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6836822063074691206"}],"author":[{"name":{"$t":"Marc-André Decoste"},"email":{"$t":"mad@chromium.org"}}],"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2996376969540090565"},"published":{"$t":"2012-10-11T21:40:38.938Z"},"updated":{"$t":"2012-10-11T21:40:39.022Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-11T21:40:38.938Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"crash-with-gdb"},"summary":{},"content":{"type":"application/x-shellscript","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2996376969540090565"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3227207961814526512"},{"rel":"alternate","type":"application/x-shellscript","href":"https://sites.google.com/a/chromium.org/dev/for-testers/bug-reporting-guidelines/hanging-tabs/crash-with-gdb"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2996376969540090565"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2996376969540090565"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2996376969540090565"},{"rel":"edit-media","type":"application/x-shellscript","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2996376969540090565"}],"author":[{"name":{"$t":"Scott Hess"},"email":{"$t":"shess@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1912736460684356482"},"published":{"$t":"2012-10-11T20:16:57.974Z"},"updated":{"$t":"2012-10-11T20:23:08.731Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-11T20:23:07.835Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"embassy"},"content":{"type":"xhtml","$t":"\u003cdiv xmlns\u003d\"http://www.w3.org/1999/xhtml\"\u003e\u003ctable cellspacing\u003d\"0\" class\u003d\"sites-layout-name-two-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\u003cp dir\u003d\"ltr\" style\u003d\"text-align:center;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\"\u003eembassy: making model association + shutdown robust against  \r\nchange processing failures \u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:center;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\"\u003etim@chromium.org\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e1. Problems\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eThe native model and \"local\" sync model are persisted separately and hence can diverge.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eShutdown must wait for any change applied to \"local\" sync model to be applied to native. (via ScopedAllowWait)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eExtra memory, as every synced object has a \"sync shadow\" in memory at all times.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis document discusses these problems and some methods to address them in stages. If implemented, the proposals could make way to remove use of ScopedAllowWait in sync code, like task flushing / blocking in UIModelWorker::Stop. See Future section below for details.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e1.1 Dual databases\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProblem 1 above occurs because native models, such as the BookmarkModel, are written to disk at independent intervals and as part of independent transactions with respect to the syncable::Directory.  This leads to the Great Sync Nemesis - ‘back from the dead’ bugs.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e1.2 Synchronizing shutdown\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAlthough in practice corruption due to #1 should be rare, we go to great lengths in the browser to ensure back-from-the-dead issues don’t arise in other ways. One of those ways is Problem 2. If ApplyUpdates has completed, the WriteTransaction destruction will try to propagate changes across to native models via ChangeProcessors.  If that propagation doesn’t happen, any deletes that were applied to sync won’t get applied to native, so those items will be recreated on restart by model association.  To avoid this, at shutdown we join the UI thread with the sync thread before stopping change processors.  Aside from being complicated, this behavior reduces Chrome’s ability to parallelize shutdown tasks, hence can lead to jank and slowness (\u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/developers/design-documents/aura\"\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\"\u003esee bug 19757\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).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e2 Proposal\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe proposal involves installing some sync state in native data model territory. Kind of like embassies… hence the nickname. It is made up of three mostly independent parts.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e2.1 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ebookkeeping\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;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:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eProblems 1 \u0026amp; 2 could be handled with extra bookkeeping when persisting writes to native models and the Directory, providing a form of transactional semantics. Writes to each can be kept in lock step via a monotonically increasing timestamp or checksum, that would be incremented and persisted with writes to the native database. Then at any point (particularly after restart) it is possible to determine if changes to the Directory were not reflected in the native model prior to shutting down. We could rely on such detectability on restart, rather than having to wait on shutdown. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere are some twists. First, a single timestamp only lets us detect if \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003esomething\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e is out of sync, and not what items. Second, there are two failure modes - a) we lose a race with shutdown and don't even attempt application on the native model (though changes were successfully applied to the sync database), and b) writing / persisting to the native model fails for some reason (can happen at any time).  \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWith (a), it would normally be the case that the BookmarkModel (e.g.) and sync DB could be at most one timestamp apart, because of the way we signal the SyncScheduler to shutdown. Namely, we make a best effort to never open a WriteTransaction once exit has been requested, so the transaction would either succeed, or we would shutdown before the last open transaction could native-apply gracefully. But we have to worry about (b) because that write can actually fail if it is attempted. Meaning we do have to consider the case where the native model and sync DB are out of sync by more than one timestamp increment. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWe can address this, as well as tell \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ewhich\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e items failed to apply (and hence trust the sync model on restart**) in the following manner.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e2.1.1 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eFor edits (*not* deletes):\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen a transaction closes:\u003c/span\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eCompute timestamp t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and stamp every item (in the sync db only) that was mutated.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eStore that single timestamp value as a datatype global \"max timestamp\" in the sync DB as well.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eAttempt to write this single timestamp value into native model metadata \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonce the changes have been persisted there. Call it t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;font-style:italic;vertical-align:sub;white-space:pre-wrap\"\u003enative\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOn restart,\u003c/span\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eCompare t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003enative\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e and t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e. If t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003enative\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003d t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, perform normal model association.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eIf t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003enative\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u0026lt; t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e the last shutdown was not clean. During ModelAssociation, if any item read from the sync DB has a timestamp in the range [t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003enative\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e], trust the sync DB item.  Otherwise, trust native (normal ModelAssociation).\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003et\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003enative\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u0026gt; t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e shouldn't happen if implemented correctly, but it may be difficult to do so (to wait for success on sync persist before dispatching) since we may not have time at shutdown.  If this does happen, performing normal model association is the right thing to do.  The previous change will either be in an unapplied state or we will download it again.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRealistically we expect the logic in (2) to be needed rarely, but it should be robust - e.g. it handles cases such as server-deleted item that didn't get applied to native being re-added on model association.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e** \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis still doesn't gracefully handle hand-edits to bookmarks.js in the presence of an unclean shutdown. This is not a top concern.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e2.1.2 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eFor deletes\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;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:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf a tombstone is marked as applied in the sync database, it will not be re-loaded into memory from disk on a subsequent restart (see DropDeletedEntries).  This means the above approach (2.2.1.1) can't work for deletes, because there is no durable item to stamp with t.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSo, we can either\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003echoose to keep deleted entries around, tag them with t\u003c/span\u003e\u003cspan style\u003d\"font-size:9px;background-color:transparent;vertical-align:sub;white-space:pre-wrap\"\u003esyncdb\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e, and avoid dropping them until model association completes.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003ekeep a \"lookaside table\" / journal of deleted items (keyed by local_external_id), updated in the same transaction as the deletes themselves (sync side), cleared when model association completes.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(2) has the advantage of not changing any expectations on the sync side and also not loading unnecessary EntryKernels, since this journal is purely bookkeeping for the embedder, not for sync itself.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e*Note re “when model association completes” - if failures with model association could stilll somehow miss the delete, we could avoid purging the sync item in either of the two cases above until an additional 'consumed' bit was set.  This bit would get set on receipt of successful application (happy case) OR when model association consumes the item (likely deleting a local item). I don't think this necessary.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBookkeeping alone does not address Problem 3 at all, so on to the next part. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e2.2 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoffloading\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e. (optional) \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eP3 could be partially addressed by permitting groups other than GROUP_UI to offload associated sync entries to disk. This exploits the fact that groups with high numbers of items (and hence higher memory usage) don't typically have the requirement that they be readily available in memory. For these groups, synchronous trips to sqlite to fetch items is normal operation for the native model (e.g. autofill), and so it isn't an issue for sync to do the same.  \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSome work was done in this area before. The investigation included analyzing sync memory footprint and prototyping a mechanism to offload data.  At that time, the analysis did not show enough of a memory dent to warrant the extra complexity. But recent heap profiling of chrome startup has demonstrated a larger impact in sync allocations than experiments using the original method would suggest. The data is different enough that this needs to be revisited, especially with the new importance of mobile.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e2.3 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ereducing shadow size\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e (optional) \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBookkeeping + offloading together would partially address each problem from sec. 1, but some types (GROUP_UI, at least) would still suffer from sync shadows. This has some consequences, particularly on mobile.  As an enhancement to the two features above, we could also remove the copy of the EntitySpecifics from the local sync DB and store that only at the native site.  This (in tandem with bookkeeping) avoids back-from-the-dead issues and the awkwardness of handling tombstones (sec. 3.1, #2).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e3. Alternatives considered\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e3.1 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt a high level, the initial thinking was to shard the local portions (non SERVER_) across native models in Chrome. This would address all the issues listed above, although we would lose a few things from today's world -\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003col style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eNative schemas are agnostic and have no sync state or business logic duplicated for each data type.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eTombstone handling (follows from 1). Sync must set a bit (vs deep remove) when user deletes an entry.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eEncryption handling?\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThese are non-trivial sacrifices.  Although this high level idea made sense at first, the current proposal does not have the same drawbacks.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e3.2 \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnother idea is to change all model association implementations to behave differently if an item has ever been associated before.  For example, if we're re-associating a native item that previously had a sync item counterpart (which could be tracked by a bit in the native model), but that sync item no longer exists, a case could be made that the native item should be deleted rather than pushed into sync.  Similarly for edits, each data type could choose to do something different in the \"re-associating\" case. Bookmarks (or any type that can be modified before association occurs) would be more challenging to support with this, however, as would the post-unrecoverable-error model association run. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA significant downside to this is that it changes our happy-case paradigm of “never delete data, favor duplication”. We strayed from this with search engines, and ran into a lot of trouble. Data loss is *much* worse than duplication.  Any logic that deletes something should be used *extremely* rarely. Moreover, if it happens, it should be based on a single source of information and code for all data types in a consistent and prescriptive manner -- the sync engine should do the dirty work to ensure correctness (versus every model association implementation doing their own thing). Thus, the bookkeeping described in section 2.1 is preferable.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIt also may be more sensitive to changes that result from addressing crbug.com/80194.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e4. Future\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e4.1 Remove ScopedAllowWait in glue \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce restart and model association logic is sophisticated enough to deal with half-applied change scenarios described above, we don't have to rely on blocking the UI on ModelSafeWorkers to ensure changes are propagated at shutdown.  For example, we could \"jettison\" the sync engine at shutdown (perhaps via a CancellationFlag), so that it no longer attempts to forward work on to ChangeProcessors and terminates in isolation.  \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOne thing to note, however, is that the approaches described above are best-effort for \"late\" native side changes.  If any change occurs to a native model after the sync engine is \"jettisoned\", \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eand\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e it so happens that changes to that data type\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;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:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eoccurred on the sync side (that were not propagated due to jettison), the sync changes will trump the native changes on restart.  This is likely only a practical concern for bookmarks, due to hand-editability of bookmarks.js.  Late changes on both sides should be rare enough that this isn't a big issue, but we can add UMA to back up this speculation.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e4.2 Back-from-the-dead \u0026amp; UnrecoverableErrors \u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAnother place back-from-the-dead issues can crop up is with unrecoverable errors.  If a data type experiences an unrecoverable error during model association or change processing, sync mechanisms will disable that type for the given client so that others can continue syncing normally. On browser restart, the mechanism will try to restart that type (unless the user explicitly disabled it).  Let's call the time between when the error is hit and when a successful data type restart occurs the \"down time\" for that type. The problem is that any changes occurring to that type on \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eother\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e clients during \"down time\" will not be applied to the client that suffered the error. If any of those changes were, e.g. delete bookmark G, then the first successful model association after down-time on the affected client will bring G back, since it will still exist in the local bookmark model but not in sync.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCurrently, disabling a datatype T means the sync database is purged of items with type T.  Therefore, re-enabling it on a later restart will mean downloading a snapshot of T.  In our bookmark example, this dataset won't have G.  One option mentioned here for relation to the embassy proposal above might be to not purge the sync db on such an error, but keep things syncing silently (without any ChangeProcessor installed for that type).  The bookkeeping would then be able to tell us, when model associating after down-time, that G was deleted and we should not it add it back.  Leaving a type in the \"syncing silently\" state is fairly complex.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA (better?) alternative may be to keep a copy of the progress marker for T (taken just before purging), and use this along with some server support to recover from this case.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003c/td\u003e\u003ctd class\u003d\"sites-layout-tile sites-tile-name-content-2\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cbr /\u003e\u003cdiv dir\u003d\"ltr\"\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/7319728324630685729"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/sync/embassy"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1912736460684356482"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1912736460684356482"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1912736460684356482"}],"author":[{"name":{"$t":"Tim Steele"},"email":{"$t":"tim@chromium.org"}}],"sites$pageName":{"$t":"embassy"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3131816667773069778"},"published":{"$t":"2012-06-12T17:28:38.239Z"},"updated":{"$t":"2012-10-01T23:29:07.029Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-10-01T23:29:05.770Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Default Apps"},"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\"\u003eBranded Chrome builds ship with a few default apps (Gmail, YouTube, etc.) that are installed for new users. Default apps are implemented using a variant of the \u003ca href\u003d\"http://code.google.com/chrome/extensions/external_extensions.html\"\u003eexternal extensions\u003c/a\u003e mechanism.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eAdding a new default app\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eLocate the app in the Chrome Web Store\u003c/li\u003e\u003cli\u003eSelect the \"Debug\" tab\u003c/li\u003e\u003cli\u003eSave its .crx using the \"CRX Package Download: Published version\" link\u003c/li\u003e\u003cli\u003eCopy the .crx to \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/resources/default_apps/\"\u003esrc/chrome/browser/resources/default_apps\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eAdd it to \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/browser/resources/default_apps/external_extensions.json?view\u003dmarkup\"\u003eexternal_extensions.json\u003c/a\u003e and \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/build/common.gypi?view\u003dmarkup\"\u003ecommon.gypi\u003c/a\u003e (look for \u003cfont face\u003d\"courier new, monospace\"\u003edefault_apps_list\u003c/font\u003e and \u003cfont face\u003d\"courier new, monospace\"\u003edefault_apps_list_linux_dest\u003c/font\u003e)\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003eTesting your changes by making a branded build is tedious. Instead you can manually copy the default apps directory in your build output, e.g.:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e$ cp -r chrome/browser/resources/default_apps out/Debug/\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThen you can start chrome with \u003cfont face\u003d\"courier new, monospace\"\u003eout/Debug/chrome --user-data-dir\u003d/tmp/\u0026lt;somenewdir\u0026gt;\u003c/font\u003e to simulate the new user experience.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor an example, see \u003ca href\u003d\"https://chromiumcodereview.appspot.com/10535133\"\u003ethe changelist\u003c/a\u003e that added Google Docs as a default app.\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/1413957628261797388"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/default-apps"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3131816667773069778"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3131816667773069778"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3131816667773069778"}],"author":[{"name":{"$t":"Mihai Parparita"},"email":{"$t":"mihaip@chromium.org"}}],"sites$pageName":{"$t":"default-apps"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3113477659138001245"},"published":{"$t":"2012-07-20T17:31:17.257Z"},"updated":{"$t":"2012-09-27T20:45:29.529Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-27T20:45:28.343Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"fake-gsm-modem"},"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\u003eImplemented in \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/fake-gsm-modem\"\u003efake-gsm-modem\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eSeems to serve as a replacement for modemmanager (classic). I.e., I think it provides a mock implementation of the MM D-Bus APIs. In contrast, \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cros-network/fakemodem\"\u003efakemodem\u003c/a\u003e provides a mock implementation of the AT command interface.\u003c/li\u003e\u003cli\u003eFor data forwarding, you have to use an existing ethernet interface. (See comments at top of \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/fake-gsm-modem\"\u003efake-gsm-modem\u003c/a\u003e.)\u003c/li\u003e\u003cli\u003eTo test shill (as opposed to flimflam) against fake-gsm-modem, follow these steps:              \u003c/li\u003e\u003c/ul\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e$ stop flimflam\u003c/code\u003e\u003cdiv\u003e\u003ccode\u003e$ stop cromo\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ /usr/local/lib/flimflam/test/veth setup pseudomodem0 172.16.1\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ /usr/local/lib/flimflam/test/fake-gsm-modem -c tmobile --shill\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ start flimflam\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e   \u003c/span\u003e\u003c/span\u003e\u003c/span\u003eT-Mobile should now appear as a connectable network in the 'Internet Connection' Settings UI. Furthermore, running 'modem status' in crosh should display information on TestModem.\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e   Once done with the tests, run the following for cleanup:\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cdiv /\u003e\u003cdiv /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003ccode\u003e$ stop flimflam\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ # kill the fake-gsm-modem process\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ /usr/local/lib/flimflam/test/veth teardown pseudomodem0\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ start cromo\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e$ start flimflam\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e  \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e           shill will now interact with cromo. Bear in mind that, as of the writing of this entry, the shill daemon is still referred to as flimflam, which is why we call \u003ccode\u003estart flimflam\u003c/code\u003e and not \u003ccode\u003estart shill\u003c/code\u003e. This will be changed in the future.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e   The above steps apply to Chromebooks using a Gobi modem. For any other modem, replace \u003ccode\u003ecromo\u003c/code\u003e with the correct modem manager. \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan\u003e\u003cspan\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\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/4883777207799046826"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cros-network/fake-gsm-modem"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3113477659138001245"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3113477659138001245"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3113477659138001245"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"fake-gsm-modem"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3104841926570307253"},"published":{"$t":"2012-09-27T08:01:08.973Z"},"updated":{"$t":"2012-09-27T08:01:08.982Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-27T08:01:08.973Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"SublimeExample.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3104841926570307253"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6698293990290653964"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/sublime-text/SublimeExample.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3104841926570307253"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3104841926570307253"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3104841926570307253"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3104841926570307253"}],"author":[{"name":{"$t":"Tomas Gunnarsson"},"email":{"$t":"tommi@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1668352181905280148"},"published":{"$t":"2012-09-25T15:22:23.232Z"},"updated":{"$t":"2012-09-25T15:22:23.240Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T15:22:23.232Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse consoles.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1668352181905280148"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20consoles.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1668352181905280148"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1668352181905280148"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1668352181905280148"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1668352181905280148"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6225029248070964032"},"published":{"$t":"2012-09-25T15:16:43.406Z"},"updated":{"$t":"2012-09-25T15:17:56.453Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T15:17:56.434Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse glibc hit breakpoint.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6225029248070964032"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20glibc%20hit%20breakpoint.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6225029248070964032"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6225029248070964032"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6225029248070964032"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6225029248070964032"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1339325014797619084"},"published":{"$t":"2012-09-25T15:11:47.233Z"},"updated":{"$t":"2012-09-25T15:11:47.243Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T15:11:47.233Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse debug configuration glibc Debugger Main.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1339325014797619084"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20glibc%20Debugger%20Main.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1339325014797619084"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1339325014797619084"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1339325014797619084"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1339325014797619084"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8452002702675256666"},"published":{"$t":"2012-09-25T15:09:47.717Z"},"updated":{"$t":"2012-09-25T15:09:47.726Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T15:09:47.717Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse debug configuration glibc main.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8452002702675256666"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20glibc%20main.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8452002702675256666"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8452002702675256666"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8452002702675256666"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8452002702675256666"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2049731874376609873"},"published":{"$t":"2012-09-25T15:06:56.519Z"},"updated":{"$t":"2012-09-25T15:06:56.527Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T15:06:56.519Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse gdb_init file.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2049731874376609873"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20gdb_init%20file.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2049731874376609873"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2049731874376609873"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2049731874376609873"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2049731874376609873"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4067446339031436817"},"published":{"$t":"2012-09-25T13:48:56.200Z"},"updated":{"$t":"2012-09-25T13:48:56.219Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T13:48:56.200Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse hit breakpoint.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4067446339031436817"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20hit%20breakpoint.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4067446339031436817"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4067446339031436817"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4067446339031436817"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4067446339031436817"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4987550159369047500"},"published":{"$t":"2012-09-21T15:15:54.197Z"},"updated":{"$t":"2012-09-25T13:31:57.710Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T13:31:57.694Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse debug configuration Debugger Gdbserver Settings.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4987550159369047500"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20Debugger%20Gdbserver%20Settings.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4987550159369047500"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4987550159369047500"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4987550159369047500"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4987550159369047500"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/338065839971875001"},"published":{"$t":"2012-09-21T15:12:15.832Z"},"updated":{"$t":"2012-09-25T13:29:03.450Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-25T13:29:03.428Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse debug configuration Debugger Main.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/338065839971875001"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20Debugger%20Main.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/338065839971875001"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/338065839971875001"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/338065839971875001"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/338065839971875001"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2490886316128587551"},"published":{"$t":"2011-11-07T23:38:34.718Z"},"updated":{"$t":"2012-09-24T17:31:39.673Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-24T17:31:37.985Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Views accessibility"},"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 Views module provides a UI abstraction layer used on both Windows and Chrome OS. Views also provides accessibility support automatically on both platforms, so if you're building a UI using Views or even writing a new View, making it accessible is pretty easy.\u003ch3\u003e\u003ca name\u003d\"TOC-Keyboard-Access\" /\u003eKeyboard Access\u003c/h3\u003e\u003cdiv\u003e\u003cdiv\u003eIn Chromium, there are some \"panes\" that are not keyboard-accessible by default, by we provide a special mode to get access to them. For example, the main Toolbar and the Bookmarks Bar are not normally part of the tab order (with the exception of the location bar / omnibox). However, if your press F6 (on Windows; Ctrl+F1 on Chrome OS), it will focus the first item in the toolbar and you can use Tab to interact with the rest of the items in the toolbar. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/accessibility/windows-accessibility\"\u003eWindows accessibility\u003c/a\u003e for a little more information on the underlying model and user expectations for keyboard accessibility.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you're adding a new pane, or some other UI that appears in the main browser window but not inside of tab contents, you probably want it to have similar keyboard accessibility.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn Views, you can make a view accessible in this way with the AccessiblePaneView class, which is used as a base class for the toolbar, bookmarks bar, infobars, and more in Chromium. When you subclass AccessiblePaneView, you can designate controls that are not normally part of the tab order, but are keyboard-focusable if the user first focuses your pane (typically by pressing F6) and then tabs to the controls. Use View::set_accessibility_focusable(true) to identify views that should be focusable in this special mode but not under normal circumstances.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Screen-reader-accessibility-API-access\" /\u003eScreen reader / accessibility API access\u003c/h3\u003e\u003cdiv\u003eChromium provides access to screen readers and magnifiers that interact with Windows using accessibility APIs. When you create a new View, or build a new bit of UI using Views, it's important that you support these APIs so that all users can access the controls even if they have trouble seeing or using a mouse. Luckily most of the work has been done for you!\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you're just building UI (like a toolbar or dialog) using existing views, usually all that's necessary is to provide an accessible name / title for any control that doesn't already have accessible text.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you're creating new widgets, every accessible View subclass should override this method:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  virtual void GetAccessibleState(ui::AccessibleViewState* state);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAccessibleViewState looks like this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cpre style\u003d\"margin-top:0px;margin-bottom:0px;padding-top:0.5em;font-size:medium;line-height:16.25px\"\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003estruct\u003c/span\u003e UI_EXPORT \u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cspan\u003eAccessibleViewState\u003c/span\u003e {\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003epublic\u003c/span\u003e:\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e \u003cspan\u003eAccessibleViewState\u003c/span\u003e();\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e ~\u003cspan\u003eAccessibleViewState\u003c/span\u003e();\u003c/span\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The view's role, like button or list box.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e AccessibilityTypes::Role role;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The view's state, a bitmask containing fields such as checked\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// (for a checkbox) and protected (for a password text box).\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e AccessibilityTypes::State state;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The view's name / label.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e string16 name;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The view's value, for example the text content.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e string16 value;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The name of the default action if the user clicks on this view.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e string16 default_action;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The keyboard shortcut to activate this view, if any.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e string16 keyboard_shortcut;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The selection start and end. Only applies to views with text content,\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// such as a text box or combo box; start and end should be -1 otherwise.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eint\u003c/span\u003e selection_start;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eint\u003c/span\u003e selection_end;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// The selected item's index and the count of the number of items.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// Only applies to views with multiple choices like a listbox; both\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// index and count should be -1 otherwise.\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eint\u003c/span\u003e index;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eint\u003c/span\u003e count;\r\n\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e};\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen that method is called, call the inherited implementation and then modify |state| to reflect the current state of your view. Most views should just update the role and name, or perhaps the value and state. For example, a control that implements a multi-select list should return the current selected value in |value| and update |index| and |count| as appropriate.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFinally, if your control dynamically changes value, you may need to call NotifyAccessibilityEvent, like this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cpre style\u003d\"margin-top:0px;margin-bottom:0px;padding-top:0.5em;font-size:medium;line-height:16.25px\"\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cspan\u003eGetWidget\u003c/span\u003e()-\u0026gt;Notify\u003cspan\u003eAccessibility\u003c/span\u003eEvent(\r\n\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003ethis\u003c/span\u003e, ui::\u003cspan\u003eAccessibility\u003c/span\u003eTypes::EVENT_VALUE_CHANGED, true);\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eThe only way to test your application is by actually using a screen reader. Chromium's accessibility developers will be glad to assist you with this! To make our jobs easier, please first figure out a plan for keyboard accessibility and implement that completely - you shouldn't need our help with that. Once everything works great with the keyboard, we can help with screen reader accessibility testing to see what might need to be labeled.\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/7789018718369490338"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/accessibility/views-accessibility"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2490886316128587551"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2490886316128587551"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2490886316128587551"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"views-accessibility"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3359725975551429836"},"published":{"$t":"2011-11-07T23:59:50.814Z"},"updated":{"$t":"2012-09-24T17:19:52.732Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-24T17:19:51.508Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Linux Accessibility"},"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\u003eCurrently, accessibility of Chromium on desktop Linux is not really supported. However, there is a medium-term plan to solve this - please contact \u003ca href\u003d\"mailto:dmazzoni@chromium.org\"\u003edmazzoni@chromium.org\u003c/a\u003e if you'd like more information. Our goal is for all users to have an excellent experience, and we have a plan that will make everything work great while minimizing the extra effort required by Chromium developers.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Linux-assistive-technology\" /\u003eLinux assistive technology\u003c/h3\u003e\u003cdiv\u003eThe accessibility interface on Linux is the \u003ca href\u003d\"http://developer.gnome.org/atk/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eGNOME Accessibility ToolKit (ATK)\u003c/a\u003e. After enabling accessibility support in the GNOME Preferences (in Ubuntu, check System -\u0026gt; Preferences -\u0026gt; Assistive Technologies), you can check Chrome's support using \u003ca href\u003d\"http://live.gnome.org/Accerciser\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eaccerciser\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/7789018718369490338"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/accessibility/linux-accessibility"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3359725975551429836"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3359725975551429836"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3359725975551429836"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"linux-accessibility"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7161351044819024003"},"published":{"$t":"2011-11-07T23:13:32.190Z"},"updated":{"$t":"2012-09-24T17:14:25.646Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-24T17:14:24.233Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Windows accessibility"},"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\"\u003eMicrosoft Windows is the most widely used desktop operating system in the world, and while there are some basic built-in features for users with disabilities, there's a much larger and richer ecosystem of third-party products that provide alternative ways to interact with Windows.\u003ch3\u003e\u003ca name\u003d\"TOC-Keyboard-accessibility\" /\u003eKeyboard accessibility\u003c/h3\u003e\u003cdiv\u003eWindows has a tradition of being fully keyboard-accessible without any extra configuration needed, and Chromium should be no exception. There shouldn't be anything you can do with a mouse that you can't also do with the keyboard. Where possible, Chromium should use standard discoverable keyboard shortcuts, but where that's impossible or difficult, custom keyboard shortcuts are fine.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMost users are familiar with using Tab to cycle between focusable controls. Here are some other keys that are widely supported in Windows applications (and should be working great in Chromium, too):\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eF6 moves focus between various focusable panes. In Chromium, F6 provides access to the toolbar, bookmarks bar, infobars, and more.\u003c/li\u003e\u003cli\u003eShift+F10 (or the Context Menu key on some keyboards) opens a context menu.\u003c/li\u003e\u003cli\u003eSpace and Enter should press buttons and links. (In some dialogs, Enter presses the default button rather than the current button.)\u003c/li\u003e\u003cli\u003eF10 focuses the menu bar. In Chromium, it focuses the Chromium menu in the toolbar (but does not open it). You can also press and release Alt.\u003c/li\u003e\u003cli\u003eAlt+shift+\u0026lt;letter\u0026gt; places focus directly on a container (i.e. alt-shift-t places focus on the first item of the toolbar).\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003eIf you're adding new UI features, first see if you can make them discoverable - put them in the tab order for an existing pane. If that's impossible, make sure they have their own keyboard shortcut. Alternatively, for features containing menu items, you can let users learn about the shortcut from their exploration of the main Chromium menu.\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-High-Contrast-Mode\" /\u003eHigh Contrast Mode\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003eWindows has a special high contrast mode intended for people with low vision. The most common variation is white-on-black text instead of black on white. While Mac OS X and Linux provide this at the OS compositor layer (so apps don't have to do anything), Windows implements this by changing system colors and expects apps to use these colors.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo try High Contrast mode, press Alt+Shift+PrintScreen. (Note: must be the left alt and left shift key.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAll UI drawn by Chromium that's outside of the webpage should either be 100% themable, or it should respect the system colors. So when choosing colors for text and backgrounds in particular, be sure to use system colors, not hardcoded colors. See GetSysSkColor in ui/gfx/color_utils.h as a starting point.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOn Windows, users who have high-contrast mode enabled will see a bubble the first time they open Chrome, prompting them to install the \u003ca href\u003d\"https://chrome.google.com/webstore/detail/high-contrast/djcfdncoelnlbldjfhinnjlhdjlikmph\" target\u003d\"_blank\"\u003eHigh Contrast\u003c/a\u003e extension and a white-on-black theme from the web store (both optional). The High Contrast extension improves the readability of web content, and the themes improve the look of the rest of Chrome.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Accessibility-API-support\" /\u003eAccessibility API support\u003c/h3\u003e\u003cdiv\u003e\u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/ms971310.aspx\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eMicrosoft Active Accessibility (MSAA)\u003c/a\u003e is a COM interface that Windows programs can implement in order to allow access to their interface from assistive technology such as screen readers, magnifiers, voice-control applications, and more. Chromium has good support for MSAA now and it's important to keep it that way! When writing native Windows UI code, think about whether you might need to expose any additional information to make it accessible.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo do a quick accessibility check, download \u003ca href\u003d\"http://www.paciellogroup.com/blog/2011/06/aviewer-beta-updated/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eAViewer\u003c/a\u003e and press F6 to track focus. Then switch to Chromium and use the keyboard to navigate any area of the UI you want to test. Then check the Role, Name, Value, and other properties in AViewer and make sure they're correct.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote: Chrome doesn't enable accessibility for the main web area by default unless it detects a screen reader or other advanced assistive technology. To override this, run chrome.exe with the --force-renderer-accessibility flag.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eTo do a more involved check, learn to use \u003ca href\u003d\"http://www.nvda-project.org/\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003eNVDA\u003c/a\u003e, an open-source screen reader. Google employees also have access to site licenses for some of the most popular commercial tools, including JAWS and ZoomText.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003eMost of the time you probably won't be writing native Windows code, you'll be writing Views code. Views has its own accessibility layer, which should make things very easy - in most cases it will take only 2 or 3 lines of additional code to make a new control accessible. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/accessibility/views-accessibility\"\u003eViews Accessibility\u003c/a\u003e for more information.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you are writing native Windows code, you may be able to update the accessibility information for a particular widget using \u003ca href\u003d\"http://msdn.microsoft.com/en-us/windows/cc307286\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003edynamic annotation\u003c/a\u003e - that's the easiest. Here's an example that sets the accessible name of \u003cb\u003ehwnd\u003c/b\u003e to \u003cb\u003ename\u003c/b\u003e:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  base::win::ScopedComPtr\u0026lt;IAccPropServices\u0026gt; acc_prop_services;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  HRESULT hr \u003d CoCreateInstance(CLSID_AccPropServices, NULL, CLSCTX_SERVER,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      IID_IAccPropServices, reinterpret_cast\u0026lt;void**\u0026gt;(\u0026amp;acc_prop_services));\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  hr \u003d acc_prop_services-\u0026gt;SetHwndPropStr(hwnd, OBJID_CLIENT,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      CHILDID_SELF, PROPID_ACC_NAME, name.c_str());\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf all else fails, you'll have to implement a custom IAccessible interface for your widget. Hopefully not! So far Chrome doesn't have any examples of this, everything is either handled by the Views accessibility code in ui/views/accessibility, the web content accessibility code in content/browser/accessibility, or a few tiny annotations like the example above.\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/7789018718369490338"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/accessibility/windows-accessibility"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7161351044819024003"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7161351044819024003"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7161351044819024003"}],"author":[{"name":{"$t":"Dominic Mazzoni"},"email":{"$t":"dmazzoni@chromium.org"}}],"sites$pageName":{"$t":"windows-accessibility"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3133351329767388260"},"published":{"$t":"2011-09-23T16:15:40.563Z"},"updated":{"$t":"2012-09-21T22:57:29.967Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T22:57:28.728Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Mouse Lock (Pointer Lock)"},"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 describes implementation details of the \u003ca href\u003d\"http://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html\" rel\u003d\"nofollow\"\u003ePointer Lock\u003c/a\u003e JavaScript specification (In Chrome code it is referred to as Mouse Lock), the Pepper/NaCl \u003ca href\u003d\"https://developers.google.com/native-client/pepper16/pepperc/struct_p_p_b___mouse_lock\"\u003eMouseLock\u003c/a\u003e, and the shared user interface Full Screen Bubble UI .\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWhat is Pointer Lock?\u003c/b\u003e From the specification:\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003eThe Pointer Lock API provides for input methods of applications based on the movement of the mouse, not just the absolute position of a cursor. A popular example is that of first person movement controls in three dimensional graphics applications such as games. Movement of the mouse is interpreted for rotation of the view-port, there is no limit to how far movement can go, and no mouse cursor is displayed.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003ePointer Lock is related to Mouse Capture [MDN-SETCAPTURE]. Capture provides continued event delivery to a target element while a mouse is being dragged, but ceases when the mouse button is released. Pointer Lock differs by being persistent, not limited by screen boundaries, sending events regardless of mouse button state, hiding the cursor, and not releasing until an API call or specific release gesture by the user.\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDemos:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"http://media.tojicode.com/q3bsp/\" rel\u003d\"nofollow\"\u003emedia.tojicode.com/q3bsp/\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003ca href\u003d\"https://developer.mozilla.org/en-US/demos/detail/bananabread\" rel\u003d\"nofollow\"\u003ehttps://developer.mozilla.org/en-US/demos/detail/bananabread\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eChrome 16 introduced Mouse Lock only in full screen mode:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003ePepper and JavaScript apps can programmatically obtain mouse lock after full screen has been entered.\u003c/li\u003e\u003cul\u003e\u003cli\u003eFor trusted sites, full screen is entered without a user prompt to confirm.\u003c/li\u003e\u003cli\u003eFor untrusted sites full screen is entered and the user is prompted (see strings below). Mouse lock will not be possible until the user confirms fullscreen.\u003c/li\u003e\u003cli\u003eAttempts to lock the mouse prior to requesting full screen will fail. \u003c/li\u003e\u003cli\u003eAttempts to lock the mouse after full screen is entered but before it is confirmed will be merged with the full screen request and presented to the user as a single confirmation.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eAfter locking, exit instructions are shown for a brief amount of time (see strings below).\u003c/li\u003e\u003cli\u003eA content setting remembers the permission for any domain a user previously allowed. (done in \u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d97768\"\u003e97768\u003c/a\u003e)\u003c/li\u003e\u003cli\u003eMouse lock can be exited in many ways:\u003c/li\u003e\u003cul\u003e\u003cli\u003eProgrammatically.\u003c/li\u003e\u003cli\u003eUser pressing Esc.\u003c/li\u003e\u003cli\u003e\u003cul\u003e\u003cli\u003eThere is a conflict with Esc meaning \"stop loading\". Assuming the page is loading content and mouse lock is enabled, repeated presses to Esc will:\u003c/li\u003e\u003cul\u003e\u003cli\u003eESC to exit mouse lock \u0026amp; full screen\u003c/li\u003e\u003cli\u003eESC to stop loading\u003c/li\u003e\u003cli\u003eESC again is handled by the page.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/li\u003e\u003cli\u003eAnother window or tab getting focus.\u003c/li\u003e\u003cli\u003eFull screen mode is exited.\u003c/li\u003e\u003cli\u003eNavigation or a page refresh.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cb\u003eChrome 21 added support for Mouse Lock without the full screen prerequisite:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eA request to lock the mouse when the tab is not in full screen will succeed if it is made with a user gesture (e.g. a mouse click)\u003c/li\u003e\u003cli\u003eFor trusted sites mouse lock will be entered with exist instructions presented (see strings below).\u003c/li\u003e\u003cli\u003eFor untrusted sites the user is prompted to allow mouse lock (see strings below)\u003c/li\u003e\u003cul\u003e\u003cli\u003eIf full screen is then requested, the prompt will be merged to a single prompt\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eAfter mouse lock is accepted the site will be marked trusted, and the mouse locked.\u003c/li\u003e\u003cli\u003eIf full screen is requested while the mouse is locked and user confirmation is required the mouse will be unlocked to allow the user to allow full screen (the site will need to request mouse lock again).\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eAlso, when an application exits (i.e. not due to the user pressing ESC, etc.) and reenters mouse lock there is no user gesture required and no exit instructions are shown. This provides for an improved user experience when an application frequently shifts in and out of mouse lock, such as a game with first person controls but a cursor used for inventory management.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eChrome 22 shipped Pointer Lock (the JavaScript API) default on.\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eAccess restricted to same document only, and blocked from sandboxed iframes.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003eChrome 23 enables Pointer Lock via sandboxed iframes.\u003c/b\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u0026lt;iframe sandbox\u003d\"webkit-allow-pointer-lock ...\"\u0026gt;\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eStrings:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\"You have gone full screen.    Exit full screen (F11)\"\u003c/li\u003e\u003cli\u003e\"MyExtension triggered full screen    Exit full screen (F11)\"\u003c/li\u003e\u003cul\u003e\u003cli\u003eIt will be \"An extension triggered full screen Exit full screen (F11)\" if the extension is already uninstalled.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\"\u003cb\u003e\u003cu\u003e\u003cfont color\u003d\"#0000ff\"\u003egoogle.com\u003c/font\u003e\u003c/u\u003e\u003c/b\u003e is now full screen.    [Allow] [Exit full screen]\"\u003c/li\u003e\u003cli\u003e\"\u003cb\u003e\u003cu\u003e\u003cfont color\u003d\"#0000ff\"\u003egoogle.com\u003c/font\u003e\u003c/u\u003e\u003c/b\u003e is now full screen and wants to disable your mouse cursor.    [Allow] [Exit]\"\u003c/li\u003e\u003cli\u003e\"\u003cb\u003e\u003cu\u003e\u003cfont color\u003d\"#0000ff\"\u003egoogle.com\u003c/font\u003e\u003c/u\u003e\u003c/b\u003e wants to disable your mouse cursor.    [Allow] [Deny]\"\u003c/li\u003e\u003cli\u003e\"\u003cb\u003e\u003cu\u003e\u003cfont color\u003d\"#0000ff\"\u003egoogle.com\u003c/font\u003e\u003c/u\u003e\u003c/b\u003e is now full screen.    Press ESC to exit.\"\u003c/li\u003e\u003cli\u003e\"\u003cb\u003e\u003cu\u003e\u003cfont color\u003d\"#0000ff\"\u003egoogle.com\u003c/font\u003e\u003c/u\u003e\u003c/b\u003e is now full screen and disabling your mouse cursor.    Press ESC to exit.\"\u003c/li\u003e\u003cli\u003e\"\u003cb\u003e\u003cu\u003e\u003cfont color\u003d\"#0000ff\"\u003egoogle.com\u003c/font\u003e\u003c/u\u003e\u003c/b\u003e has disabled your mouse cursor.    Press ESC to exit.\"\u003c/li\u003e\u003cli\u003e(URLs in all strings are bold)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eContent Settings Preferences Page Strings:\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\u003e\u003cdiv\u003e\u003cdiv\u003eMouse Cursor\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e(_) Allow all sites to disable the mouse cursor\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e(o) Ask me when a site tries to disable the mouse cursor (recommended)\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e(_) Do not allow any site to disable the mouse cursor\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e[Manage Exceptions...]\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e   Mouse Cursor Exceptions\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eState transitions for the initial Chrome 16 launch were enumerated in this \u003ca href\u003d\"https://spreadsheets.google.com/spreadsheet/ccc?key\u003d0Ah7RuMHPdFJYdEFMSndkblFyWWNKdU9vUUloUk5GVVE#gid\u003d0\"\u003espreadsheet\u003c/a\u003e, which is now out of date with the addition of extension triggered full screen and non fullscreen permission of mouse lock.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eTests are in:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/codesearch#search/\u0026amp;exact_package\u003dchromium\u0026amp;q\u003dfullscreen_controller_browsertest.cc\u0026amp;type\u003dcs\"\u003efullscreen_controller_browsertest.cc\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/codesearch#search/\u0026amp;exact_package\u003dchromium\u0026amp;q\u003dfullscreen_controller_interactive_browsertest.cc\u0026amp;type\u003dcs\"\u003efullscreen_controller_interactive_browsertest.cc\u003c/a\u003e\r\n\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/codesearch#search/\u0026amp;exact_package\u003dchromium\u0026amp;q\u003dfullscreen_mouselock.py\u0026amp;type\u003dcs\"\u003efullscreen_mouselock.py\u003c/a\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRelated open issues: \u003ca href\u003d\"http://code.google.com/p/chromium/issues/list?can\u003d2\u0026amp;q\u003dFeature%3DInput-MouseLock\u0026amp;colspec\u003dID+Pri+Mstone+ReleaseBlock+Area+Feature+Status+Owner+Summary\u0026amp;cells\u003dtiles\"\u003eFeature\u003dInput-MouseLock\u003c/a\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/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/mouse-lock"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3133351329767388260"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3133351329767388260"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3133351329767388260"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$pageName":{"$t":"mouse-lock"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9163329442549911694"},"published":{"$t":"2012-09-21T15:25:42.980Z"},"updated":{"$t":"2012-09-21T15:25:42.985Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T15:25:42.980Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse last debug configurations.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9163329442549911694"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20last%20debug%20configurations.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9163329442549911694"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9163329442549911694"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9163329442549911694"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9163329442549911694"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6583344221978652076"},"published":{"$t":"2012-09-21T15:18:37.510Z"},"updated":{"$t":"2012-09-21T15:18:37.522Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T15:18:37.510Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse select preferred launcher.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6583344221978652076"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20select%20preferred%20launcher.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6583344221978652076"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6583344221978652076"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6583344221978652076"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6583344221978652076"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3584861737293794697"},"published":{"$t":"2012-09-21T15:05:31.785Z"},"updated":{"$t":"2012-09-21T15:05:31.801Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T15:05:31.785Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse debug configuration main.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3584861737293794697"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20configuration%20main.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3584861737293794697"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3584861737293794697"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3584861737293794697"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3584861737293794697"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4659844532495258376"},"published":{"$t":"2012-09-21T14:52:45.549Z"},"updated":{"$t":"2012-09-21T14:52:45.560Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T14:52:45.549Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse new debug configuration icon.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4659844532495258376"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20debug%20configuration%20icon.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4659844532495258376"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4659844532495258376"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4659844532495258376"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4659844532495258376"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3977706815747230672"},"published":{"$t":"2012-09-21T14:49:27.470Z"},"updated":{"$t":"2012-09-21T14:49:27.479Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T14:49:27.470Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse debug icon.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3977706815747230672"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20debug%20icon.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3977706815747230672"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3977706815747230672"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3977706815747230672"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3977706815747230672"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/706056184094821155"},"published":{"$t":"2012-09-21T11:08:45.521Z"},"updated":{"$t":"2012-09-21T11:08:45.535Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T11:08:45.521Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse with indexer enabled.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/706056184094821155"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20with%20indexer%20enabled.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/706056184094821155"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/706056184094821155"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/706056184094821155"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/706056184094821155"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9027601232263414885"},"published":{"$t":"2012-09-21T11:01:52.060Z"},"updated":{"$t":"2012-09-21T11:05:06.947Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T11:05:06.934Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse add directory path 2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9027601232263414885"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20add%20directory%20path%202.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9027601232263414885"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9027601232263414885"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9027601232263414885"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9027601232263414885"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3052442022043945362"},"published":{"$t":"2012-09-21T10:55:43.217Z"},"updated":{"$t":"2012-09-21T10:57:48.540Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T10:57:48.511Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse add directory path 1.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3052442022043945362"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20add%20directory%20path%201.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3052442022043945362"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052442022043945362"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3052442022043945362"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3052442022043945362"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2162746174837447419"},"published":{"$t":"2012-09-21T10:49:54.199Z"},"updated":{"$t":"2012-09-21T10:49:54.206Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T10:49:54.199Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse output location.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2162746174837447419"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20output%20location.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2162746174837447419"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2162746174837447419"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2162746174837447419"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2162746174837447419"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6380827806350636616"},"published":{"$t":"2012-09-21T10:47:49.532Z"},"updated":{"$t":"2012-09-21T10:47:49.544Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T10:47:49.532Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse source location.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6380827806350636616"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20source%20location.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6380827806350636616"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6380827806350636616"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6380827806350636616"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6380827806350636616"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4756113482923284787"},"published":{"$t":"2012-09-21T10:38:19.042Z"},"updated":{"$t":"2012-09-21T10:38:19.057Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T10:38:19.042Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse hammer icon.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4756113482923284787"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20hammer%20icon.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4756113482923284787"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4756113482923284787"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4756113482923284787"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4756113482923284787"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1697795981120046231"},"published":{"$t":"2012-09-21T10:35:14.023Z"},"updated":{"$t":"2012-09-21T10:35:14.037Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T10:35:14.023Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse build behaviour tab.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1697795981120046231"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build%20behaviour%20tab.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1697795981120046231"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1697795981120046231"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1697795981120046231"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1697795981120046231"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9184936609967424448"},"published":{"$t":"2012-09-21T10:02:19.056Z"},"updated":{"$t":"2012-09-21T10:02:19.069Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T10:02:19.056Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse build.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9184936609967424448"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9184936609967424448"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9184936609967424448"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9184936609967424448"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9184936609967424448"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8330073608738860901"},"published":{"$t":"2012-09-21T09:53:16.415Z"},"updated":{"$t":"2012-09-21T09:53:16.426Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T09:53:16.415Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse build variables.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8330073608738860901"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20build%20variables.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8330073608738860901"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8330073608738860901"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8330073608738860901"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8330073608738860901"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3990492161059000825"},"published":{"$t":"2012-09-21T09:50:47.861Z"},"updated":{"$t":"2012-09-21T09:50:47.866Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T09:50:47.861Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse new build variable.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3990492161059000825"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20build%20variable.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3990492161059000825"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3990492161059000825"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3990492161059000825"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3990492161059000825"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/485958015362170446"},"published":{"$t":"2012-09-21T09:41:32.776Z"},"updated":{"$t":"2012-09-21T09:41:32.789Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T09:41:32.776Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse project view.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/485958015362170446"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20project%20view.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/485958015362170446"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/485958015362170446"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/485958015362170446"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/485958015362170446"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4630747972434069413"},"published":{"$t":"2012-09-21T09:35:27.942Z"},"updated":{"$t":"2012-09-21T09:35:27.949Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-21T09:35:27.942Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"eclipse new project.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4630747972434069413"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4578507324020236643"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-with-debug-stub-recommended/debugging-nacl-apps-in-eclipse-cdt/eclipse%20new%20project.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4630747972434069413"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4630747972434069413"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4630747972434069413"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4630747972434069413"}],"author":[{"email":{"$t":"halyavin@google.com"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5684094687165412138"},"published":{"$t":"2012-09-14T23:15:52.608Z"},"updated":{"$t":"2012-09-20T23:48:56.760Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-20T23:48:55.802Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"iosurface-meeting-notes"},"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\u003eHow Chrome uses IOSurfaces:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e - Three processes involved in rendering: browser process (owns window), renderer process (sandboxed), GPU process (executes OpenGL)\u003c/div\u003e\u003cdiv\u003e - GPU process has to provide rendering results to browser process\u003c/div\u003e\u003cdiv\u003e - Upon window resize, GPU process allocates an IOSurface, uses IOSurfaceGetID to get global identifier\u003c/div\u003e\u003cdiv\u003e - Sends ID to browser process, which uses IOSurfaceLookup to turn it into an IOSurfaceRef\u003c/div\u003e\u003cdiv\u003e - Both processes use CGLTexImageIOSurface2D to bind IOSurface to an OpenGL texture\u003c/div\u003e\u003cdiv\u003e - GPU process binds texture to an FBO, renders into it using OpenGL\u003c/div\u003e\u003cdiv\u003e - Browser process texture maps that IOSurface onto a triangle pair\u003c/div\u003e\u003cdiv\u003e - (When window is resized, both GPU and browser processes use CFRelease against IOSurfaceRef to unreference it)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote:\u003c/div\u003e\u003cdiv\u003e - We found early on in Chrome's development that it didn't appear necessary to double-buffer our IOSurfaces\u003c/div\u003e\u003cdiv\u003e - For this reason, currently allocate one IOSurface per tab. Didn't want to double VRAM requirement unnecessarily.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. What are the buffering semantics of IOSurfaces? Double-buffered? Single-buffered? Is there locking going on internally to make them appear double-buffered?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Semantically single-buffered.\u003c/div\u003e\u003cdiv\u003e      Basically, rendering correctness is determined just by how the command buffers are serialized to the GPU.\u003c/div\u003e\u003cdiv\u003e      This means if the browser process manages to squeeze in a command buffer which draws the IOSurface to the screen in between the GPU process's command buffers filling the IOSurface, we could possibly see an incomplete rendered frame.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Is it possible to change these semantics with dictionary properties during IOSurfaceCreate?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. No.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Should Chrome double-buffer its IOSurfaces (i.e., avoid rendering into one while concurrently sampling from it in another process)? Would doing so avoid any driver instability (window server lockups, kernel panics) we have seen on various OS X hardware and software configurations? I note that both Firefox and the Qt WebKit port are double-buffering their IOSurfaces.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Double-buffering probably would only improve the \"race\" between rendering to and from the IOSurface.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. When are IOSurfaces released? If two processes both release their IOSurfaceRefs, is the IOSurface reclaimed immediately? In a deferred fashion?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Should go away immediately. Subject to outstanding live texture objects that reference that IOSurface.\u003c/div\u003e\u003cdiv\u003e      It would be possible to re-look up the IOSurface in this case. (* Maybe this is the reason Vangelis was able to do this in his testing. *)\u003c/div\u003e\u003cdiv\u003e      You have to call glDeleteTexture, or delete the OpenGL context, to ensure the IOSurface bound to the texture is gone.\u003c/div\u003e\u003cdiv\u003e      Can run: ioreg -n IOSurfaceRoot -w 0\u003c/div\u003e\u003cdiv\u003e      Has very verbose output, but it could be parsed.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e      A good indicator that we aren't leaking IOSurfaces is that the IOSurface IDs don't increase monotonically. If they are increasing, it's an indication something is leaking somewhere.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. At what point does the IOSurface allocation fail? We had a leak at one point, and at some point IOSurface allocation would fail.\u003c/div\u003e\u003cdiv\u003e   A. You could exhaust the kernel's address space. Otherwise, there's currently no hard-coded limit.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e      When you create an IOSurface, it doesn't allocate anything except system memory. You're not really using those pages right off the bat.\u003c/div\u003e\u003cdiv\u003e      Until you actually create a texture object and use it with a particular GPU, it doesn't allocate VRAM, either.\u003c/div\u003e\u003cdiv\u003e      You need to worry about texture lifetimes across processes; the IOSurface can get read back into system memory if the texture is deleted but the IOSurface is stil alive!\u003c/div\u003e\u003cdiv\u003e      Whenever the last texture reference is torn down, you're probably paying the cost of paging the VRAM back to system memory before the IOSurface is deallocated.\u003c/div\u003e\u003cdiv\u003e      There is a way to tell IOSurface to auto-purge if you're willing to track a system-wide use count. Any time the use count goes to 0, purge the VRAM and system memory. Requires more cross-process lifetime management.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Is fragmentation something we should worry about?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Not really. Nothing you can do at the user level about it.\u003c/div\u003e\u003cdiv\u003e      In general, the working set of the GPU will be much larger than the few IOSurfaces you allocate. But: Chrome is allocating up to 8 IOSurfaces per window...\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. In 10.7, there appear to be new APIs that indicate whether the IOSurface is in use.\u003c/div\u003e\u003cdiv\u003e   A. Each process referencing an IOSurface can increment and decrement its use count. When the process's use count goes from 0 to 1, traps into the kernel to reference the IOSurface at the system level.\u003c/div\u003e\u003cdiv\u003e      IOSurfaceIsInUse() is the only call that should be used to determine usage -- according to IOSurfaceIncrementUseCount / IOSurfaceDecrementUseCount. You can't query how many system-level references exist for a given IOSurface.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e      In a system that's quiescent, (i.e., running just the Finder, and in particular not Safari), should be able to make some guarantees that IOSurfaces are all released.\u003c/div\u003e\u003cdiv\u003e      Could potentially use ioreg in conjunction with \"wc -l\" on a system with a known configuration (i.e., a GPU bot) to assert that there are no leaked IOSurfaces.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e      One thing you do have to worry about: IOSurface doesn't let you get past any of the limitations of the GPU. For example, render size limits. Can only render to a surface so big. There is the fragmentation issue. The IOSurface does have to be allocated contiguously.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. We're not using IOSurfaceAlignProperty.\u003c/div\u003e\u003cdiv\u003e   A. Not necessary. Implementation will pick an aligned value for e.g. the row bytes if the value is not specified.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. What kind of user errors can lead to IOSurface leaks? For example, if you release the IOSurface but still have an OpenGL texture linked to the IOSurface, and don't delete the OpenGL texture, the IOSurface still appears to be valid.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Already answered above.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Are IOSurfaces more expensive resources to allocate than OpenGL textures (accessible only to one process)? If so, how much more expensive?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. No. They might not be as performant -- due to how the GPU memory is allocated -- but they're basically as cheap as textures.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. During CGLTexImageIOSurface2D call: you can change how the memory as accessed -- but can you change how much of the IOSurface you use?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Theoretically you could pick a smaller region of the upper-left-hand corner -- but you can't pick an arbitrary sub-rectangle.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Chrome currently renders IOSurfaces to the screen using OpenGL, which is difficult to make seamlessly interoperate with Cocoa. Currently Chrome has to generate a \"mask\" in Cocoa and render the OpenGL as an underlay in order for Cocoa to correctly occlude web page rendering when necessary. In the past, attempted to use a layer-backed view for the root view, but had occlusion problems such as the find bar. Are there better ways, or ways more compatible with CG, to draw IOSurfaces to the screen? Alternative code paths like IOSurface -\u0026gt; CIImage? Also, we switch back and forth between software-rendered NSViews and those into which we render an IOSurface using OpenGL.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Not really. There's also a way to back a CALayer to an IOSurfaceRef nowadays -- but this wouldn't really save a blit. It might save *Chrome* a blit, but CA would be doing it internally.\u003c/div\u003e\u003cdiv\u003e      Could consider rendering to a single-buffered NSOpenGLContext in the browser process!\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Is the sharing of Core Animation layer trees across processes (which Safari does via SPI, apparently) more efficient than using IOSurfaces?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Yes -- it is probably more efficient -- but we can't talk about what Safari might be doing internally.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Texture corruption during paging\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Should re-verify existing Radars (MapsGL) against 10.8.2 seed on current hardware.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Is there something Chrome might be doing obviously wrong in its rendering pipeline which is provoking window server hangs and kernel panics more often than other OpenGL applications?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Watch out for lifetime management of stuff. Leaks are bad. Will provoke paging that otherwise wouldn't have to do.\u003c/div\u003e\u003cdiv\u003e      Check cross-process GL texture lifetime.\u003c/div\u003e\u003cdiv\u003e      Aside from that, nothing obviously architecturally wrong.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eQ. Are window server hangs like http://crbug.com/140175 definitely Apple bugs, or is it expected that applications might be able to provoke this behavior?\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e   A. Window server hangs are Apple bugs. Please file them. The more Radars the better.\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/iosurface-meeting-notes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5684094687165412138"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5684094687165412138"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5684094687165412138"}],"author":[{"name":{"$t":"Kenneth Russell"},"email":{"$t":"kbr@chromium.org"}}],"sites$pageName":{"$t":"iosurface-meeting-notes"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4883777207799046826"},"published":{"$t":"2012-07-02T22:51:56.173Z"},"updated":{"$t":"2012-09-18T22:45:54.224Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-20T17:51:44.506Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"CrOS network: notes on ChromiumOS networking"},"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\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:gadget;maxDepth:6;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/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/cros-network"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4883777207799046826"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4883777207799046826"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4883777207799046826"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"cros-network"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7482647443186502663"},"published":{"$t":"2012-04-15T02:43:45.086Z"},"updated":{"$t":"2012-09-18T14:48:16.465Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-18T14:48:15.303Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Design doc: 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\u003ch2\u003e\u003ca name\u003d\"TOC-Objective\" /\u003eObjective\u003c/h2\u003e\u003cdiv\u003eHave a formal way for developers to ensure their patch won't break the Continuous Integration checks with a relatively high confidence level.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h2\u003e\u003cdiv\u003eBefore the Chromium Commit Queue, it's on each developer's shoulder to manually run multiple try jobs on the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:75f2b5fabe6ced1e\" class\u003d\"disabled\"\u003eTry Server\u003c/a\u003e and check their results before committing.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis is \"brain wasted time\" as this can be completely automated. The Commit Queue aims at automating this manual verification so the developer can start right away working on the next patch. This is necessary to scale at a sustained ~100 commits/day.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h2\u003e\u003cdiv\u003eThe CQ polls rietveld for CLs that are ready to be committed. The Chromium's fork of Rietveld has a 'Commit' checkbox. When the author or the reviewer checks it, it will be included in the next poll. Once the CQ learns about the CL, it verifies the author or one of the reviewers approving this CL is a full committer, then runs the presubmit checks, then runs try jobs and then commit the patch on the behalf of the author, faking its credential. The whole project is written in python.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Infrastructure\" /\u003eInfrastructure\u003c/h2\u003e\u003cdiv\u003eIt runs as a single-thread process. The infrastructure is really minimal since it's just a logic layer above the current infrastructures to automate something that was done manually by the developers. In particular, the CQ reuses:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003ethe \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:75f2b5fabe6ced1e\" class\u003d\"disabled\"\u003etry server\u003c/a\u003e\u003c/li\u003e\u003cli\u003echromium's branch of \u003ca href\u003d\"http://code.google.com/p/rietveld/\"\u003erietveld\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/depottools/presubmit-scripts\"\u003epresubmit scripts\u003c/a\u003e included in \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/depottools\"\u003edepot_tools\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Detailed-Design\" /\u003eDetailed Design\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003eRuns the following loop:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003ePolls \u003ca href\u003d\"http://codereview.chromium.org/search?closed\u003d3\u0026amp;commit\u003d2\"\u003ehttp://codereview.chromium.org/search?closed\u003d3\u0026amp;commit\u003d2\u003c/a\u003e to find new issues to attempt to commit.\u003c/li\u003e\u003cli\u003eFor each issue found,\u003c/li\u003e\u003col\u003e\u003cli\u003eRuns preliminary checks,\u003c/li\u003e\u003col\u003e\u003cli\u003eMake sure someone is a full committer\u003c/li\u003e\u003cli\u003eMake sure there's a LGTM or the CL is TBR'ed.\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eRuns presubmit checks, including OWNERS check.\u003c/li\u003e\u003cli\u003eSends new try jobs with -r HEAD.\u003c/li\u003e\u003col\u003e\u003cli\u003eThey are publicly visible at \u003ca href\u003d\"http://build.chromium.org/p/tryserver.chromium/waterfall?committer\u003dcommit-bot@chromium.org\"\u003ehttp://build.chromium.org/p/tryserver.chromium/waterfall?committer\u003dcommit-bot@chromium.org\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eAstute users will see that it runs a subset of the tests. Please contribute to Flaky tests fight so more tests can be used.\u003c/li\u003e\u003cli\u003eIf ToT is broken, the commit queue will retry your patch on an older revision automatically.\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eMakes sure no new comments were added to the issue.\u003c/li\u003e\u003cli\u003eIf everything passes, once the tree is open;\u003c/li\u003e\u003col\u003e\u003cli\u003eCommits the change on the behalf of the issue owner, even if the owner is not a Chromium commiter.\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eIf one of the steps fails, the 'commit' checkbox is cleared and the issue is removed from the queue.\u003c/li\u003e\u003col\u003e\u003cli\u003eHowever, they author or a reviewer can re-check the box and the CQ will try again.\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003eIssues are processed asynchronously so whatever faster try job completes first wins. This is important as a flaky CL won't bottleneck the remaining one. This is mainly because the number of commit per hour is disproportionate to the try server latency, e.g. the full build and test cycle time for all the platforms.\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Faking-author-in-subversion\" /\u003eFaking author in subversion\u003c/h3\u003e\u003cdiv\u003eTo commit on the behalf of the author, an unconventional technique is used in subversion with a server-side pre-commit hook. The code is at: \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/tools/depot_tools/tests/sample_pre_commit_hook?view\u003dmarkup\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/tools/depot_tools/tests/sample_pre_commit_hook?view\u003dmarkup\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe control flow is:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eOn the client side, with a checkout with a special committer credential;\u003c/li\u003e\u003col\u003e\u003cli\u003esvn commit --with-revprop realauthor\u003d\u0026lt;author to attribute the commit to\u0026gt;\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eOn the server side;\u003c/li\u003e\u003col\u003e\u003cli\u003eA pre_commit_hook intercepts the commits\u003c/li\u003e\u003cli\u003eIt opens \u0026lt;repo\u0026gt;/db/transactions/\u0026lt;tx\u0026gt;.txn/props and parses its data\u003c/li\u003e\u003cli\u003eIf the realauthor svn property if found,\u003c/li\u003e\u003col\u003e\u003cli\u003eIt verifies svn:author is a special committer\u003c/li\u003e\u003cli\u003eIt does simple sanity checks\u003c/li\u003e\u003cli\u003eIt replaces svn:author with realauthor's value\u003c/li\u003e\u003cli\u003eIt sets the commit-bot svn property to know this revision was committed by the CQ.\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eThe updated data is saved in the transaction file.\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003cdiv\u003eThis works much better than using svn propset --revprop since there is no race condition and the revision property modifications are done \u003ci\u003eduring\u003c/i\u003e the commit. This technique can only be used when it is possible to set a server side hook so for example, it can't be used with projects hosted on code.google.com.\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Project-Information\" /\u003eProject Information\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003emaruel@ wrote it and dpranke@ did the code reviews.\u003c/li\u003e\u003cli\u003eCode:\r\n\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/tools/commit-queue/\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/tools/commit-queue/\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Caveats\" /\u003eCaveats\u003c/h2\u003e\u003cdiv\u003eThe main problem is test flakiness. The CQ works around this problem partially by retrying failed tests a second time. It retries compile failure with a full rebuild, versus an incremental build normal, to work around cases of broken incremental compiles, which does happen relatively frequently. Fixing these two problems is outside the scope of the CQ project.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eRietveld doesn't enforce a coherent svn url mapping on its CLs, causing CLs to be ignored by the CQ.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Latency\" /\u003eLatency\u003c/h2\u003e\u003cdiv\u003eThe CQ is very slow at the moment. This is why the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:27880ade23093958\" class\u003d\"disabled\"\u003etest isolation\u003c/a\u003e effort was started. The CQ is bound by:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eRietveld polling, which is at best 10 seconds.\u003c/li\u003e\u003cli\u003eSynchronous presubmit check execution, which is synchronous and single threaded, but with a timeout.\u003c/li\u003e\u003cli\u003eTry job execution, including automatic retries.\u003c/li\u003e\u003cli\u003eWaiting for the tree to open.\u003c/li\u003e\u003cli\u003eThe actual commit, which is fairly fast.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Scalability\" /\u003eScalability\u003c/h2\u003e\u003cdiv\u003eThe main scalability issue is running the presubmit checks and sending the try jobs. Many of the presubmit checks assume they are not running concurrently on the system and running them in parallel on one VM could cause random problems. If the CQ used a more decentralized approach, it would scale much better for that.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Redundancy-and-Reliability\" /\u003eRedundancy and Reliability\u003c/h2\u003e\u003cdiv\u003eThere are multiple single points of failure;\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eThe CQ itself, running on a single process.\u003c/li\u003e\u003cli\u003eThe try server, which is itself not redundant.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Security-Considerations\" /\u003eSecurity Considerations\u003c/h2\u003e\u003cdiv\u003eThe commit queue require a full committer involvement, either to be the author of the CL or to be a reviewer giving approval. The security depends on Rietveld assumptions about its meta data:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eA rietveld issue cannot change of owner.\u003c/li\u003e\u003cli\u003eA rietveld comment cannot be faked by a third party.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eAll communications happens over https.\u003c/div\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Testing-Plan\" /\u003eTesting Plan\u003c/h2\u003e\u003cdiv\u003eComprehensive set of unit tests was written. The code itself sends stack traces in case of exception for monitoring purposes.\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/3585491094165374254"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/testing/commit-queue/design"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7482647443186502663"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7482647443186502663"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7482647443186502663"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$pageName":{"$t":"design"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/513548291218515725"},"published":{"$t":"2012-09-12T18:54:17.666Z"},"updated":{"$t":"2012-09-17T21:53:43.398Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-17T21:53:42.374Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"RenderText and Chrome UI text drawing"},"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\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMost text in Chrome’s UI is rendered either through gfx::Canvas text drawing facilities or by using gfx::RenderText directly. Indeed, gfx::Canvas itself uses gfx::RenderText for drawing and measuring text, so that nearly all UI text drawn in Chrome Windows and ChromeOS ends up going through gfx::RenderText.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003egfx::RenderText has platform-specific subclasses for shaping text runs using platform APIs: Uniscribe on Windows, Pango on Linux + ChromeOS and CoreText on the Mac. Although the shaping/layout code is platform-specific, drawing the text uses a common path, using Skia. The gfx::RenderText subclasses also share common implementations of the various effects that can be applied to the text such as fading and shadows, as well as the more rudimentary settings such as text alignment.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIn addition to text layout, each gfx::RenderText subclass also performs any necessary selection of fallback fonts needed to render particular runs of text. While this is mostly delegated to Pango on Linux and CoreText on the Mac, the Windows implementation has to do this work itself through the font linking information from the registry.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003egfx::RenderText is a stateful API - an instance of a gfx::RenderText subclass will cache its layout information between draw calls. Because of this, it is often more efficient to use the gfx::RenderText API directly instead of using a state-less abstraction such as the gfx::Canvas drawing calls. In particular, for text that changes rarely but that may be drawn multiple times, it is more efficient to keep an instance of gfx::RenderText around, so that the text layout would be performed only when the text is updated and not on every draw operation. Prior to the introduction of gfx::RenderText, this pattern was not possible, so you may see existing code still doing its text drawing through gfx::Canvas text drawing APIs (which in the past were not based on gfx::RenderText).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003egfx::RenderText is also used to render footers and headers in printed page. This works because Skia has a PDF backend so that the glyph drawing calls done by gfx::RenderText are appropriately transformed to PDF output. This is currently the case on Mac OS X and Windows, but not yet Linux or ChromeOS because of sandboxing issues.\u003c/span\u003e\u003c/font\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendertext"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/513548291218515725"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/513548291218515725"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/513548291218515725"}],"author":[{"name":{"$t":"Alexei Svitkine"},"email":{"$t":"asvitkine@chromium.org"}}],"sites$pageName":{"$t":"rendertext"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6422605020048007523"},"published":{"$t":"2012-09-13T05:08:05.988Z"},"updated":{"$t":"2012-09-13T05:08:05.999Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-13T05:08:05.988Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"pepper_design.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6422605020048007523"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3050195328525704777"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/pepper-plugin-implementation/pepper_design.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6422605020048007523"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6422605020048007523"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6422605020048007523"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6422605020048007523"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3929421357194407259"},"published":{"$t":"2012-09-13T05:07:32.066Z"},"updated":{"$t":"2012-09-13T05:07:32.115Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-13T05:07:32.066Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Pepper design.ai"},"summary":{},"content":{"type":"application/illustrator","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3929421357194407259"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3050195328525704777"},{"rel":"alternate","type":"application/illustrator","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/pepper-plugin-implementation/Pepper%20design.ai"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3929421357194407259"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3929421357194407259"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3929421357194407259"},{"rel":"edit-media","type":"application/illustrator","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3929421357194407259"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/814936007237467454"},"published":{"$t":"2011-12-07T04:29:29.053Z"},"updated":{"$t":"2012-09-01T17:44:04.925Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-09-01T17:44:03.295Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Graphics 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\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/graphics-architecture/ChromeGraphicsArchitecture.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1323232182918/developers/design-documents/aura/graphics-architecture/ChromeGraphicsArchitecture.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eEach Aura Window owns a corresponding compositor layer. The layer tree corresponds roughly to the window tree (though Views also supports layers, so a single Aura Window can have nested Layers created by Views within that Window).\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\"\u003eIf the Window's layer has a texture that texture is drawn by the compositor. Aura is transitioning to using the Chromium Compositor (\"CC\"). At time of writing CC is part of WebKit, but there is a nascent effort to extract it into its own library within Chromium.\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\"\u003eThe Compositor maintains two trees of layers, one on the UI thread and one (optionally) on the Compositor thread. This improves performance for animations and interactive events like scrolling. See CC documentation for more information. The CC library talks to the GPU process via command buffer to do the final rendered output.\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ch3 style\u003d\"text-align:-webkit-auto\"\u003e\u003ca name\u003d\"TOC-Pre-Layer-Tree-Unification-World\" /\u003ePre-Layer Tree Unification World\u003c/h3\u003e\u003cdiv\u003eAt the time of writing we have two layer trees, one for the UI and one for content from the renderer process. The renderer process uses WebLayer directly, while the UI wraps it in a class ui::Layer in ui/compositor, which provides some additional utilities useful to Aura and Views.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce CC is extracted into a standalone library we will explore replacing ui::Layer functionality with direct use of CCLayer.\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Paint-Scheduling-Draw-Flow\" /\u003ePaint Scheduling/Draw Flow\u003c/h3\u003e\u003cdiv\u003eThroughout these documents and in the source code you will see references to paint and draw. Paint is an operation performed mostly by the Views system to update the contents of the windows... this is a typically a software operation to update the contents of a Skia canvas. Draw is an operation performed by the compositor to draw the contents of layers' textures to the screen, including potentially compositing some of them against each other.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003eA draw can be triggered by two sources: the underlying native window owned by the RootWindowHost can be sent a redraw notification from the system (e.g. WM_PAINT or Expose), or an application event can trigger a redraw by calling ScheduleDraw() on any number of framework objects (Compositor, RootWindow, etc). In the latter case a task is posted that calls Draw().\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eLayer also supports a method SchedulePaint(), which is exposed through Window and also NativeWidgetAura and used by Views when some sub-region of the layer is to be marked invalid. The layer stores the current invalid rect which is a union of all invalid rects specified since the last validation.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen the compositor draws, it performs a depth-first walk of the layer tree, and if any of the layers it encounters has an invalid rectangle, it is asked to repaint its contents. The compositor does this via WebKit::WebContentLayerClient, implemented by ui::Layer. The layer asks its delegate to repaint via a call of OnPaintLayer() which takes a Skia canvas sized to the invalid rect. In Aura, the delegate is the Window, and the Window asks its delegate to repaint. In production this is often a NativeWidgetAura, a Views type. As mentioned earlier, Views can also have layers directly, and as such a View can also be a layer's delegate.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce the draw is complete the invalid region is validated so no further paint notifications are sent until explicitly requested by a subsequent invalidation.\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/graphics-architecture"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/814936007237467454"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/814936007237467454"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/814936007237467454"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"graphics-architecture"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/359822300284769801"},"published":{"$t":"2012-08-15T22:49:16.014Z"},"updated":{"$t":"2012-08-15T22:49:16.020Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-15T22:49:16.014Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"graph5.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/359822300284769801"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4883956482089151969"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/profile-architecture/graph5.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/359822300284769801"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/359822300284769801"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/359822300284769801"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/359822300284769801"}],"author":[{"name":{"$t":"Elliot Glaysher"},"email":{"$t":"erg@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6277303259657093436"},"published":{"$t":"2012-08-15T20:57:09.553Z"},"updated":{"$t":"2012-08-15T20:57:09.595Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-15T20:57:09.553Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"TabCaptureStates.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6277303259657093436"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8324741405252643576"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/webrtc-tab-content-capture/TabCaptureStates.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6277303259657093436"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6277303259657093436"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6277303259657093436"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6277303259657093436"}],"author":[{"name":{"$t":"Mark Foltz"},"email":{"$t":"mfoltz@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3652718582605302917"},"published":{"$t":"2012-07-20T17:43:24.137Z"},"updated":{"$t":"2012-08-09T21:02:28.201Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-09T21:02:26.938Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"fake-cromo"},"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\u003eImplemented in \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/fake-cromo\"\u003efake-cromo\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eSeems to provide a mock implementation of modem-manager (classic) APIs, focusing on CDMA.\u003c/li\u003e\u003cli\u003eWorks with \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/activation-server\"\u003eactivation-server\u003c/a\u003e, which provides emulation of carrier activation sequence.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eUsage:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStart the web server that emulates the carrier activation portal.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e# /usr/local/lib/flimflam/test/activation-server \u0026amp;\u003c/span\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\u003cfont face\u003d\"arial, sans-serif\"\u003eRename eth0 to the name of the cellular device, as reported to shill\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eby the fake modemmanager. (The fake modemmanager is implemented in\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/flimflam_test.py\u0026amp;l\u003d106\"\u003ethe Modem class in flimflam_test\u003c/a\u003e.)\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\"\u003eThis means that we'll route \"cellular\" data traffic out our Ethernet\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003econnection. Note, however, that fake-cromo let's us implement a\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"captive portal\" like mode. (That's implemented using iptables.)\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\"\u003eNote further that the name of the cellular device must be pseudo-modem0,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eas that's \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/fake-cromo\u0026amp;l\u003d61\"\u003ehard-coded in fake-cromo\u003c/a\u003e (and also used in a \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/flimflam/test/flimflam_test.py\u0026amp;l\u003d128\"\u003edefault argument\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ein the Modem class.)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e# /usr/local/lib/flimflam/test/backchannel setup eth0 pseudo-modem0\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eStart fake-cromo\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e# /usr/local/lib/flimflam/test/fake-cromo \u0026amp;\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\u003cbr /\u003e\u003c/font\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/4883777207799046826"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cros-network/fake-cromo"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3652718582605302917"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3652718582605302917"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3652718582605302917"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"fake-cromo"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8448378057659145778"},"published":{"$t":"2012-08-08T06:56:17.610Z"},"updated":{"$t":"2012-08-08T08:06:07.107Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-08T08:06:05.189Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Window Management"},"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-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;font-weight:bold;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eAugust 3rd, 2012\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003esadrul@google.com\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Verdana,sans-serif;margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003esadrul@, reveman@\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(34,34,34);font-family:arial,sans-serif\"\u003eUsing this API, an extension will be able to (1) manage the positioning of the window (including size, transform etc.), (2) perform window operations (e.g. close, minimize etc.), (3) handle some input events for window management purposes (e.g. install custom keyboard/mouse/gesture bindings etc.), and (4) apply custom window decorations. This is primarily targeted for ChromeOS (to be more specific, the primary target is the Ash desktop environment used in ChromeOS. Ash is expected to be used on Windows too at some point, and the expectation/hope is that this API will work there too). \u003ca href\u003d\"https://docs.google.com/a/chromium.org/document/d/1szxvr95ymXNbJfpHfVmtcglr-F2bAgokxbZR_quVwY8/edit\" target\u003d\"_blank\"\u003eDesign doc\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont color\u003d\"#222222\" face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003eUseful especially for developers\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e: A lot of the developers use a window manager that allows managing the finer details of window management using some scripting language. On ChromeOS, using an app for doing the same would be very useful. (Specifically if/when ash is used on linux platforms: see \u003c/span\u003e\u003ca href\u003d\"https://chromiumcodereview.appspot.com/10789018/\" style\u003d\"background-color:transparent;font-family:Times New Roman;font-size:small;font-weight:bold\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(17,85,204);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ehttps://chromiumcodereview.appspot.com/10789018/\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eEasier to make and test changes\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-size:small;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e: With JS, it would be a lot easier to implement and try out new window-management behaviour.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThere is interest in the ChromeOS test team to use this (since pyauto tests will be updated to use extension API). There is also interesting among developers and UX leads to experiment with this API.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eUnlikely.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;background-color:transparent\"\u003eThe API can potentially include a lot of features. However, the plan is to start small, adding support for a limited set of functionality, and then add to the API. However, it should be fairly easy to keep the API backwards-compatible when new API is added.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003eMultiple extensions can use the API at the same time. The reason for allowing this is because a particular extension might be used for managing window positioning, while at the same time, another extension might be used for managing input-handling. However, if multiple active extensions use this API to manage window positioning, then they can potentially conflict with each other (although in the end, only one will 'win'). There is no plan to mitigate this problem at this point.\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eInitially all toplevel windows (e.g. browser windows, panels, modal windows). This can perhaps be extended to also support notification windows, desktop windows etc.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003eWhen the extension is installed/enabled, the user will be required to grant the extension \"wm\" permission, so the user will have the knowledge that the extension manages windows. But there will be no more visual cues in the UI after that.\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) The API allows closing windows. So an extension could potentially close a window/modal window immediately after it is opened. However, it will not be able to trigger the default action on the modal windows.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) The extension could close/hide all notification windows before they are displayed. (if notification windows are exposed through the API. see above)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3) Add emacs-like key-bindings for window management (e.g. close window, move/resize window, focus window etc.)\u003c/span\u003e\u003cbr /\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eI do not think it is necessary to have a UI for mitigating the evilness. However, it might make sense to add the extension icon to the active window's title-bar.\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe API does not provide access to the user's preferences, or other such data. The only preference-data that can get modified by the API is the browser window-position/size. \u003c/span\u003e\u003c/b\u003e\u003cb style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce the extension is disabled, the effects of the extension should be completely reversible, possibly trivially.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThere unfortunately is no alternative. If a user wants to have different window-management behaviour, then the user needs to change source and recompile chrome.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-style:normal;white-space:normal\"\u003e\u003cdiv dir\u003d\"ltr\" style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003ctable style\u003d\"border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"259\" /\u003e\u003ccol width\u003d\"365\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAPI Function \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e(chrome.experimental.wm.XXX)\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDetails \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e(asynchronous unless explicitly stated otherwise)\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eclose\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eCloses a window.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003etransform\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eApplies transforms (e.g. rotation, scaling, translation) to a window. These transforms can be applied with an animation, and the app can decide how long the animation lasts.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eopacity\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eChanges the opacity of a window. The opacity can be applied with an animation, and the app can decide how long the animation lasts.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003ewindows\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eGets a list of all the windows. (synchronous)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003esetWindowBounds\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eSets the size of a window. (can be animated) This may (or may not?) override the resizability of a window.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003estackWindowAbove(window1, window2)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eChanges the stack-ordering of windows.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003escreenBounds\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eGets the bounds of the screen (synchronous). The details for dealing with multi-monitor configuration TBD (will likely mirror how ash/aura/views deals with this).\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eminimize\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eMinimizes a window.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003emaximize\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eMaximizes a window. This may (or may not?) override the resizability of a window.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003efullscreen\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eMakes the window fullscreen. This may (or may not?) override the resizability of a window.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e[feel free to add more here]\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\" /\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003ctable style\u003d\"border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-width:initial;border-color:initial;border-collapse:collapse\"\u003e\u003ccolgroup\u003e\u003ccol width\u003d\"261\" /\u003e\u003ccol width\u003d\"363\" /\u003e\u003c/colgroup\u003e\u003ctbody\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eEvents\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eDetails \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e(synchronous unless explicitly stated otherwise)\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowCreated(AshWindow)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eTriggered when a new window is created (but before the window is made visible.)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowClosed(AshWindow)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTriggered when a window gets closed. This will be triggered whenever the window is closed (i.e. by the user, by the web-page, or by the WM app from the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eclose\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e API call)\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowShown(AshWindow)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eTriggered when a window becomes visible.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowHidden(AshWindow)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eTriggered when a window is hidden.\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowActivated(AshWindow)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eTriggered when an inactive window becomes active (e.g. user clicked on the window to make it active, or the previously active window was closed, or by other means).\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowInputEvent(AshWindow, Event, EventModifiers)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTriggered when an ‘interesting’ input event happens on the window (e.g. user presses Alt+Ctrl+Key, or does a four-finger swipe gesture, or clicks with Alt down etc.)\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowMoved(AshWindow, OldPosition)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTriggered when a window is moved. This will be triggered whenever the window is moved (i.e. by the user, by the web-page, or by the WM app from the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003esetWindowBounds\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e API call)\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eonWindowResized(AshWindow, OldSize)\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e[similar to above]\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr style\u003d\"height:0px\"\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003e[feel free to add more here]\u003c/font\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"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(0,0,0);border-right-color:rgb(0,0,0);border-bottom-color:rgb(0,0,0);border-left-color:rgb(0,0,0);padding-top:7px;padding-right:7px;padding-bottom:7px;padding-left:7px\" /\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-style:normal;white-space:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eSome more details: a Window object is represented in the app as a dictionary with the following fields:\u003c/span\u003e\u003cbr /\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eid: A unique id for the window for the duration of the session.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003etype: Window type (one of [“modal”, “panel”, “normal”]).\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003estate: Window state (one of [“normal”, “minimized”, “maximized”, “fullscreen”])\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003etitle: The title of the window (this is typically user-visible; could be empty).\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ename: The name of the window (this is typically not visible to user; could be empty).\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ebounds: The location/size of the window.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eactive: Whether the window is currently active or not.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003evisible: Whether the window is currently visible or not.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eAll the callbacks (event callbacks, and callback to \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ewindows\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e function call) receive these details about the window(s).\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/window-management"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8448378057659145778"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/5"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8448378057659145778"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8448378057659145778"}],"author":[{"name":{"$t":"Sadrul Chowdhury"},"email":{"$t":"sadrul@chromium.org"}}],"sites$pageName":{"$t":"window-management"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7492749676793796972"},"published":{"$t":"2012-08-07T11:12:48.066Z"},"updated":{"$t":"2012-08-07T11:14:58.741Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-07T11:14:56.982Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Anti-DDoS HTTP Throttling in Older Versions of 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\"\u003eChrome 12 through Chrome 19 had anti-DDoS HTTP throttling not only for requests originating from extensions, but for normal web page requests as well.  To disable throttling in versions of Chrome up to 20.0.1115.2:  Type \u003cb\u003echrome://net-internals/#httpThrottling\u003c/b\u003e into the address bar and uncheck the checkbox labeled \"Throttle HTTP requests if the server has been overloaded or encountered an error.\"\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/3207933497028372659"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/throttling/anti-ddos-http-throttling-in-older-versions-of-chrome"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7492749676793796972"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7492749676793796972"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7492749676793796972"}],"author":[{"name":{"$t":"Jói Sigurðsson"},"email":{"$t":"joi@chromium.org"}}],"sites$pageName":{"$t":"anti-ddos-http-throttling-in-older-versions-of-chrome"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6195531300169858436"},"published":{"$t":"2012-08-01T05:52:47.699Z"},"updated":{"$t":"2012-08-01T19:12:08.676Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-08-01T19:12:07.358Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Push Messaging"},"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-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eYou’re about to propose a new extension API, what a marvelous road you have ahead of you.  Before you venture forth, though, we’d like to get a sense for your new API and offer you some guidance on your way.  Fill out this proposal and post it und\u003c/span\u003e\u003c/b\u003eer \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development\"\u003eFor Developers\u200e \u0026gt; \u200eDesign Documents\u200e \u0026gt; \u200eExtensions\u200e \u0026gt; \u200eProposed \u0026amp; Proposing New Changes\u200e \u0026gt; \u200eAPI Proposals\u003c/a\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e in the list of proposed APIs, then include a link in your Extension Review request in \u003c/span\u003e\u003ca href\u003d\"http://go/extensionsreview\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(0,0,153);font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ego/extensionsreview\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.  \u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e2012/07/31\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003edimich@\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003c/font\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003edcheng@, dimich@, petewil@\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-weight:bold;margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb apps have the inherent limitation that they're not able to do much when they aren't running. Today, extensions/apps use persistent background pages to do interesting work even if they're not in the foreground; for example, they can use it to poll the server for new emails and download them to a local store when they're received. From a performance/efficiency standpoint, this is less than desirable since it requires a mostly idle background page to just hang around waiting for work. W\u003cspan style\u003d\"white-space:normal\"\u003eith new Chrome packaged apps and extension APIs that allow background pages to be unloaded\u003c/span\u003e on idle, this will no longer be possible. As a result, we believe it'd be useful to offer an API that would allow a remote server to wake up a web app that's not currently running to do useful work. We plan on implementing this API on top of the cache invalidation service that Chrome is already using for Sync.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGmail/Google Docs: instead of polling the server for updates, they could subscribe to push messages for their service. When there's actually an update, then they can use the event to wake up their background page and update their local store.\u003c/span\u003e\u003cbr /\u003eGoogle Talk: a push message would be triggered for the start of a new chat; this would allow Google Talk to spawn a new chat window even when it's currently unloaded.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eGoogle Talk is the most interested client, though it could be useful for Gmail and Google Docs as well.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003eIt would be difficult to standardize this in the web platform because it depends on many other server-side components such as:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAuthentication\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe invalidation mechanism used\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe features supported\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eWe expose only a small subset of the cache invalidation service that Chrome uses internally. \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-family:arial,sans-serif;background-color:transparent\"\u003eThe main limitation today is that we have a list of hardcoded subchannels that we register on behalf of extensions; in the future, it's possible that we'd allow extensions to specify their own subchannel names. We'd likely have to keep the hardcoded subchannels around forever though, to avoid breaking extensions that use those subchannels.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/i\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003eThey cannot conflict with each other, since we do not allow extensions to specify any part of the object IDs registered on their behalf.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eNo UI elements are involved.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eInvalidations may trigger actions that result in UI elements being surfaced. Since we add no new UI elements ourselves, and existing ones should be obviously attributable, the existing UI should be sufficient.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003eSee below.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) The server could trigger a lot of invalidations. Presumably this would eventually cause the app to get throttled on the server though...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) An extension could claim it will manually acknowledge an invalidation and never acknowledge it, allowing it to be woken up regularly.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3) An app writer could always add the pushMessaging to his permissions list, whether or not he used it, causing the extension API to always register object IDs for that extension even though they are not used.\u003c/span\u003e\u003cbr /\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-weight:bold;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eTo prevent extensions from being able to snoop on invalidations for other users/extensions, we do not allow the extensions to actually specify their own object IDs--we generate object IDs for an extension based on the signed-in user + the extension ID + the subchannel.\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eIn addition, to reduce server load, we always acknowledge receipt of an invalidation immediately when we receive it from the cache invalidation server. We re-dispatch invalidations to the extension ourselves and use a backoff policy to prevent a faulty/malicious app from causing its background page to be woken up excessively.\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNo. We unregister all object IDs registered on behalf of an extension when it is uninstalled.\u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cfont\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003eThe user would have to make sure the app was constantly open for any \"background\" functionality to work as expected. In the case of Google Talk, this would require that the roster window always be opened.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003eAPI reference: chrome.pushMessaging\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMethods:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003egetChannelId\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003echrome.pushMessaging.getChannelId(function callback)\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eRetrieves the channel ID associated with an extension. This contains the obfuscated user ID combined with the extension ID; the typical usage is for the extension to send the channel ID to its app server to allow the app server to trigger push messages.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ecallback ( function )\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCalled when channel ID has been retrieved.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCallback function:\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe callback parameter should specify a function that looks like this:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003efunction(string channelID) {...};\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003echannelID ( string )\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eContains the channel ID of the extension.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eEvents:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eonMessage\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003echrome.pushMessaging.onMessage.addListener(function(Message message) { ... });\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFired when a push message is received.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eListener parameters:\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003emessage ( Message )\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe data associated with the message.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTypes:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMessage\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e( object )\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStores data about a push message.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e  subchannel ( number )\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    The subchannel the push message was received for.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e  payload ( string)\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    The payload associated with the push message. Delivery of the payload is not guaranteed; failure to deliver the payload will result in value being set to an empty string.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e  willAcknowledge ( function )\u003c/font\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e    An extension can call this to indicate that it will manually acknowledge the receipt of the message. This is useful if the extension wants to do something asynchronous in response to a push message and wants it to be re-delivered if it isn't successfully handled for some reason.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003ci\u003e  acknowledge ( function )\u003cbr /\u003e\u003c/i\u003e    Allows an extension which called willAcknowledge() to acknowledge receipt of the push message.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003ewillAcknowledge() and acknowledge() may not be possible to implement.\u003c/font\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/push-messaging"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6195531300169858436"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/5"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6195531300169858436"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6195531300169858436"}],"author":[{"name":{"$t":"Daniel Cheng"},"email":{"$t":"dcheng@chromium.org"}}],"sites$pageName":{"$t":"push-messaging"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/513529329205364854"},"published":{"$t":"2012-07-20T16:40:16.993Z"},"updated":{"$t":"2012-07-26T23:20:41.986Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-26T23:20:41.111Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cellular Activation (and Chrome/CrOS network management 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\u003eActivateCellular (network_menu.cc)\u003c/div\u003e\u003cdiv\u003e-\u0026gt; ash::Shell::GetInstance()-\u0026gt;delegate()-\u0026gt;OpenMobileSetup(cellular-\u0026gt;service_path())\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; MobileSetupDialog::Show(service_path)                  [if kEnableMobileSetupDialog]\u003c/div\u003e\u003cdiv\u003e      -\u0026gt; MobileSetupDialogDelegate::GetInstance()-\u0026gt;ShowDialog(service_path)\u003c/div\u003e\u003cdiv\u003e         -\u0026gt; MobileSetupDialogDelegate::GetDialogContentURL   [presumably]\u003c/div\u003e\u003cdiv\u003e            // returns chrome::kChromeUIMobileSetupURL + service_path_\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; browser-\u0026gt;OpenURL(chrome::kChromeUIMobileSetupURL)      [otherwise; resolves to chrome://mobilesetup]\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMobileActivator::SetTransactionStatus (mobile_activator.cc)\u003c/div\u003e\u003cdiv\u003e-\u0026gt; StartOTASP\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; EvaluateCellularNetwork\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMobileActivator::OnNetworkManagerChanged (mobile_activator.cc)\u003c/div\u003e\u003cdiv\u003e-\u0026gt; EvaluateCellularNetwork\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMobileActivator::OnNetworkChanged (mobile_activator.cc)\u003c/div\u003e\u003cdiv\u003e-\u0026gt; EvaluateCellularNetwork\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMobileActivator::StartActivation\u003c/div\u003e\u003cdiv\u003e-\u0026gt; EvaluateCelluarNetwork\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWho calls OnNetworkManagerChanged?\u003c/div\u003e\u003cdiv\u003e- NetworkLibraryImplBase::NotifyNetworkManagerChanged\u003c/div\u003e\u003cdiv\u003e  -\u0026gt; NetworkLibraryImplBase::SignalNetworkManagerObservers\u003c/div\u003e\u003cdiv\u003e- NetworkMessageObserver::NetworkMessageObserver\u003c/div\u003e\u003cdiv\u003e- AshSystemTrayDelegate\u003c/div\u003e\u003cdiv\u003e- NetworkMenuButton\u003c/div\u003e\u003cdiv\u003e- NetworkScreen\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMobileActivator::ChangeState (mobile_activator.cc)\u003c/div\u003e\u003cdiv\u003e-\u0026gt; FOR_EACH_OBSERVER(Observer, observers_, OnActivationStateChanged(network, state_, error_description));\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; MobileSetupHandler::OnActivationStateChanged (mobile_seutp_ui.cc) [presumably]\u003c/div\u003e\u003cdiv\u003e      -\u0026gt; web_ui()-\u0026gt;CallJavascriptFunction(kJsDeviceStatusChangedCallback, device_dict)\u003c/div\u003e\u003cdiv\u003e         -\u0026gt; mobile.MobileSetup.deviceStateChanged (mobile_setup.js)\u003c/div\u003e\u003cdiv\u003e            -\u0026gt; updateDeviceStatus_\u003c/div\u003e\u003cdiv\u003e               -\u0026gt; changeState_\u003c/div\u003e\u003cdiv\u003e                  -\u0026gt; stopSpinner_ [if PLAN_ACTIVATION_DONE]\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e---\u003c/div\u003e\u003cdiv\u003eMobileSetupDialogDelegate::OnActivationStateChanged (mobile_setup_dialog.cc)\u003c/div\u003e\u003cdiv\u003e// does nothing\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003echromeos.connectionManager.setTransactionStatus (connection_manager.js)\u003c/div\u003e\u003cdiv\u003e-\u0026gt; reportTransactionStatus_\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; postMessage(msg, 'chrome://mobilesetup')\u003c/div\u003e\u003cdiv\u003e      // seems to be billing related. see onMessageReceived_ in mobile_setup.js\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLoginObserver\u003c/div\u003e\u003cdiv\u003e// The network login observer reshows a login dialog if there was an error.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkMessageObserver\u003c/div\u003e\u003cdiv\u003e// The network message observer displays a system notification for network\u003c/div\u003e\u003cdiv\u003e// messages.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLibrary interface declarations\u003c/div\u003e\u003cdiv\u003e- NetworkManagerObserver::OnNetworkManagerChanged\u003c/div\u003e\u003cdiv\u003e- NetworkObserver::OnNetworkChanged\u003c/div\u003e\u003cdiv\u003e- NetworkDeviceObserver::OnNetworkDeviceChanged\u003c/div\u003e\u003cdiv\u003e- NetworkDeviceObserver::OnNetworkDeviceFoundNetworks\u003c/div\u003e\u003cdiv\u003e- NetworkDeviceObserver::OnNetworkDeviceSimLockChanged\u003c/div\u003e\u003cdiv\u003e- CellularDataPlanObserver::OnCellularDataPlanChanged\u003c/div\u003e\u003cdiv\u003e- PinOperationObserver::OnPinOperationCompleted\u003c/div\u003e\u003cdiv\u003e- UserActionObserver::OnConnectionInitiated\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLibraryImplCros::NetworkManagerStatusChangedHandler\u003c/div\u003e\u003cdiv\u003eNetworkLibraryImplCros::NetworkManagerUpdate\u003c/div\u003e\u003cdiv\u003e-\u0026gt; NetworkManagerStatusChanged\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; NotifyNetworkManagerChanged [ONLY for PROPERTY_INDEX_OFFLINE_MODE]\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCrosMonitorNetworkManagerProperties\u003c/div\u003e\u003cdiv\u003e-\u0026gt; new NetworkManagerPropertiesWatcher\u003c/div\u003e\u003cdiv\u003e   -\u0026gt; DBusThreadManager::Get()-\u0026gt;GetFlimflamManagerClient()-\u0026gt;SetPropertyChangedHandler\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLibraryImplCros::UpdateNetworkStatus\u003c/div\u003e\u003cdiv\u003e-\u0026gt; NotifyNetworkManagerChanged\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLibraryImplCros::UpdateTechnologies\u003c/div\u003e\u003cdiv\u003e-\u0026gt; NotifyNetworkManagerChanged\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLibraryImplCros::ParseNetwork\u003c/div\u003e\u003cdiv\u003e-\u0026gt; NotifyNetworkManagerChanged\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNetworkLibraryImplCros::ParseNetworkDevice\u003c/div\u003e\u003cdiv\u003e-\u0026gt; NotifyNetworkManagerChanged\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAshSystemTrayDelegate: updates status icons\u003c/div\u003e\u003cdiv\u003e---\u003c/div\u003e\u003cdiv\u003eNetwork::SetState (network_library.cc)\u003c/div\u003e\u003cdiv\u003e// processes state change events from connection manager\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/4883777207799046826"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cros-network/cellular-activation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/513529329205364854"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/513529329205364854"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/513529329205364854"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"cellular-activation"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7488001112089396653"},"published":{"$t":"2012-07-20T16:43:16.846Z"},"updated":{"$t":"2012-07-20T17:47:02.183Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-20T16:54:22.415Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"fakemodem (for testing celluar modems with AT command interfaces)"},"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\u003eGives pre-programmed answers to AT commands. (Regexp patterns match the command, and probably can be used in generating the response.)\u003c/li\u003e\u003cli\u003eImplemented in \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/autotest/files/client/deps/fakemodem/src/fakemodem.c\"\u003efakemodem.c\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eUsed by \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/autotest/files/client/site_tests/network_ModemManagerSMS/network_ModemManagerSMS.py\"\u003emodemmanager SMS autotest\u003c/a\u003e.\u003c/li\u003e\u003cli\u003eExample regexp tables: \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/autotest/files/client/site_tests/network_ModemManagerSMSSignal/src/fake-icera\"\u003eIcera SMS signal test patterns\u003c/a\u003e, \u003ca href\u003d\"http://code.google.com/searchframe#wZuuyuB8jKQ/src/third_party/autotest/files/client/site_tests/network_ModemManagerSMSSignal/src/fake-gsm\"\u003egeneric GSM SMS Signal test patterns\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/4883777207799046826"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/cros-network/fakemodem"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7488001112089396653"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7488001112089396653"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7488001112089396653"}],"author":[{"name":{"$t":"mukesh agrawal"},"email":{"$t":"quiche@chromium.org"}}],"sites$pageName":{"$t":"fakemodem"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2365666824434195596"},"published":{"$t":"2012-07-18T04:01:40.925Z"},"updated":{"$t":"2012-07-18T04:01:40.941Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-18T04:01:40.925Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Renderingintherenderer-v2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2365666824434195596"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8992477738053034276"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/displaying-a-web-page-in-chrome/Renderingintherenderer-v2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2365666824434195596"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2365666824434195596"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2365666824434195596"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2365666824434195596"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6500374676693384349"},"published":{"$t":"2012-07-18T04:01:07.050Z"},"updated":{"$t":"2012-07-18T04:01:07.092Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-18T04:01:07.050Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Renderingintherenderer v2.ai"},"summary":{},"content":{"type":"application/illustrator","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6500374676693384349"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8992477738053034276"},{"rel":"alternate","type":"application/illustrator","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/displaying-a-web-page-in-chrome/Renderingintherenderer%20v2.ai"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6500374676693384349"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6500374676693384349"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6500374676693384349"},{"rel":"edit-media","type":"application/illustrator","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6500374676693384349"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3672464383189396948"},"published":{"$t":"2010-12-10T01:44:05.718Z"},"updated":{"$t":"2012-07-17T21:35:34.578Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-17T21:35:33.561Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Extracting a Recovery Kernel from a Recovery Image"},"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-If-you-need-to-generate-a-recovery-image-use-mod_image_for_recovery.sh---image-image_file-.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003eIf you need to generate a recovery image, use \"mod_image_for_recovery.sh --image \u0026lt;image_file\u0026gt;\".\u003c/font\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cbr /\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Outdated-instructions-needed-for-a-few-special-case-CR-48-Users-\" /\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u0026lt;Outdated instructions needed for a few special case CR-48 Users\u0026gt;\u003c/font\u003e\u003c/h2\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Intro\" /\u003eIntro\u003c/h2\u003eIf you find yourself in the need of an officially signed Recovery Kernel, but you only have an officially signed Recovery Image: you're in luck!  You've come to the right place.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhat are Recovery Images and Recovery Kernels?\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eA \u003cb\u003eRecovery Image\u003c/b\u003e is an image that can be placed onto a USB disk that can boot a particular Chrome OS Notebook and reinstall the default software onto the computer, putting it into a known good state.  Instructions for getting a Recovery Image are usually provided by the manufacturer of a Chrome OS Notebook.\u003c/li\u003e\u003cli\u003eA \u003cb\u003eRecovery Kernel\u003c/b\u003e is a small part of the the Recovery Image that can be extracted, then used for installing a custom build of the OS.  Sometimes a manufacturer will provide a separate download of the Recovery Kernel as a convenience.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eWhat does it mean for a Recovery Kernel to be officially signed?  It means that it was built by someone (like your device manufacturer) with access to your device's secret recovery key.  That means that your device will allow booting from this Recovery Kernel.  \u003cb\u003eNOTE\u003c/b\u003e: every hardware product has a different secret recovery key, so you need to obtain an official Recovery Kernel that is specific to your product.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e...you might have read about the Recovery Kernel in such places as the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/poking-around-your-chrome-os-device\"\u003ePoking around your Chrome OS Notebook\u003c/a\u003e page or the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide\"\u003eChromium OS Developer Guide\u003c/a\u003e.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Get-an-officially-signed-Recovery-Image\" /\u003eGet an officially-signed Recovery Image\u003c/h2\u003e\u003cdiv\u003eThese steps are going to be different for every piece of hardware.  However, just to be illustrative, here are the steps for the Cr-48 Chrome Notebook:\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\u003emkdir -p ~/trunk/recovery\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003ecurl -L 'https://dl.google.com/dl/chromeos/recovery/latest_mario_beta_channel' \u0026gt; ~/trunk/recovery/recovery_image.zip\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eTMPDIR\u003d`mktemp -d`\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eunzip ~/trunk/recovery/recovery_image.zip -d ${TMPDIR}\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eRECOVERY_IMAGE\u003d`ls ${TMPDIR}/*.bin`\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFuture steps will assume that you've put the recovery image into the \u003ccode\u003eRECOVERY_IMAGE\u003c/code\u003e variable (as the above instructions do).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Extract-the-Recovery-Kernel\" /\u003eExtract the Recovery Kernel\u003c/h2\u003e\u003cdiv\u003eThe easiest way to do this is if you've already followed the instructions in the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-guide\"\u003eChromium OS Developer Guide\u003c/a\u003e and are running from within the \u003cfont color\u003d\"#9900FF\"\u003echroot\u003c/font\u003e.  In that case, you'll have already the \u003ccode\u003e\u003cfont color\u003d\"#9900FF\"\u003ecgpt\u003c/font\u003e\u003c/code\u003e tool.  That means you can follow the generic instructions.  In that case, the instructions are:\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\u003e\u003cfont color\u003d\"#9900FF\"\u003eKERNA_START\u003d`cgpt show -b ${RECOVERY_IMAGE} | grep KERN-A | awk '{print $1}'`\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900FF\"\u003eKERNA_SIZE\u003d`cgpt show -b ${RECOVERY_IMAGE} | grep KERN-A | awk '{print $2}'`\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900FF\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cfont color\u003d\"#9900FF\"\u003emkdir -p \u003c/font\u003e\u003c/code\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(153,0,255)\"\u003e~/trunk/recovery/\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900FF\"\u003eRECOVERY_KERNEL\u003d~/trunk/recovery/recovery_kernel.bin\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#9900FF\" face\u003d\"monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900FF\"\u003edd of\u003d${RECOVERY_KERNEL} if\u003d${RECOVERY_IMAGE} \\\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cfont color\u003d\"#9900FF\"\u003e   bs\u003d512 count\u003d${KERNA_SIZE} skip\u003d${KERNA_START}\u003c/font\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003eIf you aren't running from the chroot, most of the commands above are still valid.  You'll just have to figure out your own \u003ccode\u003eKERNA_START\u003c/code\u003e and \u003ccode\u003eKERNA_SIZE\u003c/code\u003e.  At the moment, this document doesn't have the instructions for that (sorry!).  However with current images, you could actually just do:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ccode\u003eKERNA_START\u003d4096\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003eKERNA_SIZE\u003d32768\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cbr /\u003e\u003cdiv\u003e...and be done with it.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\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\u003cdiv\u003e\u003cbr /\u003e\u003c/div\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/593897542665142458"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/extracting-a-recovery-kernel-from-a-recovery-image"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3672464383189396948"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3672464383189396948"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3672464383189396948"}],"author":[{"name":{"$t":"Douglas Anderson"},"email":{"$t":"dianders@chromium.org"}}],"sites$pageName":{"$t":"extracting-a-recovery-kernel-from-a-recovery-image"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7290308375252734814"},"published":{"$t":"2012-07-11T14:51:38.388Z"},"updated":{"$t":"2012-07-11T14:51:38.396Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-11T14:51:38.388Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"stumpy.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7290308375252734814"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/stumpy.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7290308375252734814"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7290308375252734814"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7290308375252734814"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7290308375252734814"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3235211430598715839"},"published":{"$t":"2012-07-11T14:50:56.923Z"},"updated":{"$t":"2012-07-11T14:50:56.931Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-11T14:50:56.923Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lumpy.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3235211430598715839"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/lumpy.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3235211430598715839"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3235211430598715839"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3235211430598715839"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3235211430598715839"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"USl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8343084440854781587"},"published":{"$t":"2009-06-19T16:18:03.389Z"},"updated":{"$t":"2012-07-11T14:45:05.933Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-07-11T14:45:04.782Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Conventions and patterns for multi-platform 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\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eChromium is a large and complex cross-platform product. We try to share as much code as possible between platforms, while implementing the UI and OS integration in the most appropriate way for each. While this gives a better user experience, it adds extra complexity to the code. This document describes the recommended practices for keeping such cross-platform code clean.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWe use a variety of different file naming suffixes to indicate when a file should be used:\u003c/div\u003e\r\n\u003cp style\u003d\"margin:0px\"\u003e \u003c/p\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eMac files use the \u003cfont face\u003d\"'courier new', monospace\"\u003e_mac \u003c/font\u003esuffix for lower-level files and Cocoa (Mac UI) files use the \u003cfont face\u003d\"'courier new', monospace\"\u003e_cocoa\u003c/font\u003e suffix.\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eiOS files use the \u003cfont face\u003d\"courier new, monospace\"\u003e_ios\u003c/font\u003e suffix (although iOS also uses some specific \u003cfont face\u003d\"courier new, monospace\"\u003e_mac\u003c/font\u003e files).\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eLinux files use \u003cfont face\u003d\"'courier new', monospace\"\u003e_linux\u003c/font\u003e suffix for lower-level files, \u003cfont face\u003d\"'courier new', monospace\"\u003e_gtk\u003c/font\u003e for GTK-specific files, and \u003cfont face\u003d\"'courier new', monospace\"\u003e_x\u003c/font\u003e for X Windows (with no GTK) specific files.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWindows files use the \u003cfont face\u003d\"'courier new', monospace\"\u003e_win\u003c/font\u003e suffix.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003ePosix files shared between Mac, iOS, and Linux use the \u003cfont face\u003d\"'courier new', monospace\"\u003e_posix\u003c/font\u003e suffix.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eFiles for Chrome's \"Views\" UI (on Windows and experimental GTK) layout system use the \u003cfont face\u003d\"'courier new', monospace\"\u003e_views\u003c/font\u003e suffix.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe separate front-ends of the browser are contained in their own directories:\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\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\"\u003eMac Cocoa: chrome/browser/ui/cocoa\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eLinux GTK: chrome/browser/ui/gtk\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWindows Views (and the experimental GTK-views): chrome/browser/ui/views\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/coding-style\"\u003eCoding Style\u003c/a\u003e page lists some stylistic rules affecting platform-specific defines.\u003c/div\u003e\u003c/div\u003e\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-How-to-separate-platform-specific-code\" /\u003eHow to separate platform-specific code\u003c/h3\u003e\r\n\u003ch4 style\u003d\"font-size:10pt\"\u003e\u003ca name\u003d\"TOC-Small-platform-differences:-ifdefs\" /\u003eSmall platform differences: #ifdefs\u003c/h4\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWhen you have a class with many shared functions or data members, but a few differences, use \u003cfont face\u003d\"'courier new', monospace\"\u003e#ifdefs\u003c/font\u003e around the platform-specific parts. If there are no significant differences, it's easier for everybody to keep everything in one place.\u003c/div\u003e\r\n\u003ch4 style\u003d\"font-size:10pt\"\u003e\u003ca name\u003d\"TOC-Small-platform-differences-in-the-header-larger-ones-in-the-implementation:-split-the-implementation\" /\u003eSmall platform differences in the header, larger ones in the implementation: split the implementation\u003c/h4\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThere may be cases where there are few header file differences, but significant implementation differences for parts of the implementation. For example, \u003cfont face\u003d\"'courier new', monospace\"\u003ebase/waitable_event.h\u003c/font\u003e defines a common API with a couple of platform differences.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWith significant implementation differences, the implementation files can be split. The prevents you from having to do a lot of \u003cfont face\u003d\"'courier new', monospace\"\u003e#ifdefs\u003c/font\u003e for the includes necessary for each platform and also makes it easier to follow (three versions each of a set of functions in a file can get confusing). There can be different \u003cfont face\u003d\"'courier new', monospace\"\u003e.cc\u003c/font\u003e files for each platform, as in \u003cfont face\u003d\"'courier new', monospace\"\u003ebase/waitable_event_posix.cc\u003c/font\u003e that implements posix-specific functions. If there were cross-platform functions in this class, they would be put in a file called \u003cfont face\u003d\"'courier new', monospace\"\u003ebase/waitable_event.cc\u003c/font\u003e.\u003c/div\u003e\r\n\u003ch4 style\u003d\"font-size:10pt\"\u003e\u003ca name\u003d\"TOC-Complete-platform-implementations-and-callers:-separate-implementations\" /\u003eComplete platform implementations and callers: separate implementations\u003c/h4\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eWhen virtually none of the implementation is shared, implement the class separately for each platform in separate files.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIf all implementations are in a cross-platform directory such as base, they should be named with the platform name, such as \u003cfont face\u003d\"'courier new', monospace\"\u003eFooBarWin\u003c/font\u003e in \u003cfont face\u003d\"'courier new', monospace\"\u003ebase/foo_bar_win.h.\u003c/font\u003e This case will generally be rare since files in these cross-platform files are normally designed to be used by cross-platform code, and separate header files makes this impossible. In some places we've defined a commonly named class in different files, so \u003cfont face\u003d\"'courier new', monospace\"\u003ePlatformDevice\u003c/font\u003e is defined in \u003cfont face\u003d\"'courier new', monospace\"\u003eskia/ext/platform_device_win.h\u003c/font\u003e, \u003cfont face\u003d\"'courier new', monospace\"\u003eskia/ext/platform_device_linux.h\u003c/font\u003e, and \u003cfont face\u003d\"'courier new', monospace\"\u003eskia/ext/platform_device_mac.h\u003c/font\u003e. This is OK if you really need to refer to this class in cross-platform code. But generally, cases like this will fall into the following rule.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIf the implementations live in platform-specific directories such as \u003cfont face\u003d\"'courier new', monospace\"\u003echrome/browser/ui/cocoa\u003c/font\u003e or \u003cfont face\u003d\"'courier new', monospace\"\u003echrome/browser/ui/views\u003c/font\u003e, there is no chance that the class will be used by cross-platform code. In this case, the classes and filenames should omit the platform name since it would be redundant. So you would have FooBar implemented in \u003cfont face\u003d\"'courier new', monospace\"\u003echrome/browser/ui/cocoa/foo_bar.h\u003c/font\u003e.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eDon't create different classes with different names for each platform and typedef it to a shared name. We used to have this for \u003cfont face\u003d\"'courier new', monospace\"\u003ePlatformCanvas\u003c/font\u003e, where it was a typedef of \u003cfont face\u003d\"'courier new', monospace\"\u003ePlatformCanvasMac\u003c/font\u003e, \u003cfont face\u003d\"'courier new', monospace\"\u003ePlatformCanvasLinux\u003c/font\u003e, or \u003cfont face\u003d\"'courier new', monospace\"\u003ePlatformCanvasWin \u003c/font\u003edepending on the platform. This makes it impossible to forward-declare the class, which is an important tool for reducing dependencies.\u003c/div\u003e\r\n\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-When-to-use-virtual-interfaces\" /\u003eWhen to use virtual interfaces\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIn general, virtual interfaces and factories should not be used for the sole purpose of separating platform differences. Instead, it should be be used to separate interfaces from implementations to make the code better designed. This comes up mostly when implementing the view as separate from the model, as in \u003cfont face\u003d\"'courier new', monospace\"\u003eTabContentsView\u003c/font\u003e or \u003cfont face\u003d\"'courier new', monospace\"\u003eRenderWidgetHostView\u003c/font\u003e. In these cases, it's desirable for the model not to depend on implementation details of the view. In many cases, there will only be one implementation of the view for each platform, but gives cleaner separation and more flexibility in the future.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIn some places like \u003cfont face\u003d\"'courier new', monospace\"\u003eTabContentsView\u003c/font\u003e, the virtual interface has non-virtual functions that do things shared between platforms. Avoid this. If the code is always the same regardless of the view, it probably shouldn't be in the view in the first place.\u003c/div\u003e\r\n\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-Implementing-platform-specific-UI\" /\u003eImplementing platform-specific UI\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIn general, construct platform specific user interface elements from other platform-specific user interface elements. For instance, the views-specific class \u003cfont face\u003d\"'courier new', monospace\"\u003eBrowserView\u003c/font\u003e is responsible for constructing many of the browser dialog boxes. The alternative is to wrap the UI element in a platform-independent interface and construct it from a model via a factory. This is significantly less desirable as it confuses ownership: in most cases of construction by factory, the UI element returned ends up being owned by the model that created it. However in many cases the UI element is most easily managed by the UI framework to which it belongs. For example, a \u003cfont face\u003d\"'courier new', monospace\"\u003eviews::View\u003c/font\u003e is owned by its view hierarchy and is automatically deleted when its containing window is destroyed. If you have a dialog box \u003cfont face\u003d\"'courier new', monospace\"\u003eviews::View\u003c/font\u003e that implements a platform independent interface that is then owned by another object, the views::View instance now needs to explicitly tell its view hierarchy not to try and manage its lifetime.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003ee.g. prefer this:\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// browser.cc:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eBrowser::ExecuteCommand(..) {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  case IDC_COMMAND_EDIT_FOO:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    window()-\u0026gt;ShowFooDialog();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    break;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e}\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// browser_window.h:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eclass BrowserWindow {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  virtual void ShowFooDialog() \u003d 0;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e};\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// browser_view.cc:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eBrowserView::ShowFooDialog() {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  views::Widget::CreateWindow(new FooDialogView)-\u0026gt;Show();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e}\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// foo_dialog_view.cc:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// FooDialogView and FooDialogController are automatically cleaned up when the window is closed.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eclass FooDialogView : public views::View {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e private:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  scoped_ptr\u0026lt;FooDialogController\u0026gt; controller_; // Cross-platform state/control logic\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e}\u003c/span\u003e\u003c/blockquote\u003e\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eto this:\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// browser.cc:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eBrowser::ExecuteCommand(..) {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  case IDC_COMMAND_EDIT_FOO: {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    FooDialogController::instance()-\u0026gt;ShowUI();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    break;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e}\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// foo_dialog_controller.h:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eclass FooDialog {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e public:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  static FooDialog* CreateFooDialog(FooDialogController* controller);\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  virtual void Show() \u003d 0;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  virtual void Bar() \u003d 0;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e};\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eclass FooDialogController {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e public:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  static FooDialogController* instance() {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    static FooDialogController* instance \u003d NULL;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    if (!instance)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e      instance \u003d Singleton\u0026lt;FooDialogController\u0026gt;::get();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    return instance;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e private:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  void ShowUI() {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    if (!dialog_.get())\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e      dialog_.reset(FooDialog::CreateFooDialog(this));\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    dialog_-\u0026gt;Show();\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  }\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  // Why bother keeping FooDialog or even FooDialogController around?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  // Most dialogs are very seldom used.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  scoped_ptr\u0026lt;FooDialog\u0026gt; dialog_;\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e};\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e// foo_dialog_win.cc:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eclass FooDialogView : public views::View,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e                      public FooDialogController {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e public:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  explicit FooDialogView(FooDialogController* controller) {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e    set_parent_owned(false); // Now necessary due to scoped_ptr in FooDialogController.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  }\u003c/span\u003e\u003cbr /\u003e  ...\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e};\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003eFooDialog* FooDialog::CreateFooDialog(FooDialogController* controller) {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e  return new FooDialogView(controller);\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Courier New,Verdana,sans-serif\"\u003e}\u003c/span\u003e\u003c/blockquote\u003e\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u003cbr /\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eSometimes this latter pattern is necessary, but these occasions are rare, and very well understood by the frontend team. When porting, consider converting cases of the latter model to the former model if the UI element is something simple like a dialog box.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/conventions-and-patterns-for-multi-platform-development"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8343084440854781587"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8343084440854781587"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8343084440854781587"}],"author":[{"name":{"$t":"Brett Wilson"},"email":{"$t":"brettw@chromium.org"}}],"sites$pageName":{"$t":"conventions-and-patterns-for-multi-platform-development"},"sites$revision":{"$t":"18"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"},"published":{"$t":"2012-06-19T04:40:20.521Z"},"updated":{"$t":"2012-06-26T06:53:35.219Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-26T06:53:33.949Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Ash Color Chooser"},"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 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThis document describes how to achieve \u0026lt;input type\u003d”color”\u0026gt; UI in ChromeOS/Ash.\u003c/span\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Motivation\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMotivation\u003c/span\u003e\u003c/h1\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u0026lt;input type\u003d”color”\u0026gt; is a new input type introduced in HTML5.  It enables users to pick a color and returns a value of #hhhhhh format.  WebKit forms team has decided to use platform’s default color picker rather than implementing a new one.  It means that we need to implement our own color picker view for ChromeOS/Ash.\u003c/span\u003e\u003cbr /\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-First-Goal\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFirst Goal \u003c/span\u003e\u003c/h1\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eImplement simple color picker dialog w\u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1YIKO-5_m0ZpkvtE24QKKty1ZZk7aYVk-Bw9Xq8zpMEg/edit?hl\u003den_US\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eorking with \u0026lt;input type\u003d”color\u0026gt;\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eImplement with views, not HTML.\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eFeatures\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eBehave as Modal Dialog (see \u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1YIKO-5_m0ZpkvtE24QKKty1ZZk7aYVk-Bw9Xq8zpMEg/edit?hl\u003den_US\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003edoc\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;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\"\u003eAppears in the topmost z-order\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003ePick up a color from HSV model\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;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\"\u003eHas both a Hue bar and a Saturation-Value plane (see below mock).\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003ePick up a color from text\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:square;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\"\u003eA\u003c/span\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/d/1YIKO-5_m0ZpkvtE24QKKty1ZZk7aYVk-Bw9Xq8zpMEg/edit?hl\u003den_US\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ellow copy/paste\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:square;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\"\u003eSpecify the color by …\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003ergb(xx ,yy, zz)\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003e#RRGGBB\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003eCSS well-known color name\u003c/span\u003e\u003c/li\u003e\u003cli 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\"\u003e… anything else?\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eWork on Chrome OS\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003efirst mock \u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser/col.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1340081309103/developers/design-documents/aura/ash-color-chooser/col.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eConfirmed that the upper box isn’t necessary, since the color will be shown in the page.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli 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\"\u003eCurrent screenshot: \u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser/Screenshot%202012-06-26%203%3A50%3A42%20PM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"320\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1340693597039/developers/design-documents/aura/ash-color-chooser/Screenshot%202012-06-26%203%3A50%3A42%20PM.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\" /\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Next-plans-not-confirmed-yet-\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNext plans (not confirmed yet)\u003c/span\u003e\u003c/h1\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eGlobal Color Picker: Picking a color from any point on the desktop.\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eEven from other tab, window or desktop.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli 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\"\u003e“Favorite Color” feature\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003ePick up the color easily from each user’s favorite color.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli 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\"\u003eWorks on Windows and Chrome OS\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eCurrently, Windows has native OS Color PIcker Dialog. This new Color Picker will replace it.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Not-Goal\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNot Goal\u003c/span\u003e\u003c/h1\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli 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\"\u003eAlpha value (transparency) support\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003eHTML5 spec has not supported alpha value.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch1 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-References\" /\u003e\u003cspan style\u003d\"font-size:24px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eReferences\u003c/span\u003e\u003c/h1\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eInput type\u003dcolor spec: \u003c/span\u003e\u003ca href\u003d\"http://www.w3.org/TR/html-markup/input.color.html\" 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\"\u003ehttp://www.w3.org/TR/html-markup/input.color.html\u003c/span\u003e\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2115352916434809417"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"}],"author":[{"name":{"$t":"Jun Mukai"},"email":{"$t":"mukai@chromium.org"}}],"sites$pageName":{"$t":"ash-color-chooser"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1534986714518986604"},"published":{"$t":"2012-06-26T06:53:17.031Z"},"updated":{"$t":"2012-06-26T06:53:17.039Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-26T06:53:17.031Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot 2012-06-26 3:50:42 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1534986714518986604"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser/Screenshot%202012-06-26%203:50:42%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1534986714518986604"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1534986714518986604"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1534986714518986604"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1534986714518986604"}],"author":[{"name":{"$t":"Jun Mukai"},"email":{"$t":"mukai@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/979351317743447448"},"published":{"$t":"2012-06-25T20:54:23.546Z"},"updated":{"$t":"2012-06-25T20:54:23.552Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-25T20:54:23.546Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"stumpy-dev-switch.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/979351317743447448"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/stumpy-dev-switch.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/979351317743447448"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/979351317743447448"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/979351317743447448"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/979351317743447448"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2394853107529241862"},"published":{"$t":"2012-06-25T20:12:41.685Z"},"updated":{"$t":"2012-06-25T20:12:41.694Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-25T20:12:41.685Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"lumpy-dev-switch.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2394853107529241862"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6032530868906671964"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-sandy-bridge/lumpy-dev-switch.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2394853107529241862"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2394853107529241862"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2394853107529241862"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2394853107529241862"}],"author":[{"name":{"$t":"Mike Frysinger"},"email":{"$t":"vapier@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8414794509486727550"},"published":{"$t":"2012-06-20T09:33:11.511Z"},"updated":{"$t":"2012-06-20T09:33:11.523Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-20T09:33:11.511Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot 2012-06-20 6:31:36 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8414794509486727550"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser/Screenshot%202012-06-20%206:31:36%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8414794509486727550"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8414794509486727550"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8414794509486727550"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8414794509486727550"}],"author":[{"name":{"$t":"Jun Mukai"},"email":{"$t":"mukai@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1381794382892593078"},"published":{"$t":"2012-06-19T04:51:06.600Z"},"updated":{"$t":"2012-06-19T04:51:06.606Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-19T04:51:06.600Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot 2012-05-23 5-48-07 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1381794382892593078"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser/Screenshot%202012-05-23%205-48-07%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1381794382892593078"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1381794382892593078"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1381794382892593078"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1381794382892593078"}],"author":[{"name":{"$t":"Jun Mukai"},"email":{"$t":"mukai@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5890782552173666221"},"published":{"$t":"2012-06-19T04:48:29.092Z"},"updated":{"$t":"2012-06-19T04:48:29.103Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-19T04:48:29.092Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"col.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5890782552173666221"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2115352916434809417"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/ash-color-chooser/col.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5890782552173666221"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5890782552173666221"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5890782552173666221"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5890782552173666221"}],"author":[{"name":{"$t":"Jun Mukai"},"email":{"$t":"mukai@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/181659178243187251"},"published":{"$t":"2012-06-14T18:03:14.515Z"},"updated":{"$t":"2012-06-14T18:57:47.833Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-14T18:57:46.295Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"webNavigation 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e2012-06-14\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003ejochen@\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003ejochen@, mpcomplete@\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eNow that the webNavigation API is released for a while, I learned about certain short-comings I'd like to fix. This proposal captures the required additions / changes to the current webNavigation API. \u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-style:italic;white-space:pre-wrap;background-color:transparent\"\u003eCurrently, if a page is pre-rendered, and you navigate to that page, the navigation is aborted, and the page magically is there (without further visible webNavigation events). The next version of the webNavigation API should indicate when a prerendered page is swapped in.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eIf a navigation crosses a process boundary, the tuple (tab ID, frame ID) is no longer unique, but there might be two frames with the same ID navigating for the same tab, but in two different processes. Also, the frame ID of the main frame might change during a provisional load. It seems that we can't hide these details of our process model (without considerable effort). The next version should allow for updating frame IDs during provisional loads, and have a truly unique identifier for frames. \u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eThere were bug reports filed about this: \u003ca href\u003d\"http://crbug.com/116643\"\u003ehttp://crbug.com/116643\u003c/a\u003e \u003ca href\u003d\"http://crbug.com/117043\"\u003ehttp://crbug.com/117043\u003c/a\u003e \u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eNo, it's just an extension of an existing API\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:normal;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eWhen we add new fancy navigation features (e.g. similar to prerendering), the API might need to be extended again.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eIf multiple extensions used this API at the same time, could they conflict with each others? If so, how do you propose to mitigate this problem?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003ci\u003eNo\u003c/i\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eNone\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"font-size:small;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eActions taken with extension APIs should be obviously attributable to an extension. Will users be able to tell when this new API is being used? How?\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ci\u003eThe API is only observing events, there should be no observable impact.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eThe API can be used to monitor each and every navigation, but that's already possible with v1.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) observe each and every navigation, send it to some 3rd-party server\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) ...\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3) profit\u003c/span\u003e\u003cbr /\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat security UI or other mitigations do you propose to limit evilness made possible by this new API?\u003c/span\u003e\u003ci\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe webNavigation API already triggers a warning at install time.\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/b\u003e\u003cb\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eNo\u003c/span\u003e\u003c/b\u003e\u003cb\u003e\u003cfont\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eYou could guess that a page is being prerendered, or try to work around duplicate frame IDs.\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eAll existing events and methods that take or return a frame ID will in addition take a process ID. A frame is then uniquely identified by the tripple (tab id, process id, frame id). \u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eThe onCommitted signal's documentation is updated to state that the frame ID and process ID might have changed since the onBeforeNavigate signal.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eFurthermore, this new event is introduced. :\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cb\u003eonReplacedTab\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"courier new, monospace\"\u003echrome.webNavigation.onReplacedTab.addListener(function (object details) { ... });\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eFired when a navigation is aborted, and instead a prerendered tab is swapped in.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eListener parameters\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003edetails (object)\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e sourceTabId (integer)\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e The ID of the tab being replaced\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e tabId (integer)\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e The ID of the tab replacing the sourceTabId\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e timeStamp (number)\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e The time when the browser was about to replace the tab in milliseconds since the epoch.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eThe proposed changes are \"breaking changes\" as an extension using v1 of the API will still experience the above referenced bugs. Is that ok?\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/webnavigation-v2"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/181659178243187251"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/5"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/181659178243187251"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/181659178243187251"}],"author":[{"name":{"$t":"Jochen Eisinger"},"email":{"$t":"jochen@chromium.org"}}],"sites$pageName":{"$t":"webnavigation-v2"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5451915615502814763"},"published":{"$t":"2012-06-12T17:21:14.880Z"},"updated":{"$t":"2012-06-12T17:21:14.917Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-12T17:21:14.880Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"NetLog1.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5451915615502814763"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1619622863956191042"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/network-stack/netlog/NetLog1.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5451915615502814763"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5451915615502814763"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5451915615502814763"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5451915615502814763"}],"author":[{"name":{"$t":"Eric Roman"},"email":{"$t":"eroman@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3637039887652540912"},"published":{"$t":"2012-06-08T22:50:56.916Z"},"updated":{"$t":"2012-06-08T22:50:56.959Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-08T22:50:56.916Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"netinternals_export.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3637039887652540912"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7356854172176759459"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/for-testers/providing-network-details/netinternals_export.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3637039887652540912"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3637039887652540912"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3637039887652540912"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3637039887652540912"}],"author":[{"name":{"$t":"Eric Roman"},"email":{"$t":"eroman@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2950313301574131417"},"published":{"$t":"2012-06-07T21:12:42.830Z"},"updated":{"$t":"2012-06-07T21:12:42.842Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-07T21:12:42.830Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Step2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2950313301574131417"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8649171594513493687"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/gpu-wrangling/Step2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2950313301574131417"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2950313301574131417"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2950313301574131417"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2950313301574131417"}],"author":[{"name":{"$t":"Nathaniel Duca"},"email":{"$t":"nduca@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4530108081026099305"},"published":{"$t":"2012-06-07T21:11:38.998Z"},"updated":{"$t":"2012-06-07T21:11:39.011Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-07T21:11:38.998Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Step1.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4530108081026099305"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8649171594513493687"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/gpu-wrangling/Step1.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4530108081026099305"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4530108081026099305"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4530108081026099305"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4530108081026099305"}],"author":[{"name":{"$t":"Nathaniel Duca"},"email":{"$t":"nduca@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5238034101388052947"},"published":{"$t":"2012-05-23T20:24:09.347Z"},"updated":{"$t":"2012-06-01T12:49:00.406Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-06-01T12:49:00.294Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"decode_policy_blob.sh"},"summary":{},"content":{"type":"text/x-sh","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5238034101388052947"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4350250841648934561"},{"rel":"alternate","type":"text/x-sh","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/enterprise/protobuf-encoded-policy-blobs/decode_policy_blob.sh"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5238034101388052947"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5238034101388052947"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5238034101388052947"},{"rel":"edit-media","type":"text/x-sh","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5238034101388052947"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/254770468540153795"},"published":{"$t":"2012-05-23T20:24:20.537Z"},"updated":{"$t":"2012-05-23T20:24:20.606Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-23T20:24:20.537Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"encode_policy_blob.sh"},"summary":{},"content":{"type":"text/x-sh","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/254770468540153795"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4350250841648934561"},{"rel":"alternate","type":"text/x-sh","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/enterprise/protobuf-encoded-policy-blobs/encode_policy_blob.sh"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/254770468540153795"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/254770468540153795"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/254770468540153795"},{"rel":"edit-media","type":"text/x-sh","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/254770468540153795"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5063750816341369735"},"published":{"$t":"2012-03-15T14:38:08.025Z"},"updated":{"$t":"2012-05-23T19:59:17.422Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-23T19:59:16.264Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Enterprise"},"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 is a loose collection of enterprise relevant documents:\u003cdiv\u003e\u003cul\u003e\u003cli\u003eHigh-level overview \u003ca href\u003d\"https://docs.google.com/a/chromium.org/presentation/d/1dPtXXOXiOvvvt9VCTJcFEgSxFG2_FGY6R9zCiACqCc0/present\"\u003eslide deck\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/enterprise/adding-new-policies\"\u003eAdding New Group Policies\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/enterprise/running-the-cloud-policy-test-server\" target\u003d\"_blank\"\u003eRunning the cloud policy test server\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/enterprise/protobuf-encoded-policy-blobs\" target\u003d\"_blank\"\u003eWorking with protobuf-encoded policy blobs\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003cdiv\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":"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/enterprise"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5063750816341369735"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5063750816341369735"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5063750816341369735"}],"author":[{"name":{"$t":"Mattias Nissler"},"email":{"$t":"mnissler@chromium.org"}}],"sites$pageName":{"$t":"enterprise"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"Xyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8399156310382950414"},"published":{"$t":"2010-02-25T21:36:32.197Z"},"updated":{"$t":"2012-05-21T18:36:54.680Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-21T18:36:52.902Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Process Model 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 style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e02/24/2012\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNasko Oskov (nasko@chromium.org), Charlie Reis (creis@chromium.org)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eSite Isolation\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eAdd chrome.processes API that lets extensions access data about the Chrome’s process model, such as process ID and CPU usage.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cspan\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb applications are becoming more complex and resource demanding, and power users may want a better view of which pages are responsible for resource use. It may also be useful as a debugging or diagnosis tool, to see which tabs are currently sharing fate. Here are a few types of extensions that could use this API:\u003c/span\u003e\u003cul style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA Browser Action showing all tabs sharing the current process. All of these tabs would slow down or crash together if something went wrong.\u003c/span\u003e\u003cimg height\u003d\"189px;\" src\u003d\"https://lh5.googleusercontent.com/KnOBPV-gjd9L3rQLK966uNUTnsow-9mikKEj049XGuwTJf6UHxe3NXigKywxKyPuPvXEFoe71Vlxn9gDNE2vGTqpK5ffMjx7YmDCXlmVMqPzwR1TThw\" width\u003d\"500px;\" /\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA Browser Action showing the current CPU or memory use of the tab's process with a utilization graph, much like the Windows Task Manager icon in the system tray.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAn extension that automatically restores all affected tabs if a process crashes, unless the crash repeats itself (much like IE8).\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAn extension that implements a custom task manager, perhaps with graphs or other visualizations.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eChris Bentzel and Erik Kay have expressed interest in using this API to prototype different policies for process management (such as killing prerender processes). Patrick Stinson \u003c/span\u003e\u003ca href\u003d\"http://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/e5f0963407ccfb4d/c7bdd506c06646eb\" style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(17,85,204);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ehas expressed interest\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e in creating a custom “Aw-snap” screen to use in kiosk scenarios and reload the current URL.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eUnlikely, because it is mainly useful in multi-process browser architectures. While an increasing number of browsers are moving toward such architectures, it's certainly not a requirement for all web browsers. It also could expose functionality specific to the Chromium process model in the future.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eYes. The API will expose functionality that is already present in the Task Manager and unlikely to disappear in the future.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe initial version of the API will not include memory details other than the private memory for the process. The reason is the complexity of adding memory usage information, which needs to be retrieved in asynchronous model (through a MemoryDetails object). In addition, for getting the overall memory usage of the browser, we need platform specific logic for calculating the data. The goal is to release an initial version to allow feedback on the API and its usage, with a follow up update adding the extra information.\u003c/span\u003e\u003c/b\u003e\u003cspan\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe API will not affect UI surface. It will expose internal browser data to extensions, which can author their own UI based on the data.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eLike most extension APIs, it could be used to leak information about the user's browsing habits, such as the number of processes running or CPU usage patterns. It could also be used to load attack pages in the same process as another page, but that can already be done without this API using iframes. It could be used as a DoS tool by crashing particular renderer processes, but extensions can already do this by visiting \"about:crash\" in a given tab.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) Kill random or all processes, causing tabs showing “Oh Snap” screens.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) Use the terminate method to try and kill processes outside of Chromium.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNo, the API will provide access to the process model only. The only state change the API will allow is to terminate child processes, which should not lead to any permanent changes to the system.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eWe are not aware of another way to obtain this information. Some of the data (though not CPU usage) is provided by about:memory, but extensions are not allowed to load this page to parse its contents. Even if about:memory could be loaded and parsed by extensions, it would be difficult to match a given tab to a process simply by its title.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAPI reference:\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e chrome.processes\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eMethods:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eterminate\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.terminate(integer processId, optional function callback)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTerminates the specified Chrome process. For renderer processes, it is equivalent to visiting about:crash, but without changing the tab's URL.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocessId ( integer )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe ID of the process to be terminated.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCallback function\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe callback \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eparameter\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e should specify a function that looks like this:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003efunction(boolean result) {...}\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eresult ( boolean )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTrue if terminating the process was successful, otherwise false.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003cspan\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003egetProcessInfo\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.getProcessInfo(integer or array of integer processIds, boolean includeMemory, function callback)\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cspan\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eRetrieves the process information for each process ID specified.\u003c/span\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocessIds ( integer or array of integer )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe list of process IDs or single process ID for which to return the process information. An empty list indicates all processes are requested.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eincludeMemory ( boolean )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTrue if detailed memory usage is required. Note, collecting memory usage information incurs extra CPU usage and should only be queried for when needed.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ecallback ( optional function )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eCalled when the processes information is collected.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCallback function\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe callback \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eparameter\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e should specify a function that looks like this:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003efunction(object processes) {...}\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocesses ( object )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eA dictionary of Process objects for each requested process that is a live child process of the current browser process, indexed by process ID. Metrics requiring aggregation over time will not be populated in each Process object.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003cspan\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eEvents:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eonCreated\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.onCreated.addListener(function(Process process) {...});\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eFires when a new process is created.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold;text-indent:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocess ( Process )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eDetails of the process that was created. Metrics requiring aggregation over time will not be populated in the object.\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eonExited\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.onExited.addListener(function(integer processId, integer exitType, integer exitCode) {...});\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eFires when a process is terminated, either cleanly or due to a crash.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocessId ( integer )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe ID of the process that exited.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eexitType ( integer )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe type of exit that occurred for the process - normal, abnormal, killed, crashed. Only available for renderer processes.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eexitCode ( optional integer )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe exit code if the process exited abnormally. Only available for renderer processes.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003cspan\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eonUnresponsive\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.onUnresponsive.addListener(function(Process process) {...});\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eFires when a process becomes unresponsive.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocess ( Process )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eDetails of the unresponsive process. Metrics requiring aggregation over time will not be populated in the object. Only available for renderer processes.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.onUpdated.addListener(function(object processes) {...});\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eFires each time the Chrome Task Manager updates its process statistics, providing a dictionary of updated Process objects, indexed by process ID.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocesses ( object )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eA dictionary of updated Process objects for each live process in the browser, indexed by process ID.  Metrics requiring aggregation over time will be populated in each Process object.\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003c/span\u003e\u003cspan\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.processes.onUpdatedWithMemory.addListener(function(object processes) {...});\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eFires each time the Chrome Task Manager updates its process statistics, providing a dictionary of updated Process objects, indexed by process ID. Identical to \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdate\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e, with the addition of memory usage details included in each Process object. Note, collecting memory usage information incurs extra CPU usage and should only be listened for when needed.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eParameters\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprocesses ( object )\u003c/span\u003e\u003c/p\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eA dictionary of updated Process objects for each live process in the browser, indexed by process ID.  Memory usage details will be included in each Process object.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:15px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eTypes:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCache\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e( object )\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Cache object contains information about the size and utilization of a cache used by Chrome.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003esize ( integer )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe size of the cache, in bytes.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e  liveSize ( integer )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe part of the cache that is utilized, in bytes.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003cspan\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eProcess\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e( object )\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe Process object contains various types of information about the underlying OS process. Some of the information, such as \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ecpu\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003esqliteMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e, needs to be collected over time. Such data is present in the object only when it is part of a callback for the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e events and not for \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003egetProcessInfo\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.  Also, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eprivateMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e is expensive to measure, so it is only present in the object when it is part of a callback for \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003egetProcessInfo\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e with the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eincludeMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e flag.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    id ( integer )\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003eThe unique ID of the process provided by Chrome.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    osProcessId ( integer )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe operating system process ID.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    type ( string )\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003eThe type of process.  Either \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ebrowser\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erenderer\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eextension, notification, plugin, worker, nacl, \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e        utility, gpu, \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eor\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e other\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    profile ( string )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe profile which the process is associated with.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    tabs ( array of integer )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eArray of Tab IDs that have a page rendered by this process. The list will be non-empty for \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003erenderer\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e processes only.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    cpu ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process's CPU usage, between 0 and 100%. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    privateMemory ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process's private memory usage, in bytes. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003egetProcessInfo\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e with the \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eincludeMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e flag.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    network ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process's network usage, in bytes per second. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    jsMemoryAllocated ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process’s JavaScript allocated memory, in bytes. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    jsMemoryUsed ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process’s JavaScript memory used, in bytes. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    sqliteMemory ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process’s SQLite memory usage, in bytes.  Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    fps ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e number )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent measurement of the process’s frames per section. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    imageCache ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e object )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent information about the image cache for the process. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    scriptCache ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e object )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent information about the script cache for the process. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e    cssCache ( \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;color:rgb(102,102,102);font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eoptional\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e object )\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe most recent information about the CSS cache for the process. Only available when receiving the object as part of a callback from \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdated\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eonUpdatedWithMemory\u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e.\u003c/span\u003e\u003c/p\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cspan\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-size:13px;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;vertical-align:baseline;white-space:pre-wrap\"\u003eDoes the Tab object need a process ID added to it?\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;vertical-align:baseline;white-space:pre-wrap\"\u003eAfter discussion with Charlie Reis, it will be best to be a list or tree structure, to accommodate future out of process IFrame rendering work. Ideally we can include plugin processes as Process objects and form a full tree of all processes involved in rendering a single tab.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eShould Site Instance be exposed through the API?\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:bold\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:13px;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAt this point in time it is hard to come up with a good example other than some of our own visualizing/debugging. If any compelling usage presents itself, we can see if it justifies including the information. For now I don't think it is worthwhile information to expose.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eShould we maintain a list of tabs associated with a process, or should we let developers do that by looping over the current tabs?\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ci\u003eAaron: That seems useful.\u003c/i\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/processes-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8399156310382950414"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8399156310382950414"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8399156310382950414"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$pageName":{"$t":"processes-api"},"sites$revision":{"$t":"16"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6050967305725241153"},"published":{"$t":"2012-02-24T22:28:24.940Z"},"updated":{"$t":"2012-05-18T14:03:11.401Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-18T14:03:10.284Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"LTE: Manual E362 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\"\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-LTE-Support-on-Link\" /\u003eLTE Support on Link\u003c/h2\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eE362 modems are supported on the Link platform because the make.conf file specifies USE\u003dmodemmanager-next. There should be nothing special you need to do, other than to make sure that you are running shill and not flimflam.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-LTE-Support-on-Alex\" /\u003eLTE Support on Alex\u003c/h2\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eFor developers using older hardware, e.g. Alex, the following instructions are still relevant.\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cdiv\u003e\u003cb style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003eHow to set up to manually test and use a Novatel E362 LTE modem (updated 2012-2-14)\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e(This should all be handled by Shill in the near future)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eYou will need:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - ChromeOS dev system\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e - ChromeOS device with an E362 + appropriate SIM\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eOn your dev server, in the chroot, run:\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eemerge-${BOARD} --unmerge net-misc/modemmanager modemmanager-next-interfaces virtual/modemmanager\u003c/span\u003e\u003c/b\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003estart-devserver\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Consolas;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eOn the device, as root, run:\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003estop modemmanager\u003cbr /\u003emount -o remount,rw /\u003cbr /\u003eemerge --unmerge net-misc/modemmanager \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003emodemmanager-next-interfaces virtual/modemmanager\u003c/span\u003e\u003c/font\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003eSet up the network to dev server, USB ethernet or whatever, in your usual manner, and run:\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eUSE\u003dmodemmanager_next gmerge --accept_stable virtual/modemmanager\u003cbr /\u003estart modemmanager\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003emmcli -L\u003cbr /\u003emmcli -m 0          \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eConfirm that the modem is detected - this command should produce about 20 lines of status about the device.\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTo connect:\u003cbr /\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eifconfig eth0 down\u003cbr /\u003emmcli -m 0 --simple-connect\u003d\"\"\u003cbr /\u003eifconfig eth0 up\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThis last command triggers flimflam to run DHCP and configure the interface.\u003cbr /\u003e-\u0026gt; Make sure you unplug USB Ethernet devices and disable wifi before running speedtest or similar!\u003cbr /\u003e\u003cbr /\u003eTo disconnect:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Courier New;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003emmcli -m 0 --simple-disconnect\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/7533640312110703966"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/debugging-3g/manual-e362-setup"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6050967305725241153"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6050967305725241153"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6050967305725241153"}],"author":[{}],"sites$pageName":{"$t":"manual-e362-setup"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"XCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4029986824404429231"},"published":{"$t":"2008-12-10T19:54:07.454Z"},"updated":{"$t":"2012-05-17T21:40:36.448Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-17T21:40:34.723Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"views Windowing"},"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\"\u003eviews provides support for creating dialog boxes and other kinds of windows through its \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidget\u003c/span\u003e object. The developer creates a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e (or sub-interface) implementation that provides the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWindow\u003c/span\u003e with the necessary information to display itself, and also provides callbacks for notifications about windowing events.\u003ch4\u003e\u003ca name\u003d\"TOC-A-Simple-Example\" /\u003eA Simple Example\u003c/h4\u003e\u003cdiv\u003eTo create a simple window:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e#include \"base/basictypes.h\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e#include \"base/compiler_specific.h\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e#include \"base/utf_string_conversions.h\"\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e#include \"ui/gfx/canvas.h\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e#include \"ui/views/controls/label.h\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e#include \"ui/views/view.h\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e#include \"ui/views/widget/widget.h\"\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e#include \"ui/views/widget/widget_delegate.h\"\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\"\u003eclass WindowView : public views::WidgetDelegateView {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e public:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  WindowView() : label_(NULL) {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    Init();\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual ~WindowView() {\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e}\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e private:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  // Overridden from views::View:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE {\u003cbr /\u003e    canvas-\u0026gt;FillRect(GetLocalBounds(), \u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eSK_ColorWHITE\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual void Layout() OVERRIDE {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    gfx::Size ps \u003d label_-\u0026gt;GetPreferredSize();\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    label_-\u0026gt;SetBounds((width() - ps.width()) / 2, (height() - ps.height()) / 2, ps.width(), ps.height());\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual gfx::Size GetPreferredSize() OVERRIDE {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    gfx::Size ps \u003d label_-\u0026gt;GetPreferredSize();\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    ps.set_width(ps.width() + 200);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    ps.set_height(ps.height() + 200);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    return ps;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  // Overridden from views::WidgetDelegate:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual string16 GetWindowTitle() const OVERRIDE{\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    return ASCIIToUTF16(\"Hello World Window\");\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual bool CanResize() const OVERRIDE {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    return true;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual bool CanMaximize() const OVERRIDE {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    return true;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  virtual views::View* GetContentsView() OVERRIDE {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    return this;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  void Init() {\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\"\u003elabel_ \u003d new views::Label(ASCIIToUTF16(\"Hello, World!\"));\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    AddChildView(label_);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  views::Label* label_;\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  DISALLOW_COPY_AND_ASSIGN(WindowView);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e};\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\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\"\u003eviews::Widget::CreateWindow(new WindowView)-\u0026gt;Show();\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe window will delete itself when the user closes it, which will cause the RootView within it to be destroyed, including the WindowView.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-WidgetDelegate\" /\u003eWidgetDelegate\u003c/h4\u003e\u003cdiv\u003eThe \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e is an interface that provides information to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidget\u003c/span\u003e class used when displaying the window, such as its title and icon, as well as properties such as whether or not the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ewindow\u003c/span\u003e can be resized. It also provides callbacks for events like closing. It has an accessor \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ewindow()\u003c/span\u003e which provides access to the associated \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWindow\u003c/span\u003e object. A \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidget\u003c/span\u003e has a ContentsView, provided by the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e, which is a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eView\u003c/span\u003e that is inserted into the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWindow\u003c/span\u003e's client area.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-DialogDelegate\" /\u003eDialogDelegate\u003c/h4\u003e\u003cdiv\u003eA \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogDelegate\u003c/span\u003e is a specialized kind of \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e specific to dialog boxes that have OK/Cancel buttons. The \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogDelegate\u003c/span\u003e and its associated \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e (see below) provide built in OK/Cancel buttons, keyboard handlers for Esc/Enter and enabling for those features. As a user, you write a View that is inserted into the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogClientView\u003c/span\u003e that provides the contents of the dialog box, and implement \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogDelegate\u003c/span\u003e instead of \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e, which provides callbacks for when the buttons are clicked as well as methods to provide the button text, etc.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Client-and-Non-Client-Views\" /\u003eClient and Non Client Views\u003c/h4\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/views-windowing/NonClientView.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1235886489858/developers/design-documents/views-windowing/NonClientView.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eDue to Chrome's non-standard window design, views supports custom rendered non-client areas. This is supported via the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWindow\u003c/span\u003e class and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e subclasses. To provide a custom window frame, a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eView\u003c/span\u003e subclasses \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e. This allows the overriding \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eView\u003c/span\u003e to render and respond to events from the non-client areas of a window. views contains two built in type that do this - \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eCustomFrameView\u003c/span\u003e and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNativeFrameView\u003c/span\u003e. These are used for standard dialog boxes and top level windows.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/browser-window\"\u003eBrowser Window\u003c/a\u003e, different subclasses of \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e are used (\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eGlassBrowserFrameView\u003c/span\u003e and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eOpaqueBrowserFrameView\u003c/span\u003e). To allow these to be used the browser overrides Window's CreateFrameViewForWindow method to construct the appropriate frame view.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAside from the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eRootView\u003c/span\u003e, the topmost \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eView\u003c/span\u003e in a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWindow\u003c/span\u003e's \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eView\u003c/span\u003e hierarchy is the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientView\u003c/span\u003e. This view is a container of exactly two views - the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e described above and a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e or subclass. The \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e subclass contains the contents of the client area of the window (the stuff inside the titlebar/frame). A common \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e subclass is \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogClientView\u003c/span\u003e, which provides built in handling for OK/Cancel buttons and a dialog theme background. The specific \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e to be used is specified by a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e in its \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eCreateClientView\u003c/span\u003e implementation. The default implementation of \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogDelegate\u003c/span\u003e automatically creates a \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eDialogClientView\u003c/span\u003e. Custom \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003es can implement this method to return their own \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e, which is what \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eBrowserView\u003c/span\u003e does (the Browser window's \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWidgetDelegate\u003c/span\u003e implementor) to return itself. The \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e API is fairly minimal except it is given a chance to perform non-client hit-testing, which is how the draggable title bar within the TabStrip and the resize corner of windows is implemented.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e and \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e are siblings because it is fairly common for Views to do one-time initialization when they are inserted into a View hierarchy and DWM toggling on Windows Vista and newer mean the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e needs to be swapped out when the DWM is enabled or disabled. As such if the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eClientView\u003c/span\u003e were a child of the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eNonClientFrameView\u003c/span\u003e it would be re-parented, meaning its children might re-initialize with negative side-effects.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Creating-a-Window\" /\u003eCreating a Window\u003c/h4\u003e\u003cdiv\u003eSome simple code to create a window using the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003eWindowView\u003c/span\u003e defined in the example above:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eviews::Widget* window \u003d views::Widget::CreateWindow(new WindowView);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ewindow-\u0026gt;Show();\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\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/views-windowing"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4029986824404429231"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4029986824404429231"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4029986824404429231"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"views-windowing"},"sites$revision":{"$t":"25"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1266137332794496519"},"published":{"$t":"2012-05-17T16:00:05.091Z"},"updated":{"$t":"2012-05-17T16:00:05.104Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-17T16:00:05.091Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"atest-diagram.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1266137332794496519"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7581770669156251778"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-user-doc/atest-diagram.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1266137332794496519"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1266137332794496519"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1266137332794496519"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1266137332794496519"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2989302745327394327"},"published":{"$t":"2012-05-17T15:53:57.257Z"},"updated":{"$t":"2012-05-17T15:53:57.268Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-17T15:53:57.257Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"atest-diagram.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2989302745327394327"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7581770669156251778"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/testing/autotest-user-doc/atest-diagram.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2989302745327394327"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2989302745327394327"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2989302745327394327"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2989302745327394327"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2863032819219593056"},"published":{"$t":"2012-05-15T13:05:23.399Z"},"updated":{"$t":"2012-05-15T13:05:23.411Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T13:05:23.399Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"with.PNG"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2863032819219593056"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/with.PNG"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2863032819219593056"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2863032819219593056"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2863032819219593056"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2863032819219593056"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7029567265657373552"},"published":{"$t":"2012-05-15T13:04:50.119Z"},"updated":{"$t":"2012-05-15T13:04:50.130Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T13:04:50.119Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"noinstalls.PNG"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7029567265657373552"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/noinstalls.PNG"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7029567265657373552"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7029567265657373552"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7029567265657373552"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7029567265657373552"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/383931038240810004"},"published":{"$t":"2012-05-15T11:26:06.141Z"},"updated":{"$t":"2012-05-15T11:26:06.156Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T11:26:06.141Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-10 at 12.40.51 AM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/383931038240810004"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-10%20at%2012.40.51%20AM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/383931038240810004"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/383931038240810004"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/383931038240810004"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/383931038240810004"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9085554051578675245"},"published":{"$t":"2012-05-15T11:25:13.733Z"},"updated":{"$t":"2012-05-15T11:25:13.743Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T11:25:13.733Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-14 at 4.56.03 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9085554051578675245"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-14%20at%204.56.03%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9085554051578675245"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9085554051578675245"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9085554051578675245"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9085554051578675245"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1721063838687966116"},"published":{"$t":"2012-05-15T11:24:54.942Z"},"updated":{"$t":"2012-05-15T11:24:54.961Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T11:24:54.942Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-14 at 4.48.28 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1721063838687966116"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-14%20at%204.48.28%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1721063838687966116"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1721063838687966116"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1721063838687966116"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1721063838687966116"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5410674182962179199"},"published":{"$t":"2012-05-15T09:31:04.126Z"},"updated":{"$t":"2012-05-15T09:31:04.141Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T09:31:04.126Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-11 at 12.02.41 AM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5410674182962179199"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-11%20at%2012.02.41%20AM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5410674182962179199"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5410674182962179199"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5410674182962179199"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5410674182962179199"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8119755252546232643"},"published":{"$t":"2012-05-15T09:30:21.545Z"},"updated":{"$t":"2012-05-15T09:30:21.561Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T09:30:21.545Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-11 at 12.00.09 AM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8119755252546232643"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-11%20at%2012.00.09%20AM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8119755252546232643"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8119755252546232643"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8119755252546232643"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8119755252546232643"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5306328646303610468"},"published":{"$t":"2012-05-15T09:29:55.198Z"},"updated":{"$t":"2012-05-15T09:29:55.213Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T09:29:55.198Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-10 at 11.59.08 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5306328646303610468"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-10%20at%2011.59.08%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5306328646303610468"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5306328646303610468"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5306328646303610468"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5306328646303610468"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4149159531644899870"},"published":{"$t":"2012-05-15T09:29:03.151Z"},"updated":{"$t":"2012-05-15T09:29:03.173Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-05-15T09:29:03.151Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2012-05-09 at 7.43.31 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4149159531644899870"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5851923117223734504"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/web-intents-in-chrome/Screen%20shot%202012-05-09%20at%207.43.31%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4149159531644899870"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4149159531644899870"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4149159531644899870"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4149159531644899870"}],"author":[{"name":{"$t":"Paul Kinlan"},"email":{"$t":"paulkinlan@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1673816937163651139"},"published":{"$t":"2011-05-10T09:03:31.137Z"},"updated":{"$t":"2012-04-30T18:57:50.370Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-04-30T18:57:49.219Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"fuzzers"},"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-cross_fuzz\" /\u003ecross_fuzz\u003c/h2\u003e\u003cdiv\u003ecross_fuzz is a DOM fuzzer, a good stress test for Chromium and any other browser.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo get cross_fuzz just add \u003c/div\u003e\u003cdiv\u003e   \u003cfont face\u003d\"'courier new', monospace\"\u003e\"src/third_party/cross_fuzz\": \"http://src.chromium.org/chrome/trunk/deps/third_party/cross_fuzz\",\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eto your \"custom_deps\" section in your \u003cfont face\u003d\"'courier new', monospace\"\u003e.gclient\u003c/font\u003e and run \u003cfont face\u003d\"'courier new', monospace\"\u003egclient runhooks\u003c/font\u003e. \u003c/div\u003e\u003cdiv\u003eYour gclient file should look like this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003esolutions \u003d [\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  { \"name\"        : \"src\",\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"url\"         : \"http://src.chromium.org/chrome/trunk/src\",\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"custom_deps\" : {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \u003cb\u003e\"src/third_party/cross_fuzz\": \"http://src.chromium.org/chrome/trunk/deps/third_party/cross_fuzz\",\u003c/b\u003e\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    }\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]\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo run cross_fuzz just point the browser to the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003ethird_party/cross_fuzz/\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003ecross_fuzz_randomized_20110105_seed.html\u003c/span\u003e page. Popup blocker should be disabled. \u003c/div\u003e\u003cdiv\u003eFor automated runs you may use something like this:\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  out/Release/chrome \u003cb\u003e--disable-popup-blocking\u003c/b\u003e --no-first-run --user-data-dir\u003d$TEMPDIR \\\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    --allow-file-access-from-files --noerrdialogs --disable-hang-monitor \\\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    file://`pwd`/third_party/cross_fuzz/cross_fuzz_randomized_20110105_seed.html\u003cb\u003e#1234\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOn Windows, you should use\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e    file://%cd%/third_party/cross_fuzz/cross_fuzz_randomized_20110105_seed.html\u003cb\u003e#1234\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003einstead.\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\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cb\u003e#1234 \u003c/b\u003e\u003c/span\u003eis the random seed. Replace it with your own seed or remove it from the URL if you want cross fuzz to generate its own random seed. \u003cbr /\u003e\u003c/font\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/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/fuzzers"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1673816937163651139"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1673816937163651139"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1673816937163651139"}],"author":[{"name":{"$t":"Kostya Serebryany"},"email":{"$t":"kcc@chromium.org"}}],"sites$pageName":{"$t":"fuzzers"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3148830108975404224"},"published":{"$t":"2008-11-10T20:40:17.839Z"},"updated":{"$t":"2012-04-29T14:13:48.306Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-04-29T14:13:46.859Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"OSX Sandboxing 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\"\u003eThis document describes the process sandboxing mechanism used on Mac OS X.\u003ch2\u003e\u003ca name\u003d\"TOC-Background\" /\u003eBackground\u003c/h2\u003e\u003cdiv\u003eSandboxing treats a process as a hostile environment which at any time can be compromised by a malicious attacker via buffer overruns or other such attack vectors. Once compromised, the goal is to allow the process in question access to as few resources of the user's machine as possible, above and beyond the standard file-system access control and user/group process controls enforced by the kernel.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSee the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/sandbox\"\u003eoverview document\u003c/a\u003e for goals and general architectural diagrams.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Implementation\" /\u003eImplementation\u003c/h2\u003e\u003cdiv\u003eOn Mac OS X versions starting from Leopard, individual processes can have their privileges restricted using the \u003cspan style\u003d\"font-family:courier new,monospace\"\u003esandbox(7)\u003c/span\u003e facility of BSD, also referred to in some Apple documentation as \"Seatbelt\". This is made up of a single API call, \u003cspan style\u003d\"font-family:courier new,monospace\"\u003esandbox_init()\u003c/span\u003e, which sets the access restrictions of a process from that point on. This means that previously opened file descriptors continue working even if the new privileges would deny access to newly created descriptors. We can use this to our advantage by setting up everything correctly at the start of the process then cutting off all access before we expose the renderer to any 3rd party input (html, etc).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eSeatbelt does not place restrictions on memory allocation, threading, or access to previously opened OS facilities. As a result, this shouldn't impose any additional requirements or drastically alter our IPC designs. \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOS X provides additional protection against buffer overflows. In Leopard, the stack is marked as non-executable memory and thus less susceptible as an attack vector for executing malicious code. This doesn't prevent against buffer overruns in the heap, but for 64-bit apps, Leopard \u003cspan style\u003d\"font-family:Helvetica\"\u003edisallows any attempts to execute code unless that portion of memory is explicitly marked as executable. As we move towards 64-bit render processes in the future, this will be another attractive security feature. \u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003esandbox_init() \u003c/span\u003ehas supports for both predefined sandbox access restrictions and sandbox profile scripts which provide finer grained control.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eChromium uses custom sandbox profiles defined in .sb files in the source tree.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe following profiles are defined (paths relative to root of source directory):\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/common/common.sb\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e - used for common setup for all sandboxes.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/renderer/renderer.sb\u003c/font\u003e - used for the extension \u0026amp; renderer processes. Enables access to the font server.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome/browser/utility.sb\u003c/font\u003e - used by the utility process. Allows access to a single configurable directory.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003econtent/browser/worker.sb\u003c/font\u003e - used by the worker process.  Most restrictive - no file system access apart from loading system libraries.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome/browser/nacl_loader.sb\u003c/font\u003e - used for running Native Client untrusted (i.e., \"user\") code.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eOne sticky point we run into is that the sandboxed process calls through to OS X system APIs. There is no documentation available about which privileges each API needs, such as whether they need access to on-disk files, or call other APIs to which the sandbox restricts access. Our approach to date has been to \"warm up\" any problematic API calls before turning the sandbox on. This means that we call through to the API, to allow it to cache whatever resource it needs. For example, color profiles and shared libraries can be loaded from disk before we \"lock down\" the process.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eSandboxInitWrapper::InitializeSandbox()\u003c/font\u003e is the main entry point for initializing the Sandbox, it performs the following steps:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eDetermines if the current process type needs to be sandboxed and if so, which sandbox configuration to use.\u003c/li\u003e\u003cli\u003e\"Warm up\" relevant system APIs by calling through to  \u003cfont face\u003d\"'courier new', monospace\"\u003esandbox::SandboxWarmup()\u003c/font\u003e .\u003c/li\u003e\u003cli\u003eEnable the Sandbox by calling through to  \u003cfont face\u003d\"'courier new', monospace\"\u003esandbox::EnableSandbox()\u003c/font\u003e .\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Diagnostics\" /\u003eDiagnostics\u003c/h3\u003e\u003cdiv\u003eThe OS X sandbox implementation supports the following flags:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e--no-sandbox\u003c/font\u003e - Disable the sandbox entirely.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e--enable-sandbox-logging\u003c/font\u003e - Verbose information about which system calls are blocked is logged to syslog.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/how-tos/debugging-on-os-x\"\u003eDebugging Chrome on OS X\u003c/a\u003e contains more documentation on debugging and diagnostic tools provided by the Mac OS X sandbox API.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\r\n\r\n\r\n\r\n\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Additional-Reading\" /\u003eAdditional Reading\u003c/h2\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://reverse.put.as/wp-content/uploads/2011/09/Apple-Sandbox-Guide-v1.0.pdf\" rel\u003d\"nofollow\"\u003ehttp://reverse.put.as/wp-content/uploads/2011/09/Apple-Sandbox-Guide-v1.0.pdf\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://www.318.com/techjournal/?p\u003d107\" rel\u003d\"nofollow\"\u003ehttp://www.318.com/techjournal/?p\u003d107\u003c/a\u003e\u003cbr /\u003e\u003c/li\u003e\u003cli\u003esandbox man page (\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eman 7 sandbox\u003c/span\u003e)\u003c/li\u003e\u003cli\u003eSystem sandbox files can be found under one of the following paths (depending on the OS Version):\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e/Library/Sandbox/Profiles\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e/System/Library/Sandbox/Profiles\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"courier new, monospace\"\u003e/usr/share/sandbox\u003c/font\u003e\u003c/li\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/8604151105040058686"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/sandbox/osx-sandboxing-design"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3148830108975404224"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3148830108975404224"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3148830108975404224"}],"author":[{"name":{"$t":"Mike Pinkerton"},"email":{"$t":"pinkerton@chromium.org"}}],"sites$pageName":{"$t":"osx-sandboxing-design"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8332639875092228831"},"published":{"$t":"2012-01-24T19:00:42.953Z"},"updated":{"$t":"2012-04-24T16:26:16.015Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-04-24T16:26:14.756Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"MediaGallery"},"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-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e1/24/2012 updated 4/24/2012\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eSteve VanDeBogart. This document was authored by Tony Payne\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003cbr /\u003e\u003cp dir\u003d\"ltr\" style\u003d\"margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eowp-media-gallery@\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eMedia and metadata access API.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eThis API makes media applications much simpler and provides a standard interface for both local and online galleries.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eThis will be used in Q2 2012 by an internal application for both local (removable media) galleries and remote galleries. At least 2 other internal teams have expressed interest in using the API.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eWe intend to make this part of the web platform but are looking to release an experimental extension API first for 2 reasons: 1) to meet the aggressive goals of the internal project, 2) To vet the API before going to standards bodies. There are existing Gallery API proposals but they do not meet our needs (provide no metadata access and rely on synchronous APIs)\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eAs mentioned above, we don't expect to go beyond the experimental stage with this API. For backwards compatibility, the eventual OWP API can be wrapped by the existing experimental API.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eSettings: We may need a settings interface for adding and removing galleries from the browser.\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003ePermissions: \u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003ci style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003eAs an extension, a manifest permissions entry will be used. However, as a web platform API, a\u003c/i\u003e\u003ci style\u003d\"white-space:pre-wrap;font-family:Arial\"\u003epplications that have not been given permission to access the browser's galleries will cause a permissions prompt when they attempt to access galleries for the first time. \u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eThis API contains write and delete operations that can cause permanent data loss.\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eQuite a lot of attention has been given to making it easy to write well-performing applications using this API but there is always the potential for trying to keep too much data in memory, since this API gives access to a potentially enormous amount of media file data on the system and online.\u003cbr /\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) Delete all media files from the system\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) Corrupt all media files on the system\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3) Upload all media files on the system to an evil host\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e4) Fill up the user's local drive\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e5) Copy malware onto the system, hoping the user will execute it.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eYes. The MediaGallery API provides write and delete methods for making permanent changes to media files in the gallery.\u003cbr /\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eFile access via existing HTML5 file APIs using a File dialog to gain permission (this is a terrible user experience)\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eMetadata parsing using client-side parsers. These have terrible performance\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003ci\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe current draft is in WebIDL format here: \u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003ca href\u003d\"https://docs.google.com/a/google.com/document/pub?id\u003d1UpwxoIBoTgrA9fLujXCirNp4NYB0Z0F0LiX_SuS9c5U\"\u003ehttps://docs.google.com/a/google.com/document/pub?id\u003d1UpwxoIBoTgrA9fLujXCirNp4NYB0Z0F0LiX_SuS9c5U\u003c/a\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003ci style\u003d\"font-family:Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e\u003ci\u003eThe previous draft can be found here: \u003ca href\u003d\"https://docs.google.com/a/google.com/document/pub?id\u003d1RsLin39Zmun9kaxNUpChL55IoEHmLHF3EU8NRy28168\"\u003ehttps://docs.google.com/a/google.com/document/pub?id\u003d1RsLin39Zmun9kaxNUpChL55IoEHmLHF3EU8NRy28168\u003c/a\u003e\u003c/i\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003ci\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eWe will update the draft style to match other extension APIs once we've received more feedback.\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003ci\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003eTBD\u003c/i\u003e\u003c/span\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/media-gallery"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8332639875092228831"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8332639875092228831"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8332639875092228831"}],"author":[{}],"sites$pageName":{"$t":"media-gallery"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1681997699901630744"},"published":{"$t":"2012-04-19T17:02:06.899Z"},"updated":{"$t":"2012-04-19T17:05:14.836Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-04-19T17:05:13.402Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Gesture Recognizer 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\u003cspan\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"font-weight:bold\"\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cfont face\u003d\"Arial\" size\u003d\"5\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cdiv /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h1\u003e\u003ch2 style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Notation:\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNotation:\u003c/span\u003e\u003c/h2\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGreen text \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe name of a test which focuses on the preceding scenario.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(224,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNone \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNo test exists where the focus is the preceding scenario. \u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThere may be other tests which exercise this scenario, but ideally there would be a test in which this is the primary focus.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2 style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Gesture-Events:\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGesture Events:\u003c/span\u003e\u003c/h2\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTap Down\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.TapDown\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTap\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Wait, Release\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.Tap\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eDouble Tap\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Wait, Release, Press, Wait, Release\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.DoubleTap\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eLong Press\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Wait\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.LongPress\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThree Fingered Swipe\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2, Press 3, Swipe\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.ThreeFingeredSwipeLeft\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.ThreeFingeredSwipeRight\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.ThreeFingeredSwipeUp\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.ThreeFingeredSwipeDown\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Move 1, Press 2, Move 2, Press 3, Swipe\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(224,102,102);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNone \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eBegin, Update\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Move\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.NonRailScroll\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.HorizontalRailScroll\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.VerticalRailScroll\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2, Move 1, Move 2\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.PinchScroll\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eEnd\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Move, Release\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.NonRailFling\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.HorizontalRailFling\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.VerticalRailFling\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePinch\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eBegin, Update: \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.Pinch\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.PinchFromTap\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Move 1, Press 2\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.PinchFromScroll\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2, Release 1, Press 1\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.PinchFromScrollFromPinch\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eEnd\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cbr /\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Aborting-Gesture-Events:\" /\u003e\u003cspan\u003e\u003cspan style\u003d\"font-weight:bold;font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAborting Gesture Events:\u003c/span\u003e\u003c/span\u003e\u003c/h2\u003e\u003cspan\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTap Down\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eCan’t be aborted\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eTap\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Cancel : \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.TapCancel\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Move, Release: \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(224,102,102);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNone\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, PreventDefault’ed release\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureRecognizerTest.NoTapWithPreventDefaultedRelease\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eDouble Tap\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Release, Press different place, Release\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.OnlyDoubleTapIfClose\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Release, Press, Move, Release\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(224,102,102);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNone\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eLong Press\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Release, Wait : \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(224,102,102);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNone\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress, Move, Wait : \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.LongPressCancelledByScroll\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2, Wait\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.LongPressCancelledByPinch\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThree Fingered Swipe\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2, Press 3, Swipe Diagonally\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.ThreeFingeredSwipeDiagonal\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePress 1, Press 2, Press 3, Swipe in opposite directions\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(147,196,125);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.ThreeFingeredSwipeSpread\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eScroll\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eBegin, Update\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eCan’t be aborted\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eEnd\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eCan’t be aborted\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003ePinch\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eBegin, Update\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eCan’t be aborted\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:circle;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eEnd \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:square;font-size:16px;font-family:Arial;background-color:transparent;vertical-align:baseline\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(59,59,59);background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eCan’t be aborted\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2 style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Miscellaneous:\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMiscellaneous: \u003c/span\u003e\u003c/h2\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTap Followed by Scroll: \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.TapFollowedByScroll\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eRelease without Press: \u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureSequenceTest.IgnoreDisconnectedEvents\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eUnprocessed gesture events generate synthetic mouse events:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureRecognizerTest.GestureTapSyntheticMouse\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eQueueing of events:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureRecognizerTest.AsynchronousGestureRecognition\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2 style\u003d\"font-weight:bold;font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Targeting:\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eTargeting:\u003c/span\u003e\u003c/h2\u003e\u003c/span\u003e\u003col style\u003d\"font-family:Times New Roman;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cb\u003e\u003cli style\u003d\"list-style:decimal;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eIf a touch is already locked to a target, keep it.\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureRecognizerTest.GestureEventTouchLockSelectsCorrectWindow\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:decimal;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eIf a window is capturing touches, target that window.\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWindowTest.TouchCaptureTests\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWindowTest.TouchCaptureCancelsOtherTouches\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWindowTest.TouchCaptureDoesntCancelCapturedTouches\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:decimal;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eIf it's outside the root window, target the root window.\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eSystemGestureEventFilterTest.TapOutsideRootWindow\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureRecognizerTest.\u003c/span\u003e\u003cspan style\u003d\"color:rgb(147,196,125);vertical-align:baseline;white-space:pre-wrap\"\u003eGestureEventOutsideRootWindowTap\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:decimal;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eIf it's near another touch, use the other touch's target.\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(147,196,125);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGestureRecognizerTest.GestureEventTouchLockSelectsCorrectWindow\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"list-style:decimal;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eOtherwise, use whichever window the touch is above.\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(224,102,102);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNone\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/b\u003e\u003c/ol\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/3206081733549777770"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/gesture-recognizer/gesture-recognizer-tests"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1681997699901630744"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1681997699901630744"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1681997699901630744"}],"author":[{"name":{"$t":"Tim Dresser"},"email":{"$t":"tdresser@chromium.org"}}],"sites$pageName":{"$t":"gesture-recognizer-tests"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2951986558878479788"},"published":{"$t":"2010-07-08T18:58:22.903Z"},"updated":{"$t":"2012-03-22T20:15:31.395Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-22T20:15:29.952Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Getting Started: Background and Basics"},"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;font-family:Times New Roman;font-size:medium\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003eThis document gives a broad high-level overview of what Native Client is and how it fits into the world of web browsers and plugins (Chrome in particular). It is intended for anybody who wants to learn about the background and concepts behind Native Client, from browser technology fans, to pontential project contributors, to NaCl module developers.\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-off\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:500px;\"\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-Chrome\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eChrome\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Plugins\"\u003e\u003cstrong\u003e2 \u003c/strong\u003ePlugins\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Netscape-Plugin-API-NPAPI-No-longer-used-by-Native-Client-\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eNetscape Plugin API (NPAPI) (No longer used by Native Client)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Pepper-Plugin-API-PPAPI-\"\u003e\u003cstrong\u003e4 \u003c/strong\u003ePepper Plugin API (PPAPI)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Native-Client-NaCl-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eNative Client (NaCl)\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Trusted-vs-Untrusted\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eTrusted vs Untrusted\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Diagram\"\u003e\u003cstrong\u003e7 \u003c/strong\u003eDiagram\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Related-Documentation\"\u003e\u003cstrong\u003e8 \u003c/strong\u003eRelated Documentation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Articles-and-Blog-Posts\"\u003e\u003cstrong\u003e9 \u003c/strong\u003eArticles and Blog Posts\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/font\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Chrome\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eChrome\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eChrome is a \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/multi-process-architecture\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003emulti-process\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 browser. It uses multiple processes to provide increased security comparing to other single-process browsers like Firefox.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eThe main process is called \"browser\". It runs the UI (including the \u003c/span\u003e\u003ca href\u003d\"http://dev.chromium.org/user-experience/omnibox\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eOmnibox\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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) and manages tabs and plugin processes. It has full permissions of the current user for accessing resources (files, network, etc) and can fork-exec other processes.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eTabs are allocated into separate processes, typically shared per domain. These are called “renderer” processes. Renderer interprets the HTML layout and handles the bitmap for displaying the page. It runs in a sandbox (known as Chrome or outer sandbox) and has limited access permissions. It cannot open files or network connections and can only respond to communication requests by the browser. Communication is done via a combination of \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/inter-process-communication\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eIPC\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 techniques. Using sandboxed renderers ensures that if one tab misbehaves or crashes, the rest of the tabs and the browser are isolated. It also limits the ability of malicious software running in one tab from accessing activity in another tab or interacting with the rest of the system.\u003c/span\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Plugins\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ePlugins\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Plug-in_%28computing%29\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ePlugins\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 are external binaries that add new capabilities to a web browser and are loaded when content of the type they declare is embedded into a page. They either come bundled with the browser or get downloaded and installed by the user. The most common plugins are \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Adobe_flash\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eAdobe Flash\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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, \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Acrobat_reader\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eAdobe Reader\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 and \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Java_plugin\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eJava\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eIn general, existing plugins cannot be sandboxed like the render process because they rely on file system and network access as well as use of native fonts. Therefore, Chrome supports \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/plugin-architecture\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eout of process plugins\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 that run in a separate process with full privileges (i.e. no sandbox) and communicate with the renderer and browser via \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/inter-process-communication\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eIPC\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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. Chrome also supports \u003c/span\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/plugin-architecture\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ein process plugins\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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. They run within a render process and can use faster direct access for communication. They have also been used as an integration mechanism for adding new statically linked functionality to the browser.\u003c/span\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Netscape-Plugin-API-NPAPI-No-longer-used-by-Native-Client-\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eNetscape Plugin API (NPAPI) \u003cfont color\u003d\"#ff0000\"\u003e(No longer used by Native Client)\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ca href\u003d\"https://wiki.mozilla.org/NPAPI\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNPAPI\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 is a common cross-browser plugin framework used by plugins for exchanging data with the browser. It is implemented by Chrome, Firefox and most other web browsers, excluding MS Internet Explorer, which stopped supporting it in favor of \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/ActiveX_control\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eActiveX\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eContrary to other single-process browsers, Chrome \u003c/span\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/npapi.html\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003esupports\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 NPAPI plugins out of process. \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eWhile this improves stability, security is still an issue - even in Chrome, NPAPI plugins have full permissions of the current user to access resources and fork-exec new processes.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eAlthough NPAPI is intended to be platform independent, in reality it is not fully so. NPAPI is a weak \"standard\", and every browser implements it somewhat differently. Moreover, NPAPI plugins end up relying on OS and browser specifics for certain capabilities, such as 2D or 3D graphics events. Even keyboard and mouse events typically use the native OS implementation.  It can also be difficult to achieve similar rendering of the plugin area within a page across different systems.\u003c/span\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Pepper-Plugin-API-PPAPI-\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ePepper Plugin API (PPAPI)\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ca href\u003d\"https://wiki.mozilla.org/NPAPI:Pepper\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ePepper\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 started at Google as a way to address portability and performance issues with NPAPI, particularly for out of process plugins. The initial focused efforts eventually expanded to include capabilities such as generic 2D and 3D graphics and audio.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eThe first Pepper API designs were created to minimize the changes from legacy NPAPI, hoping to ease adoption by browser vendors and plugin developers. This design was implemented and is available to NaCl modules in Chrome 5. The Pepper APIs were redesigned subsequent to the initial design, deviating more substantially from legacy NPAPI while, hopefully, also improving the interfaces. The \u003c/span\u003e\u003cspan style\u003d\"border-collapse:collapse;font-family:arial,sans-serif;font-size:13px\"\u003e\u003ca href\u003d\"http://code.google.com/p/ppapi/w/list\"\u003erevised interfaces\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px;white-space:pre-wrap\"\u003e are sometimes referred to as “PPAPI” or “Pepper2” and should be available in Chrome 6.\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\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eAlthough traditional NPAPI plugins in Chrome run only out of process, Chrome 5 supports Pepper plugins only in process. Being a somewhat experimental feature, the only way to load trusted Pepper plugins is through the browser command-line options. In the future, Pepper plugins will only be supported within Native Client.\u003c/span\u003e\u003cbr /\u003e\u003ch3 style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Native-Client-NaCl-\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eNative Client (NaCl)\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ca href\u003d\"http://code.google.com/p/nativeclient/\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNative Client \u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eis a sandboxing technology for safe execution of platform-independent untrusted native code in a web browser. It allows real-time web applications that are compute-intensive and/or interactive (e.g. games, media, large data analysis, visualizations) to leverage the resources of a client's machine and avoid costly network access while running in a secure environment with restricted access to the host.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ca href\u003d\"http://gonacl.com\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNative Client SDK\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 is a software development kit for creating Native Client executables (abbreviated as nexe) from scratch or from the existing platform-specific web-based native applications. It consists of a \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/GNU_Project\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eGNU\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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-based toolchain with customized versions of \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/GNU_Compiler_Collection\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003egcc\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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, \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Binutils\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ebinutils\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 and \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Gdb\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003egdb\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 (32-bit x86 only), precompiled API libraries and various examples and how-tos. The two usage models include porting desktop apps and extending web apps with fast native code.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ca href\u003d\"http://code.google.com/p/naclports/\" style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNaclports\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 is a collection of ports of various open-sourced projects (like \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/zlib\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ezlib\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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) to Native Client for gradual up-streaming. It is still in early stages of development and is intended to be modeled after \u003c/span\u003e\u003ca href\u003d\"http://www.macports.org/\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eMacports\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNaCl started as a downloadable NPAPI plugin for multiple browsers, including Firefox, Safari, Opera and Chrome and was designed to transparently load and run other NPAPI plugins compiled as nexes and embedded into the page as a source file of an \u003c/span\u003e\u003ca href\u003d\"https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Basics#Using_HTML_to_Display_Plug-ins\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eplugin element\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 with “application/x-nacl-srpc” type.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNaCl includes a \"service runtime\" subsystem that provides a reduced system call interface and resource abstractions to isolate nexes from the host. It provides a \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Posix\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ePOSIX\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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-like environment for nexe execution and is used by nexes to communicate with each other and the browser. The nexes are run using a loader program, sel_ldr (secure \u003c/span\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Executable_and_Linkable_Format\" style\u003d\"font-family:Times New Roman;font-size:medium\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eELF\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 loader), which is launched as a separate process. The sel_ldr process communicates with the NaCl plugin via \u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;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\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:3e5ac6935bee42c7\" class\u003d\"disabled\"\u003eSRPC\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:10pt;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 over IMC [citation needed].\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNaCl was \u003c/span\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:5902ff6fd05c29c6\" style\u003d\"font-family:Times New Roman;font-size:medium\" class\u003d\"disabled\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eintegrated\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:10pt;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 into Chrome 5 as an in-process Pepper plugin. The NaCl modules that it runs can utilize the Pepper API for browser interaction. Part of the integration was to add special support to Chrome to allow sandboxed plugins to launch the sel_ldr process. NaCl can be enabled in Chro\u003c/span\u003e\u003cfont size\u003d\"2\"\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\"\u003eme 5 and later with the \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;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--enable-nacl\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 command-line flag at browser start-up by developers who want to develop Native Client modules. From Chrome 14 and onwards Native Client is on by default and can be used in \u003ca href\u003d\"https://chrome.google.com/webstore\"\u003eChrome Web Store\u003c/a\u003e apps. \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003eFor development purposes Native Client is also available to \u003ca href\u003d\"http://code.google.com/chrome/extensions/getstarted.html\"\u003eunpacked extensions\u003c/a\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap\"\u003e. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOnce we launch Portable Native Client (PNaCl) (\u003ca href\u003d\"http://nativeclient.googlecode.com/svn/data/site/pnacl.pdf\"\u003ePDF\u003c/a\u003e), \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003ewe plan to enable Native Client for web pages in general (i.e., not limited to Chrome Web Store apps).\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003ch3 style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Trusted-vs-Untrusted\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eTrusted vs Untrusted\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eIn the presence of a sandbox environment, trusted code runs outside of the sandbox and can perform privileged operations while untrusted code is prohibited from doing so by the enclosing sandbox, which isolates potentially misbehaving or malicious software from the rest of the system.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eWithin the scope of Native Client, whether code is untrusted or trusted depends on whether it will run inside of a NaCl sandbox (regardless of any outer sandbox). The code that implements the sandbox abstraction is trusted. The code that the sandbox hosts is untrusted. Untrusted code is built using NaCl SDK or any other compiler that outputs binaries that honor alignment and instruction restrictions and can be validated by NaCl. NaCl will statically verify that nexes do not attempt privileged operations and therefore do not need to be trusted.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eTo summarize, the traditional NPAPI plugins running out of process and outside of any sandbox are considered trusted. The in process Pepper plugins running within the Chrome sandbox are trusted with respect to NaCl. And the out of process plugins (that must run inside Native Client) are untrusted. NaCl's sel_ldr process is trusted and can do Chrome sandbox system calls on behalf of the untrusted nexes running within it.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent;font-family:Times New Roman;font-size:medium\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Diagram\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eDiagram\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent;font-family:Times New Roman;font-size:medium\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin:0px;background-color:transparent;font-family:Times New Roman;font-size:medium\"\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/getting-started/getting-started-background-and-basics/nacl_diagram.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1278971287192/nativeclient/getting-started/getting-started-background-and-basics/nacl_diagram.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;background-color:transparent\"\u003e\u003cbr /\u003e\u003ch3 style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Related-Documentation\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eRelated Documentation\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eChrome\u003c/span\u003e\u003cbr /\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/multi-process-architecture\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://www.chromium.org/developers/design-documents/multi-process-architecture\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/inter-process-communication\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://www.chromium.org/developers/design-documents/inter-process-communication\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://www.chromium.org/developers/design-documents/plugin-architecture\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://www.chromium.org/developers/design-documents/plugin-architecture\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/npapi.html\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://code.google.com/chrome/extensions/npapi.html\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ePlugins\u003c/span\u003e\u003cbr /\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://developer.mozilla.org/en/Plugins\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttps://developer.mozilla.org/en/Plugins\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttps://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Scripting_plugins\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Basics\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttps://developer.mozilla.org/en/Gecko_Plugin_API_Reference/Plug-in_Basics\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://wiki.mozilla.org/NPAPI\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttps://wiki.mozilla.org/NPAPI\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://wiki.mozilla.org/NPAPI:Pepper\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttps://wiki.mozilla.org/NPAPI:Pepper\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eNaCl\u003c/span\u003e\u003cbr /\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://code.google.com/p/nativeclient/wiki/Papers\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://code.google.com/p/nativeclient/wiki/Papers\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://code.google.com/p/nativeclient/\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://code.google.com/p/nativeclient/\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cu\u003e\u003ca href\u003d\"http://GoNaCl.com\" rel\u003d\"nofollow\"\u003ehttp://GoNaCl.com\u003c/a\u003e\u003c/u\u003e\u003c/span\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"http://code.google.com/p/naclports/\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://code.google.com/p/naclports/\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:3e5ac6935bee42c7\" class\u003d\"disabled\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://sites.google.com/a/chromium.org/dev/nativeclient/simple-rpc\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:5902ff6fd05c29c6\" class\u003d\"disabled\"\u003eNative Client integration with Chrome\u003c/a\u003e\u003c/span\u003e\u003c/p\u003e\u003ch3 style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Articles-and-Blog-Posts\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eArticles and Blog Posts\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003ci\u003eImportant: this section is kept for historic purposes, but is no longer being updated. For news and announcements see the SDK site at \u003ca href\u003d\"http://GoNaCl.com\" rel\u003d\"nofollow\"\u003eGoNaCl.com\u003c/a\u003e and the \u003ca href\u003d\"https://groups.google.com/group/native-client-announce\"\u003eannouncements list\u003c/a\u003e.\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eGoogle\u003c/span\u003e\u003cbr /\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003e12/08 \u003c/span\u003e\u003ca href\u003d\"http://googlecode.blogspot.com/2008/12/native-client-technology-for-running.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://googlecode.blogspot.com/2008/12/native-client-technology-for-running.html\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003e12/08 \u003c/span\u003e\u003ca href\u003d\"http://googleonlinesecurity.blogspot.com/2008/12/native-client-technology-for-running.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://googleonlinesecurity.blogspot.com/2008/12/native-client-technology-for-running.html\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003eOther\u003c/span\u003e\u003cbr /\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003e01/09 \u003c/span\u003e\u003ca href\u003d\"http://blog.taragana.com/index.php/archive/google-native-client-a-detailed-discussion/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://blog.taragana.com/index.php/archive/google-native-client-a-detailed-discussion/\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003e06/09 \u003c/span\u003e\u003ca href\u003d\"http://lwn.net/Articles/335974/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://lwn.net/Articles/335974/\u003c/span\u003e\u003c/a\u003e\u003ca href\u003d\"http://news.cnet.com/8301-30685_3-20003527-264.html\" rel\u003d\"nofollow\" /\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003e03/10 \u003c/span\u003e\u003ca href\u003d\"http://arstechnica.com/web/news/2010/03/google-bakes-flash-into-chrome-hopes-to-improve-plugin-api.ars\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003ehttp://arstechnica.com/.../google-bakes-flash-into-chrome-hopes-to-improve-plugin-api.ars\u003c/span\u003e\u003c/a\u003e\u003c/p\u003e\u003cp style\u003d\"font-family:Times New Roman;font-size:medium;margin-left:36pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-size:10pt;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\"\u003e04/10 \u003c/span\u003e\u003ca href\u003d\"http://news.cnet.com/8301-30685_3-20003527-264.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:10pt;font-family:Arial;color:rgb(92,69,32);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://news.cnet.com/8301-30685_3-20003527-264.html\u003c/span\u003e\u003c/a\u003e\u003ca href\u003d\"http://arstechnica.com/web/news/2010/03/google-bakes-flash-into-chrome-hopes-to-improve-plugin-api.ars\" rel\u003d\"nofollow\" /\u003e\u003c/p\u003e\u003cfont face\u003d\"'Times New Roman'\" size\u003d\"3\"\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/2410314280940662399"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/getting-started/getting-started-background-and-basics"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2951986558878479788"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2951986558878479788"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2951986558878479788"}],"author":[{}],"sites$pageName":{"$t":"getting-started-background-and-basics"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1562726692226623327"},"published":{"$t":"2012-03-22T02:48:08.016Z"},"updated":{"$t":"2012-03-22T02:48:08.023Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-22T02:48:08.016Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromeSiteIsolationProject-siteinstances.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1562726692226623327"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4179418459408669564"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation/ChromeSiteIsolationProject-siteinstances.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1562726692226623327"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1562726692226623327"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1562726692226623327"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1562726692226623327"}],"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/654725243212757979"},"published":{"$t":"2012-03-22T02:45:54.600Z"},"updated":{"$t":"2012-03-22T02:45:54.611Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-22T02:45:54.600Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromeSiteIsolationProject-arch.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/654725243212757979"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4179418459408669564"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/site-isolation/ChromeSiteIsolationProject-arch.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/654725243212757979"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/654725243212757979"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/654725243212757979"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/654725243212757979"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7593050338124497051"},"published":{"$t":"2012-03-07T15:50:14.854Z"},"updated":{"$t":"2012-03-20T02:16:01.377Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-20T02:16:00.635Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"USB 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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:bold;white-space:pre-wrap\"\u003eProposal Date\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eMarch 7th, 2012\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho is the primary contact for this API?\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003egdk@chromium.org\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"font-family:Verdana,sans-serif;font-weight:bold;margin-right:12pt;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eApps Extension API Team\u003c/span\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe USB API aims to provide access to fundamental low-level USB operations from within the context of an extension.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e- Devices which require third-party drivers to function in ChromeOS are currently unusable. One of the use cases for this API would be to provide the ability for a Chrome extension to function as a device driver and allow previously unusable devices to be used under ChromeOS.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003e- Conversely, this would also allow device driver implementors to be able to quickly deploy new driver versions to applications which are written within Chrome that make use of USB functionality, instead of depending on writing platform-dependent code.\u003cbr /\u003e\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you know anyone else, internal or external, that is also interested in this API?\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eNot yet.\u003ci\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eMaybe. This API has the potential to be very controversial, and I believe there are people within the standards organization that would not back it.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eThe API should remain fairly stable, as the fundamental mechanism for interacting with USB devices is standardized and does not change. This API will surface the underlying USB mechanisms for communication, and so itself should not need to change.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eList every UI surface belonging to or potentially affected by your API:\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- The extension installation dialog box (potentially). There should be a mechanism for informing users about the kinds of USB devices that an extension wishes to access, and this information should be surfaced.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- This API could be used (without per-extension VID/PID lockdown) to map the devices attached to a computer, thereby gaining knowledge outside of the scope of the extension.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e- This API could be used to cause physical devices to damage themselves or their surroundings. I've yet to see a printer catch fire due to software commands, but I would not rule the possibility out, for example.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e1) Use a USB-attached device to cause physical harm.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e2) Cause permanent harm to a USB device.\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e3) TODO.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eAlright Doctor, one last challenge:  \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eYes. There are circumstances where a USB device could be put into a bad state (or frozen entirely!) that may be impossible to restore to a pristine state without physically reconnecting the device. The attached devices could also, for example, themselves leave a physical trace. A printer driver could print a page, a CD writer could write a disc, a robot karate arm could break a table, etc.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eBy writing code that used libusb and then surfacing some form of WebSocket interface that would allow a client to communicate with my device-specific server.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ch2 style\u003d\"margin-bottom:0px;font-size:17px;margin-top:2em;margin-right:0px;padding-top:1px;padding-right:3px;padding-bottom:1px;padding-left:3px;border-top-width:1px;border-top-style:solid;border-top-color:rgb(0,153,0);background-color:rgb(220,246,219);font-family:Helvetica,Arial,sans-serif;white-space:normal\"\u003e\u003ca name\u003d\"TOC-API-reference:-chrome.experimental.usb\" /\u003eAPI reference: chrome.experimental.usb\u003c/h2\u003e\u003cdiv style\u003d\"font-family:Helvetica,Arial,sans-serif;font-weight:normal;white-space:normal;font-size:small\"\u003e\u003ca name\u003d\"global-methods\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch3 style\u003d\"margin-bottom:0px;font-size:17px;margin-top:1.5em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Methods\" /\u003eMethods\u003c/h3\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-bulkTransfer\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-bulkTransfer\" /\u003ebulkTransfer\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.bulkTransfer\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edevice\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edirection\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e,\u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003eendpoint\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edata\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(125,125,125)\"\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003efunction\u003c/span\u003e \u003cvar\u003e\u003cspan\u003ecallback\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003ePerforms a USB bulk transfer to the specified device.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edevice\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA device handle on which the transfer is to be made.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edirection\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe direction of the control transfer. \"in\" for an inbound transfer, \"out\" for an outbound transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eendpoint\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe endpoint to which this transfer is being made.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edata\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e(TODO(gdk): ArrayBuffer) The bulk data payload for this transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003ecallback\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e \u003cspan\u003e\u003cspan\u003e\u003cspan\u003efunction\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA callback to be invoked with the results of this transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Callback-function\" /\u003eCallback function\u003c/h4\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eIf you specify the \u003cem\u003ecallback\u003c/em\u003e parameter, it should specify a function that looks like this:\u003c/p\u003e\u003cpre style\u003d\"color:rgb(0,112,0);font-size:9pt;background-color:rgb(250,250,250);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(187,187,187);border-right-color:rgb(187,187,187);border-bottom-color:rgb(187,187,187);border-left-color:rgb(187,187,187);margin-bottom:0px;padding-top:0.99em;padding-right:0.99em;padding-bottom:0.99em;padding-left:0.99em;overflow-x:auto;overflow-y:auto;word-wrap:break-word\"\u003efunction(\u003cspan\u003eobject result\u003c/span\u003e) \u003cspan\u003e{...}\u003c/span\u003e;\u003c/pre\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003eobject\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edata\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e(TODO(gdk): ArrayBuffer) If the transfer results in inbound data, it is returned here.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eOn success, 0 is returned. On failure, -1.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-closeDevice\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-closeDevice\" /\u003ecloseDevice\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.closeDevice\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edevice\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(125,125,125)\"\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003eundefined\u003c/span\u003e \u003cvar\u003e\u003cspan\u003ecallback\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eClose a USB device handle.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters1\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edevice\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe device handle to be closed.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003ecallback\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e function\u003cspan\u003e\u003cspan\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA callback function that is invoked after the device has been closed.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-controlTransfer\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-controlTransfer\" /\u003econtrolTransfer\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.controlTransfer\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edevice\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edirection\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003erecipient\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003etype\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e,\u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003erequest\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003evalue\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003eindex\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edata\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(125,125,125)\"\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003efunction\u003c/span\u003e \u003cvar\u003e\u003cspan\u003ecallback\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003ePerforms a USB control transfer to the specified device.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters2\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edevice\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA device handle on which the transfer is to be made.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edirection\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe direction of the control transfer. \"in\" for an inbound transfer, \"out\" for an outbound transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003erecipient\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe intended recipient of this message. Must be one of \"device\", \"interface\", \"endpoint\" or \"other\".\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003etype\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe type of this request. Must be one of \"standard\", \"class\", \"vendor\" or \"reserved\".\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003erequest\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003evalue\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eindex\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edata\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e(TODO(gdk): ArrayBuffer) The data payload carried by this transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003ecallback\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e \u003cspan\u003e\u003cspan\u003e\u003cspan\u003efunction\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eAn optional callback that is invoked when this transfer completes.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Callback-function1\" /\u003eCallback function\u003c/h4\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eIf you specify the \u003cem\u003ecallback\u003c/em\u003e parameter, it should specify a function that looks like this:\u003c/p\u003e\u003cpre style\u003d\"color:rgb(0,112,0);font-size:9pt;background-color:rgb(250,250,250);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(187,187,187);border-right-color:rgb(187,187,187);border-bottom-color:rgb(187,187,187);border-left-color:rgb(187,187,187);margin-bottom:0px;padding-top:0.99em;padding-right:0.99em;padding-bottom:0.99em;padding-left:0.99em;overflow-x:auto;overflow-y:auto;word-wrap:break-word\"\u003efunction(\u003cspan\u003eobject result\u003c/span\u003e) \u003cspan\u003e{...}\u003c/span\u003e;\u003c/pre\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003eobject\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edata\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e(TODO(gdk): ArrayBuffer) If the transfer is inbound, then this field is populated with the data transferred from the device.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eOn success, 0 is returned. On failure, -1.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-createContext\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-createContext\" /\u003ecreateContext\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.createContext\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003efunction\u003c/span\u003e \u003cvar\u003e\u003cspan\u003ecallback\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eCreates a USB context by which devices may be found.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters3\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003ecallback\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003efunction\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Callback-function2\" /\u003eCallback function\u003c/h4\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eThe callback \u003cem\u003eparameter\u003c/em\u003e should specify a function that looks like this:\u003c/p\u003e\u003cpre style\u003d\"color:rgb(0,112,0);font-size:9pt;background-color:rgb(250,250,250);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(187,187,187);border-right-color:rgb(187,187,187);border-bottom-color:rgb(187,187,187);border-left-color:rgb(187,187,187);margin-bottom:0px;padding-top:0.99em;padding-right:0.99em;padding-bottom:0.99em;padding-left:0.99em;overflow-x:auto;overflow-y:auto;word-wrap:break-word\"\u003efunction(\u003cspan\u003einteger result\u003c/span\u003e) \u003cspan\u003e{...}\u003c/span\u003e;\u003c/pre\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe handle to the created context. On failure, -1.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-destroyContext\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-destroyContext\" /\u003edestroyContext\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.destroyContext\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003econtext\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eDisposes of a context that is no longer needed. It is not necessary that this call be made at all, unless you want to explicitly free the resources associated with a context.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters4\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003econtext\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-findDevice\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-findDevice\" /\u003efindDevice\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.findDevice\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003econtext\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003evendorId\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003eproductId\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003efunction\u003c/span\u003e \u003cvar\u003e\u003cspan\u003ecallback\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eLocates an instance of the device specified by its vendor and product identifier.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters5\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003econtext\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA handle to a USB context.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003evendorId\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe vendor ID of the device to search for.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eproductId\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe product ID of the device to search for.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003ecallback\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003efunction\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Callback-function3\" /\u003eCallback function\u003c/h4\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eThe callback \u003cem\u003eparameter\u003c/em\u003e should specify a function that looks like this:\u003c/p\u003e\u003cpre style\u003d\"color:rgb(0,112,0);font-size:9pt;background-color:rgb(250,250,250);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(187,187,187);border-right-color:rgb(187,187,187);border-bottom-color:rgb(187,187,187);border-left-color:rgb(187,187,187);margin-bottom:0px;padding-top:0.99em;padding-right:0.99em;padding-bottom:0.99em;padding-left:0.99em;overflow-x:auto;overflow-y:auto;word-wrap:break-word\"\u003efunction(\u003cspan\u003einteger result\u003c/span\u003e) \u003cspan\u003e{...}\u003c/span\u003e;\u003c/pre\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eOn success, the handle to the found USB device. On failure, -1.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-bottom:2em\"\u003e\u003ca name\u003d\"method-interruptTransfer\" style\u003d\"color:rgb(0,0,204)\" /\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-interruptTransfer\" /\u003einterruptTransfer\u003c/h4\u003e\u003cdiv style\u003d\"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(147,180,217);border-right-color:rgb(147,180,217);border-bottom-color:rgb(147,180,217);border-left-color:rgb(147,180,217);font-family:Courier New,courier,monospace;padding-top:0.5em;padding-right:0.5em;padding-bottom:0.5em;padding-left:2em;background-color:rgb(202,222,244);margin-top:1em\"\u003e\u003cspan\u003echrome.experimental.usb.interruptTransfer\u003c/span\u003e(\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edevice\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edirection\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003einteger\u003c/span\u003e \u003cvar\u003e\u003cspan\u003eendpoint\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan\u003e\u003cspan\u003e, \u003c/span\u003e\u003cspan\u003estring\u003c/span\u003e \u003cvar\u003e\u003cspan\u003edata\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(125,125,125)\"\u003e\u003cspan\u003e,\u003c/span\u003e\u003cspan\u003efunction\u003c/span\u003e \u003cvar\u003e\u003cspan\u003ecallback\u003c/span\u003e\u003c/var\u003e\u003c/span\u003e)\u003c/div\u003e\u003cdiv style\u003d\"margin-left:2em\"\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003ePerforms a USB interrupt transfer to the specified device.\u003c/p\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Parameters6\" /\u003eParameters\u003c/h4\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edevice\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA device handle on which the transfer is to be made.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edirection\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe direction of the control transfer. \"in\" for an inbound transfer, \"out\" for an outbound transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eendpoint\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe endpoint to which this transfer is being made.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edata\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e(TODO(gdk): ArrayBuffer) The interrupt data payload for this transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003ecallback\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e \u003cspan\u003e\u003cspan\u003e\u003cspan\u003efunction\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eA callback to be invoked with the results of this transfer.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\" /\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4 style\u003d\"margin-bottom:0px;font-size:14px;margin-top:0.7em;margin-right:0px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-Callback-function4\" /\u003eCallback function\u003c/h4\u003e\u003cp style\u003d\"margin-top:1em;margin-right:0px;margin-bottom:0px;margin-left:0px;line-height:16px\"\u003eIf you specify the \u003cem\u003ecallback\u003c/em\u003e parameter, it should specify a function that looks like this:\u003c/p\u003e\u003cpre style\u003d\"color:rgb(0,112,0);font-size:9pt;background-color:rgb(250,250,250);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(187,187,187);border-right-color:rgb(187,187,187);border-bottom-color:rgb(187,187,187);border-left-color:rgb(187,187,187);margin-bottom:0px;padding-top:0.99em;padding-right:0.99em;padding-bottom:0.99em;padding-left:0.99em;overflow-x:auto;overflow-y:auto;word-wrap:break-word\"\u003efunction(\u003cspan\u003eobject result\u003c/span\u003e) \u003cspan\u003e{...}\u003c/span\u003e;\u003c/pre\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;line-height:16px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003eobject\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdl style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003edata\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan style\u003d\"color:rgb(125,125,125)\"\u003eoptional\u003c/span\u003e \u003cspan\u003e\u003cspan\u003e\u003cspan\u003estring\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e(TODO(gdk): ArrayBuffer) If the transfer results in inbound data, it is returned here.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdt style\u003d\"font-weight:bold;margin-top:0.75em;margin-right:0px;margin-bottom:0px;margin-left:0px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cvar\u003eresult\u003c/var\u003e \u003cem\u003e\u003cdiv style\u003d\"display:inline\"\u003e( \u003cspan\u003e\u003cspan\u003e\u003cspan\u003einteger\u003c/span\u003e \u003c/span\u003e\u003c/span\u003e)\u003c/div\u003e\u003c/em\u003e\u003c/dt\u003e\u003cdd style\u003d\"margin-top:0.4em;margin-right:0px;margin-bottom:0.75em;margin-left:2em;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eOn success, 0 is returned. On failure, -1.\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/dd\u003e\u003c/div\u003e\u003c/div\u003e\u003c/dl\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-weight:bold;font-family:Arial;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eNote any unanswered questions that require further discussion.\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/usb-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7593050338124497051"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/4"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7593050338124497051"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7593050338124497051"}],"author":[{"name":{"$t":"Garret Kelly"},"email":{"$t":"gdk@chromium.org"}}],"sites$pageName":{"$t":"usb-api"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5077298636011219464"},"published":{"$t":"2008-08-29T05:02:51.165Z"},"updated":{"$t":"2012-03-19T18:17:02.990Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-19T18:17:02.052Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"views"},"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 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\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\u003ch3\u003e\u003ca name\u003d\"TOC-Overview-and-background\" /\u003e\u003cspan style\u003d\"font-size:22px\"\u003eO\u003c/span\u003everview and background\u003c/h3\u003e\r\n\u003cp\u003e\r\nWindows \u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eprovides very primitive tools for building user interfaces. The\r\nsystem provides a few basic controls and native window containers, but\r\nbuilding a custom user interface is difficult. Since we desired a\r\ndifferentiated aesthetic for Chromium, we have had to build a framework\r\non Windows to accelerate our development of custom UI. This system is\r\ncalled \u003cspan style\u003d\"font-weight:bold\"\u003eviews\u003c/span\u003e. \u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eviews\u003c/span\u003e is a rendering system not unlike that used in WebKit\r\nor Gecko to render web pages. The user interface is constructed of a\r\ntree of components called \u003cspan style\u003d\"font-style:italic\"\u003eViews\u003c/span\u003e. These Views are responsible for\r\nrendering, layout, and event handling. Each View in the tree represents\r\na different component of the UI. An analog is the hierarchical\r\nstructure of an \u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003eHTML document.\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003eAt the root of a View hierarchy is a \u003c/span\u003e\u003cspan style\u003d\"background:rgb(255,255,255) none repeat scroll 0% 0%;color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eWidget\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003e,\r\nwhich is a native window. The native window receives messages from\r\nWindows, converts them into something the View hierarchy can\r\nunderstand, and then passes them to the \u003c/span\u003e\u003cspan style\u003d\"background:rgb(255,255,255) none repeat scroll 0% 0%;color:rgb(0,0,0)\"\u003eRootView\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003e. The \u003c/span\u003e\u003cspan style\u003d\"background:rgb(255,255,255) none repeat scroll 0% 0%;color:rgb(0,0,0)\"\u003eRootView\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003e\r\nthen begins propagation of the event into the View hierarchy.\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003ePainting\r\nand layout are done in a similar way. A View in the View tree has its\r\nown bounds (often imbued upon it by its containing View's Layout\r\nmethod), and so when it is asked to Paint, it paints into a canvas\r\nclipped to its bounds, with the origin of rendering translated to the\r\nView's top left. Rendering for the entire View tree is done into a\r\nsingle canvas set up and owned by the \u003c/span\u003e\u003cspan style\u003d\"background:rgb(255,255,255) none repeat scroll 0% 0%;color:rgb(0,0,0)\"\u003eWidget\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003e when it receives a Paint message. Rendering itself is done using a\r\ncombination of Skia and GDI calls — GDI for text and Skia for\r\neverything else.\u003c/span\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255)\"\u003eSeveral UI controls in Chromium's UI are not rendered using Views, however. Rather, they are native Windows controls hosted within a\r\nspecial kind of View that knows how to display and size a native\r\nwidget. These are used for buttons, tables, radio buttons, checkboxes,\r\ntext fields, and other such controls. Since they use native controls,\r\nthese Views are also not especially portable, except perhaps in API.\u003c/p\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003eBarring platform-specific rendering code, code that sizes\r\nthings based on system metrics, and so on, the rest of the View system is not\r\nespecially \u003cspan style\u003d\"font-style:italic\"\u003eun\u003c/span\u003eportable, since most rendering is done using the cross-platform Skia library. For historical reasons, many of View's functions\r\ntake Windows or ATL types, but we have since augmented ui/gfx/ with\r\nmany platform independent types that we can eventually replace these\r\nwith.\u003c/p\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Code-Location-and-Info\" /\u003eCode Location and Info\u003c/h3\u003e\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003eThe base set of classes and interfaces provided by views can be found in the src/ui/views/ directory. All base views classes are in the \"\u003cspan style\u003d\"font-weight:bold\"\u003eviews\u003c/span\u003e\" namespace.\u003c/p\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Common-Widgets\" /\u003eCommon Widgets\u003c/h3\u003e\u003cdiv\u003eIn the views framework:\u003c/div\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003c/p\u003e\r\n\u003cul style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003cli\u003e \u003cb\u003eWidgetWin\u003c/b\u003e: The base class for all \u003cspan style\u003d\"color:rgb(0,0,0)\"\u003eWidgets\u003c/span\u003e in views.\r\nProvides a basic child window control implementation. Subclass this\r\ndirectly if you are not making a top-level window or dialog.\r\n\u003c/li\u003e\r\n\u003cli\u003e \u003cb\u003eWindow\u003c/b\u003e: A top-level window. A subclass of WidgetWin.\u003c/li\u003e\r\n\u003c/ul\u003eFor more information on building dialog boxes and other windowed UI using Window, CustomFrameWindow, etc, read \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/views-windowing\"\u003eviews Windowing\u003c/a\u003e.\u003cbr /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn the Chromium browser front end:\u003c/div\u003e\u003cul style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eBrowserFrame: \u003c/span\u003eA subclass of Window that provides additional message processing for the Browser window in Chrome. See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/browser-window\"\u003eBrowser Window\u003c/a\u003e.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eConstrainedWindowImpl\u003c/span\u003e: A subclass of Window that provides the frame for constrained dialogs such as the HTTP basic auth prompt.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Other_Approaches\"\u003eOther approaches\u003c/a\u003e\u003c/h3\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\nAt the start of the project, we began building the Chromium browser using\r\nnative windows and the owner-draw approach used in many Windows\r\napplications. This proved to be unsatisfactory, since native windows\r\ndon't support transparency natively, and handling events requires tedious window subclassing. Some early UI elements gravitated\r\ntowards custom painting and event handling (e.g. Autocomplete), but this was very ad-hoc\r\nbased on the circumstance.\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003eExisting UI toolkits for Windows are similarly unsatisfying,\r\nwith limited widget sets, unnatural aesthetics, or awkward programming\r\nmodels.\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"Limitations_Issues\"\u003eLimitations/issues\u003c/a\u003e\u003c/h3\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\nBy and large, views makes it relatively easy to build complex custom UIs. However it has a few rough edges that can be improved over time:\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003c/p\u003e\r\n\u003cul style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003cli\u003eThe Event types currently are occasionally problematic - they crack the native windows message parameters and then discard them. Sometimes this information is useful.\u003c/li\u003e\r\n\u003cli\u003e Some ad-hoc message processing.\u003c/li\u003e\r\n\u003cli\u003e Mix of native controls that don't work properly until inserted into a View hierarchy attached to a \u003cspan style\u003d\"color:rgb(0,0,0)\"\u003eWidget\u003c/span\u003e\r\nwith a valid HWND. Many of our native controls have API methods that\r\nrequire them to exist within a window hierarchy. This means that they\r\ncannot be fully initialized until they are inserted. The View API will eventually be improved to make this clearer (\u003ca href\u003d\"http://crbug.com/5191\"\u003ebug 5191\u003c/a\u003e). \u003c/li\u003e\u003cli\u003eThe base Widget interface itself is somewhat frozen in time. Some improvement and consolidation would be worthwhile.\u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chromeviews"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5077298636011219464"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5077298636011219464"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5077298636011219464"}],"author":[{"name":{"$t":"Kathy Walrath"},"email":{"$t":"kathyw@google.com"}}],"sites$pageName":{"$t":"chromeviews"},"sites$revision":{"$t":"6"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4356969052125784911"},"published":{"$t":"2012-03-09T18:33:49.692Z"},"updated":{"$t":"2012-03-15T17:30:00.283Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-15T17:29:59.021Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Meet the Web Platform Companion 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\u003cspan\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"font-weight:bold\"\u003e\u003ca name\u003d\"TOC-Last-updated-3-13-12\" /\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLast updated 3/13/12\u003c/span\u003e\u003c/b\u003e\u003c/h1\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe web platform is composed of a large collection of interoperable standards that represent a solid foundation for building powerful apps. New standards are born on the cutting edge, where various organizations experiment with new capabilities. Those capabilities that capture the imagination of the broader community may eventually become a formal part of the web platform.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThe demos in the \u003ca href\u003d\"http://www.youtube.com/watch?v\u003d3i4dtgh3ym0\u0026amp;list\u003dPL0207724E1C9C22A6\u0026amp;feature\u003dplpp_play_all\" target\u003d\"_blank\"\u003eMeet the Web Platform videos\u003c/a\u003e show a few examples of some of the cool stuff you can do on the cutting edge of the web platform. Not all of these capabilities have been standardized yet, some only work in Chrome today, and some are still actively being implemented in Chrome. This guide serves as a companion to the videos, providing more context on each demo and the technology that powers them.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Building-on-Foundations\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBuilding on Foundations\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\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:425px;\"\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/3i4dtgh3ym0?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"425\" height\u003d\"355\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Web-Components\" /\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\"\u003eWeb Components\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e Shadow DOM, a core foundational piece of Web Components, is available in Chrome 19+ behind the Shadow DOM flag. Other bits will be implemented in the near future.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Active interest demonstrated by Microsoft and Mozilla\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: All specifications under Web Components umbrella are being developed in the \u003c/span\u003e\u003ca href\u003d\"http://www.w3.org/2008/webapps/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eW3C WebApps Working Group\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA comprehensive \u003c/span\u003e\u003ca href\u003d\"http://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eintroduction to Web components\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eA readable introduction to \u003c/span\u003e\u003ca href\u003d\"http://glazkov.com/2011/01/14/what-the-heck-is-shadow-dom/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eShadow DOM\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFollow the \u003c/span\u003e\u003ca href\u003d\"https://plus.google.com/u/1/103330502635338602217/posts\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Components Google+ page\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to stay up to date\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eW3C Editor’s Draft of the \u003c/span\u003e\u003ca href\u003d\"http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eShadow DOM specification\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Blocks-are-easy-to-style-and-everything-is-a-block\" /\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\"\u003eBlocks are easy to style, and \u003c/span\u003e\u003cspan style\u003d\"font-size:16px;font-family:Arial;color:rgb(102,102,102);background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eeverything \u003c/span\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\"\u003eis a block\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: -webkit-filter is enabled in Chrome 19+. 3D CSS transformations has been enabled since M16. Video has been available for many releases.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: filter is not implemented in other browsers yet, but should be soon. 3D transformations are supported in most other browsers. Video support is available in all modern browsers\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: All features are standardized or being standardized\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://dvcs.w3.org/hg/FXTF/raw-file/tip/filters/index.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCSS Filters specification \u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://www.html5rocks.com/en/tutorials/video/basics/\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eHTML5 video\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://www.html5rocks.com/en/tutorials/3d/css/\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e3D transformations\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://2011.beercamp.com/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBeerCamp example\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Improved-layout-primitives\" /\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\"\u003eImproved layout primitives\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: The older version of the spec is supported, and the improved flexbox spec is being actively implemented in Chrome with basic support in Chrome 19.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Firefox, Safari, Chrome and Internet Explorer 10 implement the old flexbox spec; updated spec should be implemented soon in Chrome and other browsers.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Fully standardized\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eThe improved \u003c/span\u003e\u003ca href\u003d\"http://www.w3.org/TR/css3-flexbox/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eFlexbox specification\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://www.w3.org/TR/css3-layout/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGrid layout specification\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (another app layout CSS module that is being actively standardized)\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Debugging-on-mobile\" /\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\"\u003eDebugging on mobile\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Works in Chrome 18+\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: N/A\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: N/A\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://code.google.com/chrome/mobile/docs/debugging.html\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGuide to debugging Chrome for Android Beta\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-World-Class-Developer-Tools\" /\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\"\u003eWorld Class Developer Tools\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Fully implemented\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Other browsers have strong tools as well\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: N/A\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://code.google.com/chrome/devtools/\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview of dev tools\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Powerful-Text-Layout\" /\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\"\u003ePowerful Text Layout\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: A side build of WebKit from Adobe demonstrates CSS exclusions and regions. Work to land that functionality in WebKit is ongoing, but doesn't yet work in Chrome.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: No shipping browser supports it yet\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Actively undergoing standardization at W3C\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePlay around with \u003c/span\u003e\u003ca href\u003d\"http://labs.adobe.com/technologies/cssregions/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAdobe's WebKit build and examples\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://dev.w3.org/csswg/css3-exclusions/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCSS Exclusions specification\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://dev.w3.org/csswg/css3-regions/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCSS Regions specification\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (related to Exclusions but not featured in the video) \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Learning-from-Other-Platforms\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLearning from Other Platforms\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\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:425px;\"\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/mRd2SAL0vT4?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"425\" height\u003d\"355\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Push-notifications\" /\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\"\u003ePush notifications\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: push notifications for apps on the New Tab Page implemented but not yet available to developers. Notification center work underway.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Not yet, as this is part of the Chrome extension APIs\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Not standardized\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Payments\" /\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\"\u003ePayments\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Fully implemented\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: All modern browsers can use the payments API\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Not standardized\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"https://developers.google.com/in-app-payments/docs/samples\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePayments API reference\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"https://chrome.google.com/webstore/detail/oohphhdkahjlioohbalmicpokoefkgid\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eBastion\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Web-Intents\" /\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\"\u003eWeb Intents\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Initial functionality available in Chrome 19 for Chrome Web Store apps. \u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: No other browsers have implemented web intents yet.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Being standardized publicly at the W3C\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://webintents.org/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebIntents.org\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e overview\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://dvcs.w3.org/hg/web-intents/raw-file/tip/spec/Overview.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Intents Draft API\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Intents Task Force \u003c/span\u003e\u003ca href\u003d\"http://lists.w3.org/Archives/Public/public-web-intents/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003emailing list\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e at the W3C\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://www.imagemator.com/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eImagemator\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"https://chrome.google.com/webstore/detail/kpeiggegnjmcinljkdmjglpjopdjihff\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCloudFilePicker app\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e for getting to your Picasa images\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"https://chrome.google.com/webstore/detail/lkinojipklbmjkgmmpppmbhlhfpkhmed\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eMemeMator app\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e to edit a photo \u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-On-the-Cutting-Edge\" /\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eOn the Cutting Edge\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:19px;font-family:Arial;background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\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:425px;\"\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/PNzmXDa1JLA?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"425\" height\u003d\"355\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-WebCam\" /\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\"\u003eWebCam\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: implemented in Chrome 18+, requires enabling \"Enable MediaStream\" in about:flags. \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eNote\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e: as of this writing there are no security checks in place for access to webcam yet; do \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003enot \u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ebrowse untrusted sites with that flag enabled. Security UI will be landing in Chrome 19 for all platforms.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Implemented in Opera and being implemented in Firefox\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Actively being standardized\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px\"\u003e\u003ca href\u003d\"http://www.html5rocks.com/en/tutorials/getusermedia/intro/\"\u003eCAPTURING AUDIO \u0026amp; VIDEO IN HTML5\u003c/a\u003e  \u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003eat HTML5Rocks\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"http://webrtc.cloudfoundry.com/get_user_media\" rel\u003d\"nofollow\"\u003eMinimal code example\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"http://neave.com/webcam/html5/\" rel\u003d\"nofollow\"\u003eNeave HTML5 Photobooth App\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://dmv.nodejitsu.com/\" rel\u003d\"nofollow\"\u003eDMV photobooth app\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Web-Audio\" /\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\"\u003eWeb Audio\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Available in Chrome since version 14\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: No other browsers yet, although Firefox has a separate audio API\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: Being standardized at the W3C\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWeb Audio specification\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"http://www.html5rocks.com/en/tutorials/webaudio/intro/\"\u003eIntroductory tutorial to the Web Audio API\u003c/a\u003e \u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e at HTML5Rocks\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://www.html5rocks.com/tutorials/#webaudio\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eCollection of Web Audio articles\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e at HTML5Rocks\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://labs.dinahmoe.com/plink/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003ePlink\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e collaborative music-making app\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-WebGL\" /\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\"\u003eWebGL\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: fully implemented in all recent versions of Chrome\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: support in nearly all desktop browsers except for IE; Safari requires opt-in. Beginning to see support on mobile devices (Sony Experia, Opera Mobile)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: standardized at the Khronos group\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"http://www.html5rocks.com/en/tutorials/webgl/webgl_fundamentals/\"\u003eWebGL tutorial\u003c/a\u003e \u003c/span\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e at HTML5Rocks\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://madebyevan.com/webgl-water/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebGL water example scene\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://khronos.org/webgl/wiki\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eWebGL wiki\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-weight:bold;font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-NaCl-and-GamePad\" /\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\"\u003eNaCl and GamePad\u003c/span\u003e\u003c/h3\u003e\u003cul style\u003d\"font-weight:bold;font-family:Times;font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eImplementation status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: NaCl available for web store apps in Chrome 14+. GamePad API is in M19+ behind the \"Enable Gamepad\" flag in about:flags.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eCross-browser support\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: NaCl only works in Chrome. GamePad is not implemented in other browsers (but will be soon).\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eStandardization status\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e: NaCl is not standardized, but GamePad is being actively standardized.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:disc;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;font-weight:bold;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e:\u003c/span\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003ca href\u003d\"http://www.airme.ch/\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eAirMech \u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e(without GamePad support for the time being)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more about the \u003c/span\u003e\u003ca href\u003d\"https://wiki.mozilla.org/GamepadAPI\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eGamePad API\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e (\u003c/span\u003e\u003ca href\u003d\"http://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003espec\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003e)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;font-size:15px;font-family:Arial;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eLearn more about \u003c/span\u003e\u003ca href\u003d\"https://developers.google.com/native-client/\"\u003e\u003cspan style\u003d\"color:rgb(17,85,204);background-color:transparent;vertical-align:baseline;white-space:pre-wrap\"\u003eNative Client\u003c/span\u003e\u003c/a\u003e\u003c/li\u003e\u003c/ul\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/685187476307440333"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/meet-the-web-platform-companion"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4356969052125784911"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4356969052125784911"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4356969052125784911"}],"author":[{"name":{"$t":"Alex Komoroske"},"email":{"$t":"komoroske@chromium.org"}}],"sites$pageName":{"$t":"meet-the-web-platform-companion"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3446411534138844475"},"published":{"$t":"2012-03-12T18:16:06.235Z"},"updated":{"$t":"2012-03-12T18:17:51.479Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-12T18:17:50.902Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Aura and Shell dependencies"},"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 diagram below shows the dependencies of Chrome, Ash (Aura shell), views-based widgets, and the Aura windowing subsystem.  Note that in many but not all cases there are delegate interfaces each module can use to query the module above.\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/aura/aura-and-shell-dependencies/ChromeAshViewsAuradependencies.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1331576179915/developers/design-documents/aura/aura-and-shell-dependencies/ChromeAshViewsAuradependencies.png\" /\u003e\u003c/a\u003e\u003c/div\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-and-shell-dependencies"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3446411534138844475"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3446411534138844475"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3446411534138844475"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$pageName":{"$t":"aura-and-shell-dependencies"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8214582016377559146"},"published":{"$t":"2012-03-12T18:16:19.871Z"},"updated":{"$t":"2012-03-12T18:16:19.915Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-12T18:16:19.871Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromeAshViewsAuradependencies.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8214582016377559146"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3446411534138844475"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-and-shell-dependencies/ChromeAshViewsAuradependencies.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8214582016377559146"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8214582016377559146"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8214582016377559146"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8214582016377559146"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8929764337107639732"},"published":{"$t":"2011-12-07T05:21:19.813Z"},"updated":{"$t":"2012-03-12T18:14:04.156Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-12T18:14:03.424Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Client 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\"\u003eThe Aura Client API is an API Aura uses to communicate with the client application using the Aura system. Since Aura is very simple, providing just basic window and event types, there are many details it cannot know about directly. It delegates some functionality to its client (such as window stacking) and also provides the client API as a conduit for users of Aura to communicate with the embedding environment.\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eFor example, Aura does not implement tooltips directly, these are a feature implemented by an client application. The Client API has knowledge of tooltips however so that a system like Views (which depends on Aura) can specify tooltip parameters. The client application can interpret this data and show the relevant UI.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe Aura Window class supports opaque properties, and a list of well known keys is provided as part of the Client API.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIn the ChromeOS Desktop Window Manager, the Aura Client is a component known as the \"Aura Shell\" or \"Ash\":\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\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/client-api/ClientAPI.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1323235529337/developers/design-documents/aura/client-api/ClientAPI.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003eA breakdown of responsibility between Aura and the Aura Shell (as implemented for ChromeOS):\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003ctable\u003e\r\n\u003ctbody\u003e\u003ctr\u003e\r\n\u003ctd\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Aura\" /\u003eAura\u003c/h3\u003e\r\n\u003col\u003e\r\n\u003cli\u003eBasic window type and hierarchy\r\n\u003c/li\u003e\u003cli\u003eEvent dispatch\r\n\u003c/li\u003e\u003cli\u003eCompositor integration\r\n\u003c/li\u003e\u003cli\u003eClient API\r\n\u003c/li\u003e\u003c/ol\u003e\r\n\u003c/td\u003e\r\n\u003ctd\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Aura-Shell\" /\u003eAura Shell\u003c/h3\u003e\r\n\u003col\u003e\r\n\u003cli\u003e\"Window Manager\" features like:\r\n\u003col\u003e\r\n\u003cli\u003eWindow dragging and resizing\r\n\u003c/li\u003e\u003cli\u003eTransient and modal windows\r\n\u003c/li\u003e\u003cli\u003eMaximize/Restore/Full Screen\r\n\u003c/li\u003e\u003cli\u003eTooltips\r\n\u003c/li\u003e\u003cli\u003eDrag and drop\r\n\u003c/li\u003e\u003cli\u003eWindow embellishments like shadows\r\n\u003c/li\u003e\u003cli\u003eWindow stacking\r\n\u003c/li\u003e\u003cli\u003eAdvanced layout heuristics\r\n\u003c/li\u003e\u003c/ol\u003e \r\n\u003c/li\u003e\u003cli\u003eShell features like:\r\n\u003col\u003e\r\n\u003cli\u003eApplication launcher(s)\r\n\u003c/li\u003e\u003cli\u003eCustomizable desktop background\r\n\u003c/li\u003e\u003cli\u003eGlobal keyboard shortcuts\r\n\u003c/li\u003e\u003cli\u003eLogin/lock screens, screen savers, etc.\r\n\u003c/li\u003e\u003c/ol\u003e\r\n\u003c/li\u003e\u003c/ol\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\u003c/table\u003eThe Aura Shell implements the Aura Client API, and uses Aura and Views to achieve all of this.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIn the diagram above, I show a second Aura Client API implementation. This is what we will end up with when we transition Desktop Chrome on Windows to use the Aura system, sometime in 2012. This will allow us to hardware accelerate our UI.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWith this in mind, it is important to keep the Aura layer of the framework clean and simple, since much of the ChromeOS DWM functionality and feature set is not relevant to desktop Chrome, just the basic windowing primitives.\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/client-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8929764337107639732"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8929764337107639732"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8929764337107639732"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"client-api"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3127549254189961157"},"published":{"$t":"2012-03-12T13:03:52.348Z"},"updated":{"$t":"2012-03-12T13:04:43.227Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-12T13:04:42.475Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Privacy-relevant Preferences 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\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:left;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eOverview\u003c/span\u003e\u003c/b\u003e\u003c/p\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium includes a variety of features that provide valuable services to users either by making requests on their behalf (DNS Prefetching, for example), or by sending non-personal information to third-parties (Omnibox suggestions, for example). While we firmly believe that these services offer a huge net benefit, we also want to fully support users who choose not to take part. Users can opt-out (or opt-in, depending) to each, either via \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,153);font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://flags\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,153);font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://settings\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e; extensions should have programmatic access to these preferences to offer choices to users in forms that Chromium chooses not to.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eEvery feature that’s listed in the\u003c/span\u003e\u003ca href\u003d\"http://static.googleusercontent.com/external_content/untrusted_dlcp/www.google.com/en/us/intl/en/landing/chrome/google-chrome-privacy-whitepaper.pdf\" style\u003d\"font-size:medium\"\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,0);font-weight:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,153);font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eprivacy whitepaper\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e is relevant to extensions that want to offer privacy protections for users above and beyond what is reasonable for Chromium to offer as a default to everyone. Extensions like Tor have expressed interest in programmatically disabling DNS prefetching (and prerendering, et al.), and it would be valuable for everyone concerned if respected advocates such as the EFF could build “EFF-approved“ default settings that users could choose to install via an extension.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eRelatedly, but closer to home, reworking the whitepaper itself into an application from which users could directly toggle preferences without digging through preferences pages would be valuable.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThese preferences don’t relate to anything like the web platform’s storage options, but instead how Chromium interprets, requests, and processes content on the web. These options are clearly Chromium-specific, and not generally applicable to specific websites (nor would we \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003ewant\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e to offer any website the ability to, for example, toggle UMA settings).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThese preferences map fairly directly to the services and features the browser offers, which means that the API would only shift in relation to changes in browser-functionality. As it is by necessity browser-specific, that seems reasonable in terms of stability.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat UI does this API expose?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eNone. The preferences are already exposed via \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,153);font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://settings\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;color:rgb(0,0,153);font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://flags\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e, this proposal simply adds a programmatic interface.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eMalicious extensions could send Omnibox keystrokes and other such data to a third-party server by tricking the user into changing her default search engine, and toggling the relevant preferences for Suggest. Likewise, they could force loading of arbitrary sites by doing the same, and enabling Instant.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eIndividual users would be pointed to the various bits of UI where these settings exist (preferences and flags), and asked to toggle settings manually. This is, for example, what the Chrome privacy whitepaper does right now.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eAre you willing and able to develop and maintain this API?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eYes.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eTODO.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eThis API could be provided in two ways (possibly together).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eOption 1\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium already provides APIs related to subsets of the “Clear Browsing Data” form’s functionality. Adding methods to each of those seems like a reasonable way of addressing the request. We call pretty much everything cookies, so adding \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.cookies.clear\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e might look like the following:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\"namespace\": \"cookies\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\"functions\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"name\": \"clear\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"description\": \"Clears cookies and other site data modified within a time period.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"name\": \"timePeriod\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"type\": \"string\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"enum\": [\"last_hour\", \"last_day\", \"last_week\", \"last_month\", \"everything\"],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"description\": \"The time period inside which to delete cookies and site data.\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"name\": \"callback\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"description\": \"Called when deletion has completed.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"optional\": \"true\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"name\": \"result\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Was the data deletion successful?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  \u003c/span\u003e\u003cspan style\u003d\"font-size:13px;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-style:italic;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.cookies\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.history\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e seem like excellent candidates for these sorts of methods. The history namespace could probably be overloaded to include methods to clear the browser cache, downloaded files, stored passwords, and Autofill data (since it’s all arguably historical in nature).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eIt would be valuable, however, to distinguish the namespace from the permission required to execute the methods. Extensions focused on removing data (see the use-cases above) shouldn’t be required to request read access to cookies on a variety of hosts in order to clear them. Adding an explicit \u003c/span\u003e\u003cspan style\u003d\"font-size:16px;vertical-align:baseline;white-space:pre-wrap\"\u003eremoveBrowsingData\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e permission that would grant access to the relevant methods across namespaces would be valuable (\u003c/span\u003e\u003cspan style\u003d\"font-size:16px;vertical-align:baseline;white-space:pre-wrap\"\u003ecookies\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e should grant the same access, but only to the cookies-specific \u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.cookies.clear\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eOption 2\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eA drawback to the option above is that clearing all browsing data requires many (expensive) executions of \u003c/span\u003e\u003cspan style\u003d\"font-size:16px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003eBrowsingDataRemover::Remove\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e. Providing a single method that encapsulated all the options in a single call would be much more efficient. That might look like the following:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\"namespace\": \"experimental.browsingData\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e\"functions\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"name\": \"clear\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"description\": \"Clears data generated by browsing within a particular timeframe.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"name\": \"timePeriod\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"type\": \"string\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"enum\": [\"last_hour\", \"last_day\", \"last_week\", \"last_month\", \"everything\"],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"description\": \"The timeframe inside of which to delete browsing data.”\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"name\": \"dataToRemove\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"type\": \"object\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"properties\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"cache\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should the browser cache be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"cookies\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should the browser's cookies be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"downloads\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should the browser's download list be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"form_data\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should stored form data be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"history\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should the browser's history be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"lso_data\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should LSO data be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"passwords\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            \"description\": \"Should the stored passwords be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e          }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"name\": \"callback\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"description\": \"Called when deletion has completed.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"optional\": \"true\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e              \"name\": \"result\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e              \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e              \"description\": \"Was the data deletion successful?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e            }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e        ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e      }                                                                                                                                        \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e    ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e  }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal;vertical-align:baseline;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-size:15px;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003col style\u003d\"font-size:medium;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cli style\u003d\"list-style-type:decimal;font-size:15px;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eBrowsingDataRemover offers the option of clearing browsing history, download history, clearing the cache, deleting cookies + site + plug-in data, clearing saved passwords, and clearing Autofill data. Homes should be found for programmatic methods that clear each type of data.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;font-size:15px;background-color:transparent;font-weight:normal;vertical-align:baseline\"\u003e\u003cspan style\u003d\"vertical-align:baseline;white-space:pre-wrap\"\u003eShould we offer a separate namespace for clearing browsing data? If so, are there other delete-only methods that would make sense to include in such a namespace?\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/font\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/privacy"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3127549254189961157"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3127549254189961157"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3127549254189961157"}],"author":[{"name":{"$t":"Mike West"},"email":{"$t":"mkwst@chromium.org"}}],"sites$pageName":{"$t":"privacy"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4480918226056163253"},"published":{"$t":"2012-03-07T01:09:20.779Z"},"updated":{"$t":"2012-03-07T01:10:59.388Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-03-07T01:10:59.388Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"dev-sentence-diagram.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4480918226056163253"},"link":[{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/dev-sentence-diagram.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4480918226056163253"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4480918226056163253"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4480918226056163253"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4480918226056163253"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8146536419069268916"},"published":{"$t":"2011-09-06T20:47:04.976Z"},"updated":{"$t":"2012-02-29T22:37:43.393Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-29T22:37:43.379Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"VerifiedBootDataStructures.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8146536419069268916"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9075125316842337239"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot-data-structures/VerifiedBootDataStructures.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8146536419069268916"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8146536419069268916"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8146536419069268916"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8146536419069268916"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8394584790297206919"},"published":{"$t":"2012-02-28T23:53:12.237Z"},"updated":{"$t":"2012-02-28T23:55:44.717Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-28T23:55:44.717Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"BrowserKeys API 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\u003cdiv\u003e\u003cb\u003eProposal Date\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e28 February 2012\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWho is the primary contact for this API?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eGary Kacmarcik (garykac@chromium.org)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eWho will be responsible for this API? (Team please, not an individual)\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eChromoting team\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eOverview\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThe browser-keys extension would send the browser shortcut keys to the page for handling. If the page chooses not to handle the key, then the browser would be able to handle it.\u003c/div\u003e\u003cdiv\u003eThe most problematic cases are ctrl-n, ctrl-w and ctrl-t, which are accelerators in Chromium that are often used for other purposes.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote that OS-level accelerators (like Alt-Tab on Windows) would not be send to the page. The general idea is that any key event that the browser gets is passed on to the page, but no special effort is made to grab literally all key events.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eUse cases\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eAny page or plugin that requires all the keyboard input would now be able to get it.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eScenarios:\u003c/div\u003e\u003cdiv\u003eRemote access or terminals require these keys so they can send them to the remote host for processing.  As a concrete example, programs like emacs are hard to use without ctrl-w and ctrl-t.\u003c/div\u003e\u003cdiv\u003eSome games will also benefit from the extra keys. They often use shift and ctrl in combination with other keys during gameplay.\u003c/div\u003e\u003cdiv\u003ePages/apps that were developed initially on a different browser may assume the availability of these accelerator keys. This extension would help the developer to get it working on Chrome.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDo you know anyone else, internal or external, that is also interested in this API? \u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eChromoting is the primary client, but HTerm has a similar need.\u003c/div\u003e\u003cdiv\u003eAlso, the basic idea (get more key events sent to page) has been proposed before: \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:57970774fc5a2d00\" class\u003d\"disabled\"\u003ehttps://sites.google.com/a/chromium.org/dev/developers/design-documents/reserved-keys-api\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003eOther groups interested in this functionality have commented on \u003ca href\u003d\"http://crbug.com/84332\"\u003ehttp://crbug.com/84332\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe W3C Games Community has on their wishlist a request for better keyboard support. This issue is larger in scope than this extension can address, but it would be a welcome first step.\u003c/div\u003e\u003cdiv\u003eSee \"Keyboard Lock\" on \u003ca href\u003d\"http://www.w3.org/community/games/2011/11/10/w3c-games-community-group-new-game-summit-november-2011/\" rel\u003d\"nofollow\"\u003ehttp://www.w3.org/community/games/2011/11/10/w3c-games-community-group-new-game-summit-november-2011/\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eCould this API be part of the web platform?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eOther browser vendors don't suffer from this problem as much as Chromium because they send browser accelerator keys to the page before handling them. For usability/responsiveness reasons, Chromium decided not to send these key events to plugins (see \u003ca href\u003d\"http://crbug.com/84332\"\u003ehttp://crbug.com/84332\u003c/a\u003e for discussion) so we are alone with this particular keyboard problem.\u003c/div\u003e\u003cdiv\u003eBecause this is basically a Chromium-only problem, there is unlikely to be consensus for this as a web standard.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDo you expect this API to be fairly stable?  How might it be extended or changed in the future?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eGeneral API would be to simply enable/disable receiving the browser keys.\u003c/div\u003e\u003cdiv\u003eEarlier proposals have mentioned allowing the developer to specify certain keys to allow/disallow, but that seems more complicated than needed.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eList every UI surface belonging to or potentially affected by your API:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eNo UI elements are involved. Using this API would simply allow more keyboard events to be passed to the page.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow could this API be abused?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eGiving the page first crack at browser key events allows a malicious consumer to ignore keys like ctrl-w to keep the user stuck on the page. Since we don't plan on trapping OS-level key events, we don't believe this will be a serious problem.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eImagine you’re Dr. Evil Extension Writer, list the three worst evil deeds you could commit with your API (if you’ve got good ones, feel free to add more):\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e1)\u003c/b\u003e Fullscreen, Pointer Lock + Ignore all keyboard input. With this extension, Dr. Evil would be able to ignore more keys.\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e2)\u003c/b\u003e \u003c/div\u003e\u003cdiv\u003e\u003cb\u003e3)\u003c/b\u003e \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eAlright Doctor, one last challenge:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eCould a consumer of your API cause any permanent change to the user’s system using your API that would not be reversed when that consumer is removed from the system?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eNo.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eHow would you implement your desired features if this API didn't exist?\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThere is no real alternative. Since Chromium does not pass the key events to the page, there is nothing that can be done. Chromium's sandbox prevents getting the key events directly.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eDraft API spec\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAPI reference: chrome.browserkeys\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMethods:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eenableBrowserKeys\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003ci\u003echrome.experimental.browserkeys.enableBrowserKeys(boolean enable)\u003c/i\u003e\u003c/div\u003e\u003cdiv\u003eEnables or disables browser accelerator keys being sent to the page.\u003c/div\u003e\u003cdiv\u003eParameters:\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\u003cb\u003eenable ( boolean )\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eTrue to enable browserkeys, false to disable.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eOpen questions\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eNote any unanswered questions that require further discussion.\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/browser-keys"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8394584790297206919"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8394584790297206919"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8394584790297206919"}],"author":[{"name":{"$t":"Gary Kacmarcik"},"email":{"$t":"garykac@chromium.org"}}],"sites$pageName":{"$t":"browser-keys"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"UCl7JmA1\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3377699728661853761"},"published":{"$t":"2010-02-01T22:36:02.771Z"},"updated":{"$t":"2012-02-24T18:30:51.040Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-24T18:30:51.039Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SPDY Protocol - Draft 2"},"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\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\r\n\u003ctable cellspacing\u003d\"0\" style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;table-layout:fixed\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr\u003e\r\n\u003ctd style\u003d\"vertical-align:top;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px\"\u003e\r\n\u003cdiv dir\u003d\"ltr\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Times New Roman;font-size:16px;line-height:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:6px;margin-right:6px;margin-bottom:6px;margin-left:6px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;font-family:Verdana;font-size:10pt;background-color:rgb(255,255,255);min-height:1100px;line-height:normal\"\u003e\r\n\u003cdiv\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:large\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDRAFT\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ci\u003e\u003cspan style\u003d\"font-size:large\"\u003e\u003cfont color\u003d\"#cc0000\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\r\n\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\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\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Document-Organization\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eDocument Organization\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Definitions\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eDefinitions\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Framing-Layer\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eFraming Layer\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Connections\"\u003e\u003cstrong\u003e2.1 \u003c/strong\u003eConnections\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Framing\"\u003e\u003cstrong\u003e2.2 \u003c/strong\u003eFraming\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Protocol-versioning\"\u003e\u003cstrong\u003e2.2.1 \u003c/strong\u003eProtocol versioning\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Control-frames\"\u003e\u003cstrong\u003e2.3 \u003c/strong\u003eControl frames\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Data-frames\"\u003e\u003cstrong\u003e2.4 \u003c/strong\u003eData frames\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Streams\"\u003e\u003cstrong\u003e2.5 \u003c/strong\u003eStreams\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Stream-creation\"\u003e\u003cstrong\u003e2.5.1 \u003c/strong\u003eStream creation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Stream-data-exchange\"\u003e\u003cstrong\u003e2.5.2 \u003c/strong\u003eStream data exchange\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Stream-half-close\"\u003e\u003cstrong\u003e2.5.3 \u003c/strong\u003eStream half-close\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Stream-close\"\u003e\u003cstrong\u003e2.5.4 \u003c/strong\u003eStream close\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Data-flow\"\u003e\u003cstrong\u003e2.6 \u003c/strong\u003eData flow\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Control-frames1\"\u003e\u003cstrong\u003e2.7 \u003c/strong\u003eControl frames\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-SYN_STREAM\"\u003e\u003cstrong\u003e2.7.1 \u003c/strong\u003eSYN_STREAM\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-SYN_REPLY\"\u003e\u003cstrong\u003e2.7.2 \u003c/strong\u003eSYN_REPLY\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-RST_STREAM\"\u003e\u003cstrong\u003e2.7.3 \u003c/strong\u003eRST_STREAM\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-SETTINGS\"\u003e\u003cstrong\u003e2.7.4 \u003c/strong\u003eSETTINGS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-NOOP\"\u003e\u003cstrong\u003e2.7.5 \u003c/strong\u003eNOOP\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-PING\"\u003e\u003cstrong\u003e2.7.6 \u003c/strong\u003ePING\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-GOAWAY\"\u003e\u003cstrong\u003e2.7.7 \u003c/strong\u003eGOAWAY\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-HEADERS\"\u003e\u003cstrong\u003e2.7.8 \u003c/strong\u003eHEADERS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-WINDOW_UPDATE\"\u003e\u003cstrong\u003e2.7.9 \u003c/strong\u003eWINDOW_UPDATE\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-HTTP-Layering-over-SPDY\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eHTTP Layering over SPDY\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Response\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eResponse\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Server-Push-Transactions\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eServer Push Transactions\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Server-Implementation\"\u003e\u003cstrong\u003e3.2.1 \u003c/strong\u003eServer Implementation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Client-Implementation\"\u003e\u003cstrong\u003e3.2.2 \u003c/strong\u003eClient Implementation\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Deployment\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eDeployment\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Server-Advertisement-of-SPDY-through-the-HTTP-Alternate-Protocol-header\"\u003e\u003cstrong\u003e3.3.1 \u003c/strong\u003eServer Advertisement of SPDY through the HTTP Alternate-Protocol header\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Server-Advertisement-of-SPDY-through-TLS-NPN-extension\"\u003e\u003cstrong\u003e3.3.2 \u003c/strong\u003eServer Advertisement of SPDY through TLS NPN extension\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Piggybacking-HTTP-requests-over-SPDY-sessions\"\u003e\u003cstrong\u003e3.3.3 \u003c/strong\u003ePiggybacking HTTP requests over SPDY sessions\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-Incompatibilities-with-SPDY-Draft-1\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eIncompatibilities with SPDY Draft #1\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Future-work-experiments\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eFuture work/experiments\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Contributors\"\u003e\u003cstrong\u003e6 \u003c/strong\u003eContributors\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Overview\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOverview\u003c/font\u003e\u003c/h2\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eOne of the bottlenecks of current HTTP implementations is that HTTP relies solely on multiple connections for concurrency. This causes several problems, including additional round trips for connection setup, slow-start delays, and a constant rationing by the client where it tries to avoid opening too many connections to a single server. HTTP \"pipelining\" doesn't help, as each connection may be blocked on the request at the \u003c/font\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Head-of-line_blocking\" rel\u003d\"nofollow\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ehead of the line\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e; in addition, many proxies have poor support for pipelining. Web applications, in their desire to create many connections, create many sub-domains to work around browser per-domain connection throttling.\u003c/font\u003e\u003c/p\u003e\r\n\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSPDY aims to address these and other application-layer problems associated with modern web applications, while requiring little or no change from the perspective of web application writers.\u003c/font\u003e\u003c/p\u003e\r\n\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIn a nutshell, SPDY adds a framing layer for multiplexing multiple, concurrent streams across a single TCP connection (or any reliable transport stream).  The framing layer is optimized for HTTP-like request-response streams.\u003c/font\u003e\u003c/p\u003e\r\n\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe SPDY session offers three basic improvements over HTTP:\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMultiplexed requests. There is no limit to the number of requests that can be issued concurrently over a single SPDY connection.  Because requests are interleaved on a single channel, the protocol is more efficient over TCP.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePrioritized requests. Clients can request certain resources to be delivered first.  This avoids the problem of congesting the network channel with non-critical resources when a high-priority request is pending.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCompressed headers.  Clients today send a significant amount of redundant data in the form of HTTP headers.  Because a single web page may require 50 or 100 subrequests, this data is significant. Compressing the headers saves a significant amount of latency and bandwidth compared to HTTP.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eServer pushed streams.  This enables content to be pushed from servers to clients without a request.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eNote that for the most part, SPDY attempts to preserve the existing semantics of HTTP. All features such as cookies, etags, vary headers, content-encoding negotiations, etc work as they do with HTTP; SPDY only replaces the way the data is written to the network.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Document-Organization\" /\u003eDocument Organization\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe SPDY Specification is split into two parts: \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Framing-Layer\"\u003ea framing layer\u003c/a\u003e, which multiplexes a TCP connection into independent, length-prefixed frames, and \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-HTTP-Layering-over-SPDY\"\u003ean HTTP layer\u003c/a\u003e, which specifies the mechanism for overlaying HTTP request/response pairs on top of the framing layer. While some of the framing layer concepts are isolated from the HTTP layer, building a generic framing layer has not been a goal. The framing layer is tailored to the needs of the HTTP protocol and server push. \u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Definitions\" /\u003eDefinitions\u003c/h3\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ci\u003eclient\u003c/i\u003e: The endpoint initiating the SPDY session. \u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003econnection\u003c/i\u003e: A TCP-level connection between two endpoints. \u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003eendpoint\u003c/i\u003e: Either the client or server of a connection. \u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003eframe\u003c/i\u003e: A header-prefixed sequence of bytes sent over a SPDY session.\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003eserver\u003c/i\u003e: The endpoint not initiating the SPDY session.\u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003esession\u003c/i\u003e: A sequence of frames sent over a single connection. This is the same as the \"framing layer\". \u003c/li\u003e\r\n\u003cli\u003e\u003ci\u003estream\u003c/i\u003e: A bi-directional flow of bytes across a virtual channel within a SPDY session. \u003c/li\u003e\r\n\u003c/ul\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Framing-Layer\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFraming Layer\u003c/font\u003e\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Connections\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eConnections\u003c/font\u003e\u003c/h3\u003e\r\n\u003cp style\u003d\"font-family:arial,sans-serif\"\u003eThe SPDY framing layer (or \"session\") runs atop TCP, similarly to how HTTP works today. The client is expected to be the TCP connection initiator. Because it runs on TCP, we have a reliable transport. Unlike HTTP, all connections with SPDY are persistent connections. The HTTP connection header does not apply.\u003c/p\u003e\r\n\u003cp style\u003d\"font-family:arial,sans-serif\"\u003eFor best performance, it is expected that clients will not close open connections until the user navigates away from all web pages referencing a connection, or until the server closes the connection. Servers are encouraged to leave connections open for as long as possible, but can terminate idle connections after some amount of inactivity if necessary.  When either side closes the TCP connection, it should first send a \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-GOAWAY\"\u003eGOAWAY\u003c/a\u003e frame so that the endpoints can more reliably determine if requests finished before the closure.\u003c/p\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\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Framing\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFraming\u003c/font\u003e\u003c/h3\u003e\r\n\u003cp style\u003d\"font-family:arial,sans-serif\"\u003eOnce the connection is established, clients and servers exchange framed messages. There are two types of frames: \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Control-frames\"\u003econtrol frames\u003c/a\u003e and \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Data-frames\"\u003edata frames\u003c/a\u003e.  Frames always have a common header which is 8 bytes.\u003c/p\u003e\r\n\u003cp style\u003d\"font-family:arial,sans-serif\"\u003eThe first bit is a control bit indicating whether a frame is a control frame or data frame. Control frames carry a version number, a frame type, flags, and a length. Data frames contain the stream ID, flags, and the length for the payload carried after the common header. The simple header is designed to make reading and writing of frames easy.\u003c/p\u003e\r\n\u003cp style\u003d\"font-family:arial,sans-serif\"\u003eAll integer values, including length, version, and type, are in network byte order.  SPDY does not enforce alignment of types in dynamically sized frames.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Protocol-versioning\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eProtocol versioning\u003c/font\u003e\u003c/h4\u003e\r\n\u003cp style\u003d\"font-family:arial,sans-serif\"\u003eSPDY does lazy version checking on receipt of any control frame, and does version enforcement only on SYN_STREAM frames.  If an endpoint receives a SYN_STREAM frame with an unsupported version, the endpoint must return a RST_STREAM frame with the status code UNSUPPORTED_VERSION.  For any other type of control frame, the frame must be ignored.\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Control-frames\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eControl frames\u003c/font\u003e\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |C| Version(15bits) | Type(16bits) |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Flags (8)  |  Length (24 bits)   |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |               Data               |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\nControl bit: The 'C' bit is a single bit indicating that this is a control message. For control frames this value is always 1. \u003cbr /\u003e\r\n\u003cbr /\u003e\r\nVersion: The version number of the session protocol (currently 2).\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nType: The type of control frame. See \u003c/font\u003e\r\n\r\n\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Control-frames\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eControl Frames\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e for the complete list of control frames.\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFlags: Flags related to this frame. Flags for control frames and data frames are different.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nLength: An unsigned 24-bit value representing the number of bytes after the length field.\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eData: data associated with this control frame. The format and length of this data is controlled by the control frame type.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eControl frame processing requirements:\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf an endpoint receives a control frame for a type it does not recognize, it must ignore the frame.\u003c/font\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Data-frames\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eData frames\u003c/font\u003e\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |C|       Stream-ID (31bits)       |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e | Flags (8)  |  Length (24 bits)   |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |               Data               |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eControl bit: For data frames this value is always 0.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nStream-ID: A 31-bit value identifying the stream.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nFlags: Flags related to this frame. Valid flags are:\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\r\n\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e0x01 \u003d FLAG_FIN - signifies that this frame represents the last frame to be transmitted on this stream.  See \u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Stream-close\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStream Closure\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e below.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\nLength: An unsigned 24-bit value representing the number of bytes after the length field. The total size of a data frame is 8 bytes + length. It is valid to have a zero-length data frame.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nData: The variable-length data payload; the length was defined in the length field.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eData frame processing requirements:\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf an endpoint receives a data frame for a stream-id which does not exist, it must return a \u003c/font\u003e\u003ca href\u003d\"http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-RST_STREAM\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eRST_STREAM\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e with error code INVALID_STREAM for the stream-id.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf the endpoint which created the stream receives a data frame before receiving a SYN_REPLY on that stream, it is a protocol error, and the receiver should close the connection immediately.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eImplementors note: If an endpoint receives multiple data frames for invalid stream-ids, it may terminate the session.\u003c/font\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Streams\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStreams\u003c/font\u003e\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStreams are independent sequences of bi-directional data cut into frames.  Streams can be created either by the client or the server, can concurrently send data interleaved with other streams, and can be cancelled.  The usage of streams with HTTP is such that a single HTTP request/response occupies a single stream, and the stream is not reused for a second request.  This is because streams can be independently created without incurring a round-trip.  See the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-HTTP-Layering-over-SPDY\"\u003eHTTP layering\u003c/a\u003e section for details.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUpon stream initiation, streams allow for each side to transmit a list of name/value pairs (headers) to the other endpoint.\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Stream-creation\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStream creation\u003c/font\u003e\u003c/h4\u003e\r\n\u003cp style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eA stream is created by sending a control frame with the type set to \u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-SYN_STREAM\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSYN_STREAM\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e.  If the server is initiating the stream, the Stream-ID must be even.  If the client is initiating the stream, the Stream-ID must be odd.  0 is not a valid Stream-ID. Stream-IDs from each side of the connection must increase monotonically as new streams are created.  E.g. Stream 2 may be created after stream 3, but stream 7 must not be created after stream 9.\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStreams are bi-directional.  However, the stream creator can optionally set the UNIDIRECTIONAL flag as part of the SYN_STREAM to indicate to the receiver that the receiver cannot reply on the stream.\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eUpon receipt of a SYN_STREAM frame, if the UNIDIRECTIONAL flag is not set, the receiver replies with a \u003ca href\u003d\"http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-SYN_REPLY\"\u003eSYN_REPLY\u003c/a\u003e frame.  Note that the stream initiator (sending the SYN_STREAM) does not need to wait for a SYN_REPLY before sending any data frames.\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eIf the endpoint receiving a SYN_STREAM does not want to accept the new stream, it can immediately respond with a RST_STREAM control frame.  Note, however, that the initiating endpoint may have already sent data on the stream as well; this data must be ignored.\u003c/p\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Stream-data-exchange\" /\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStream data exchange\u003c/font\u003e\u003c/span\u003e\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-weight:normal\"\u003eOnce a stream is created, it can be used to send arbitrary amounts of data.  Generally this means that a series of data frames will be sent on the stream until a frame containing the FLAG_FIN flag is set.  The FLAG_FIN can be set on a SYN_STREAM, SYN_REPLY, or a DATA frame.  Once the FLAG_FIN has been sent, the stream is considered to be half-closed.  (See \u003ca href\u003d\"http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Stream-half-close\"\u003eStream half-close\u003c/a\u003e)\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Stream-half-close\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStream half-close\u003c/font\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eWhen one side of the stream sends a control or data frame with the FLAG_FIN flag set, the stream is considered to be half-closed from that side. The sender of the FLAG_FIN is indicating that no further data will be sent from the sender on this stream. When both sides have half-closed, the stream is considered to be closed. (See \u003ca href\u003d\"http://dev.chromium.org/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Stream-close\"\u003eStream close\u003c/a\u003e)\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Stream-close\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStream close\u003c/font\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThere are 3 ways that streams can be terminated:\u003c/font\u003e\u003c/p\u003e\r\n\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eNormal termination\u003cbr /\u003e\r\nNormal stream termination occurs when both sender and receiver have half-closed the stream by sending a FLAG_FIN.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAbrupt termination\u003cbr /\u003e\r\nEither the client or server can send a RST_STREAM control frame at any time. A RST_STREAM contains an error code to indicate the reason for failure.  When a RST_STREAM is sent from the stream originator, it indicates a failure to complete the stream and that no further data will be sent on the stream.  When a RST_STREAM is sent from the stream receiver, the sender, upon receipt, should stop sending any data on the stream.  The stream receiver should be aware that there is a race between data already in transit from the sender and the time the RST_STREAM is received.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eTCP connection teardown\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf the TCP connection is torn down while unterminated streams are active (no RST_STREAM  frames have been sent or received for the stream), then the endpoint must assume that the stream was abnormally interrupted and may be incomplete.\u003c/font\u003e\u003c/span\u003e\u003c/b\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf a client or server receives data on a stream which has already been torn down, it must ignore the data received after the teardown.\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe): Reference how UNIDIRECTIONAL works here.\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Data-flow\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eData flow\u003c/font\u003e\u003c/h3\u003e\r\n\u003cspan style\u003d\"font-weight:normal;font-family:arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eBecause TCP provides a single stream of data on which SPDY multiplexes multiple logical streams, it is important for clients and servers to interleave data messages for concurrent sessions.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eImplementors should note that sending data in smallish chunks will result in lower end-user latency for a page as this allows the browser to begin parsing metadata early, and, in turn, to finalize the page layout. Sending large chunks yields a small increase in bandwidth efficiency at the cost of slowing down the user experience on pages with many resources.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Control-frames1\" /\u003eControl frames\u003c/h3\u003e\r\n\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-SYN_STREAM\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSYN_STREAM\u003c/font\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eThe SYN_STREAM control frame allows the sender to create a stream between the sender and receiver with zero negotiation from the receiver.  The stream can be used to send metadata and data from the sender to the receiver.\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:6px;margin-right:6px;margin-bottom:6px;margin-left:6px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;font-family:Verdana;font-size:10pt;background-color:rgb(255,255,255);min-height:1100px;line-height:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e----\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|       2          \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|       1     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Flags (8)  |  Length (24 bits)   |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |X|          Stream-ID (31bits)    |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |X|Associated-To-Stream-ID (31bits)|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Pri | Unused    |                |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +------------------                |\u003cbr /\u003e\r\n  |     Name/value header block      |\u003cbr /\u003e\r\n  |             ...                  |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eFlags: Flags related to this frame. Valid flags are:\u003c/p\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e0x01 \u003d FLAG_FIN - \u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003esignifies that this frame represents the last frame to be transmitted on this stream\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e0x02 \u003d FLAG_UNIDIRECTIONAL - a stream created with this flag is already considered to be half closed to the receiver.\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eLength: An unsigned 24 bit value representing the number of bytes after the length field. The total size of a SYN_STREAM frame is 8 bytes + length. The length for this frame must be greater than or equal to 12.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eStream-ID: The 31-bit identifier for this stream.  This stream-id will be used in a frames which are part of this stream.\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eAssociated-To-Stream-ID: The 31-bit identifier for a stream which this stream is associated to.  If this stream is independent of all other streams, it should be 0.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003ePriority: A 2-bit priority field. If an endpoint has initiated multiple streams, the priority field represents which streams should be given first precidence. Servers are not required to strictly enforce the priority field, although best-effort is assumed. 0 represents the lowest priority and 3 represents the highest priority. The highest-priority data is that which is most desired by the client.\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\r\n\u003cbr /\u003e\r\nUnused: 14 bits of unused space, reserved for future use.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nNV entries: (16 bits) The number of name/value pairs that follow. Note: \u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe \u003c/font\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Name-Value-header-block-format\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eName/Value block\u003c/font\u003e\u003c/a\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e is described below.\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/p\u003e\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIf an endpoint receives multiple SYN_STREAM frames for the same active stream ID, it must drop the stream, and send a RST_STREAM for the stream with the error PROTOCOL_ERROR.\u003c/font\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-SYN_REPLY\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSYN_REPLY\u003c/font\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSYN_REPLY provides the acceptance of a stream creation by the receiver of a SYN_STREAM frame.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|        2        \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|        2     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Flags (8)  |  Length (24 bits)   |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |X|          Stream-ID (31bits)    |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Unused        |                  |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------                  |\u003cbr /\u003e\r\n  |     Name/value header block      |\u003cbr /\u003e\r\n  |              ...                 |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eFlags: Flags related to this frame. Valid flags are:\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e0x01 \u003d FLAG_FIN - signifies that this frame represents the half-close of this stream. \u003cspan style\u003d\"border-collapse:collapse\"\u003eWhen set, it indicates that the sender will not produce any more data frames in this stream.\u003c/span\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\r\n\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eLength: An unsigned 24-bit value representing the number of bytes after the length field. The total size of a SYN_STREAM frame is 8 bytes + length. The length for this frame must be greater than or equal to 8.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eStream-ID: The 31-bit identifier for this stream.  This stream-id will be used in a frames which are part of this stream.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eUnused: 16 bits of unused space, reserved for future use.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eNV entries: (16 bits) The number of name/value pairs that follow.\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eThe \u003ca href\u003d\"http://sites.google.com/a/chromium.org/dev/spdy-protocol/spdy-protocol-draft2#TOC-Name-Value-header-block-format\" style\u003d\"color:rgb(78,125,191);outline-style:none;outline-width:initial;outline-color:initial\" rel\u003d\"nofollow\"\u003eName/Value block\u003c/a\u003e is described below.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eIf an endpoint receives multiple SYN_REPLY frames for the same active stream ID, it must drop the stream, and send a RST_STREAM for the stream with the error PROTOCOL_ERROR.\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-RST_STREAM\" /\u003eRST_STREAM\u003c/h4\u003e\r\n\u003cdiv\u003eThe RST_STREAM frame allows for abnormal termination of a stream.  When sent by the creator of a stream, it indicates the creator wishes to cancel the stream.  When sent by the receiver of a stream, it indicates an error or that the receiver did not want to accept the stream, so the stream should be closed.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:bold\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|       2        \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|      3     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +-------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Flags (8)  |         8        |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +-------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |X|          Stream-ID (31bits) |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +-------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |          Status code          | \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +-------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eFlags: Flags related to this frame. RST_STREAM does not define any flags.  This value must be 0.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eLength: An unsigned 24-bit value representing the number of bytes after the length field. For \u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eRST_STREAM \u003c/font\u003e\u003c/span\u003e control frames, this value is always 8.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eStatus code: (32 bits) An indicator for why the stream is being terminated.\u003c/span\u003e\u003cfont face\u003d\"'Courier New'\" style\u003d\"font-family:arial,sans-serif\"\u003e\u003cfont\u003eThe following status codes are defined:\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e1 - PROTOCOL_ERROR. This is a generic error, and should only be used if a more specific error is not available. The receiver of this error will likely abort the entire session and possibly return an error to the user.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e2 - INVALID_STREAM should be returned when a frame is received for a stream which is not active. The receiver of this error will likely log a communications error.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e3 - REFUSED_STREAM.  This is error indicates that the stream was refused before any processing has been done on the stream.  This means that request can be safely retried.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e4 - UNSUPPORTED_VERSION.  Indicates that the receiver of a stream does not support the SPDY version requested.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e5 - CANCEL.  Used by the creator of a stream to indicate that the stream is no longer needed.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e6 - INTERNAL_ERROR.  The endpoint processing the stream has encountered an error.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e7 - FLOW_CONTROL_ERROR.  The endpoint detected that its peer violated the flow control protocol.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eNote:  0 is not a valid status code for a \u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eRST_STREAM\u003c/font\u003e\u003c/span\u003e.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eAfter receiving a RST_STREAM on a stream, the receiver must not send additional frames for that stream.\u003c/div\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-SETTINGS\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSETTINGS\u003c/font\u003e\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003ci\u003eNote:  In earlier drafts, this frame was called a \"HELLO\" frame.\u003c/i\u003e\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\"\u003eA SETTINGS frame contains a set of id/value pairs for communicating configuration data about how the two endpoints may communicate. SETTINGS frames can be sent at any time by either endpoint, are optionally sent, and fully asynchronous.  Further, when the server is the sender, the sender can request that configuration data be persisted by the client across SPDY sessions and returned to the server in future communications.\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\"\u003ePersistence of SETTINGS ID/Value pairs is done on a per domain/IP pair.  That is, when a client connects to a server, and the server persists settings within the client, the client MUST only return the persisted settings on future connections to the same domain AND IP address and TCP port. Clients MUST NOT request servers to use the persistence features of the SETTINGS frames, and servers MUST ignore persistence related flags sent by a client.\u003c/font\u003e\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\r\n\r\n\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"arial, sans-serif\" style\u003d\"font-family:Verdana\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e----\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|       2          \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|       4     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e | Flags (8)  |  Length (24 bits)   |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n  |         Number of entries        |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003cbr /\u003e\r\n  |          ID/Value Pairs          |\u003cbr /\u003e\r\n  |             ...                  |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eControl bit: The control bit is always 1 for this message.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eVersion: The SPDY version number.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eType: The message type for a SETTINGS message is 4.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eFlags: FLAG_SETTINGS_CLEAR_PREVIOUSLY_PERSISTED_SETTINGS (0x1): When set, the client should clear any previously persisted SETTINGS ID/Value pairs.  If this frame contains ID/Value pairs with the FLAG_SETTINGS_PERSIST_VALUE set, then the client will first clear its existing, persisted settings, and then persist the values with the flag set which are contained within this frame.  Because persistence is only implemented on the client, this flag can only be used when the sender is the server.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eLength: An unsigned 24-bit value representing the number of bytes after the length field. The total size of a SETTINGS frame is 8 bytes + length.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eNumber of entries: A 32-bit value representing the number of ID/value pairs in this message.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eEach ID/value pair is as follows:\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e +----------------------------------+\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e |    ID (24 bits)   | \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eID_\u003c/span\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eFlags (8) |\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana;margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e +----------------------------------+\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e |          Value (32 bits)       \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  |\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e +----------------------------------+\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eID: 24-bits in \u003cb style\u003d\"font-family:sans-serif;line-height:19px\"\u003elittle-endian\u003c/b\u003e byte order.  This is inconsistent with other values in SPDY and is the result of a bug in the initial v2 implementation.  Defined IDs:\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\r\n\u003cul\u003e\u003cli style\u003d\"font-family:arial,sans-serif\"\u003e1 - SETTINGS_UPLOAD_BANDWIDTH - allows the sender to send its expected upload bandwidth on this channel. This number is an estimate. The value should be the integral number of kilobytes per second that the sender predicts as an expected maximum upload channel capacity.\u003c/li\u003e\r\n\u003cli style\u003d\"font-family:arial,sans-serif\"\u003e2 - SETTINGS_DOWNLOAD_BANDWIDTH - allows the sender to send its expected download bandwidth on this channel. This number is an estimate. The value should be the integral number of kilobytes per second that the sender predicts as an expected maximum download channel capacity.\u003c/li\u003e\r\n\u003cli style\u003d\"font-family:arial,sans-serif\"\u003e3 - SETTINGS_ROUND_TRIP_TIME - allows the sender to send its expected round-trip-time on this channel. The round trip time is defined as the minimum amount of time to send a control frame from this client to the remote and receive a response. The value is represented in milliseconds.\u003c/li\u003e\r\n\u003cli style\u003d\"font-family:arial,sans-serif\"\u003e4 - SETTINGS_MAX_CONCURRENT_STREAMS allows the sender to inform the remote endpoint the maximum number of concurrent streams which it will allow. By default there is no limit. For implementors it is recommended that this value be no smaller than 100.\u003c/li\u003e\r\n\u003cli style\u003d\"font-family:arial,sans-serif\"\u003e5 - SETTINGS_CURRENT_CWND allows the sender to inform the remote endpoint of the current CWND value. This value is currently interpreted as packets.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e6 - SETTINGS_DOWNLOAD_RETRANS_RATE - downstream byte retransmission rate in percentage\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"font-family:arial,sans-serif\"\u003e7 - SETTINGS_INITIAL_WINDOW_SIZE - initial window size in bytes\u003c/li\u003e\u003c/ul\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eFlags: 8 bits.  Defined Flags:\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e       FLAG_SETTINGS_PERSIST_VALUE (0x1):   When set, the sender of this SETTINGS frame is requesting that the receiver persist the ID/Value and return it in future SETTINGS frames sent from the sender to this receiver.  Because persistence is only implemented on the client, this flag is only sent by the server.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e       FLAG_SETTINGS_PERSISTED (0x2):  When set, the sender is notifying the receiver that this ID/Value pair was previously sent to the sender by the receiver with the FLAG_SETTINGS_PERSIST_VALUE, and the sender is returning it.  Because persistence is only implemented on the client, this flag is only sent by the client.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003eValue: A 32-bit value in network byte order\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cfont\u003e\u003cbr /\u003e\r\n\u003c/font\u003eThe message is intentionally extensible for future information which may improve client-server communications. The sender does not need to send every type of ID/value. It must only send those for which it has accurate values to convey. When multiple ID/value pairs are sent, they should be sent in order of lowest id to highest id.  A single SETTINGS frame MUST not contain multiple values for the same ID.  If the receiver of a SETTINGS frame discovers multiple values for the same ID, it MUST ignore all values except the first one.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eImplementation Notes:  Persisted storage from the SETTINGS is similar to a cookie, in that it is persisted state.  It differs from HTTP cookies in that it applies at the session layer rather than at the HTTP layer.  When SPDY is used in conjunction with HTTP, browser implementors should be careful that any persisted SETTINGS information follows similar handling to HTTP cookies, and that a mechanism for clearing data is provided to the user.   Servers MUST NOT attempt to use SETTINGS as a mechanism for storing arbitrary data on the client.   \u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003eNote also that a server may send multiple SETTINGS frames containing different ID/Value pairs.  When the same ID/Value is sent twice, the most recent value overrides any previously sent values.  If the server sends IDs 1, 2, and 3 with the FLAG_SETTINGS_PERSIST_VALUE in a first SETTINGS frame, and then sends IDs 4 and 5 with the FLAG_SETTINGS_PERSIST_VALUE, when the client returns the persisted state on its next SETTINGS frame, it SHOULD send all 5 settings (1, 2, 3, 4, and 5 in this example) to the server.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-NOOP\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eNOOP\u003c/font\u003e\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe NOOP control frame is a no-operation frame.  It can be sent from the client or the server.  Receivers of a NO-OP frame should simply ignore it.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e----\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|       2          \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|       5     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003cbr /\u003e\r\n  +----------------------------------+\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | 0 (Flags)  |    0 (Length)       |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eControl-bit: The control bit is always 1 for this message.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eVersion: The SPDY version number.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eType: The message type for a NOOP message is 5.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eLength: This frame carries no data, so the length is always 0.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-PING\" /\u003ePING\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003cp\u003eThe PING control frame is a mechanism for measuring a minimal round-trip time from the sender.  It can be sent from the client or the server.  Receivers of a PING frame should send an identical frame to the sender as soon as possible (if there is other pending data waiting to be sent, PING should take highest priority).  Each ping sent by a sender should use a unique ID.\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Courier New\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;display:inline!important\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;display:inline!important\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\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/span\u003e\u003c/b\u003e\u003c/font\u003e\u003cb\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|       2          \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|       6     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | 0 (flags) |     4 (length)       |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------|\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |            32-bit ID             |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eControl bit: The control bit is always 1 for this message.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eVersion: The SPDY version number.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eType: The message type for a PING message is 6.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eLength: This frame is always 4 bytes long.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eID: A unique ID for this ping.  When the client initiates a ping, it must use an odd numbered ID.  When the server initiates a ping, it must use an even numbered ping.  Use of odd/even IDs is required in order to avoid accidental looping on PINGs (where each side initiates an identical PING at the same time).\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eNote: If a sender uses all possible PING ids (e.g. has sent all 2^31 possible IDs), it can wrap and start re-using IDs.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eIf a server receives an even numbered PING which it did not initiate, it must ignore the PING.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eIf a client receives an odd numbered PING which it did not initiate, it must ignore the PING.\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/b\u003e\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\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-GOAWAY\" /\u003eGOAWAY\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe GOAWAY control frame is a mechanism to tell the remote side of the connection that it should no longer use this session for further requests.  It can be sent from the client or the server. Once sent, the sender agrees not to initiate any new streams on this session. Receivers of a GOAWAY frame must not send additional requests on this session, although a new session (connection) can be established for new requests.  The purpose of this message is to allow an endpoint to gracefully stop accepting new requests (perhaps for a reboot or maintenance), while still finishing processing of previously established streams.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThere is an inherent race condition between a client sending requests and the server sending a GOAWAY message.  To deal with this case, the GOAWAY message contains a last-stream identifier indicating the last stream which was accepted in this session.  If the client issued requests for sessions after this stream-id, they were not accepted by the server and should be re-issued later at the client's discretion.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eEndpoints should always send a GOAWAY message before closing a connection so that the remote can know whether a request has been partially processed or not.  (For example, if the client sends a POST at the same time that a server closes a connection, the client cannot know if the server started to process that POST request if the server does not send a GOAWAY frame to indicate where it stopped working)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAfter sending a GOAWAY message, the sender must ignore all SYN_STREAM frames for new streams.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |1|       2          \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|       7     \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | 0 (flags) |     4 (length)       |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------|\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |X|  Last-good-stream-ID (31 bits) |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eControl bit: The control bit is always 1 for this message.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eVersion: The SPDY version number.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eType: The message type for a GOAWAY message is 7.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eLength: This frame is always 4 bytes long.\u003c/span\u003e\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cbr style\u003d\"font-family:arial,sans-serif\" /\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eLast-good-stream-Id: The last stream id which was accepted by the sender of the GOAWAY message.  If no streams were accepted, this value must be 0.\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-HEADERS\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHEADERS\u003c/font\u003e\u003c/h4\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\nThis frame augments a stream with additional headers. It may be optionally sent on an existing stream at any time.  Specific application of the headers (and dealing with duplicates) in this frame is application-dependent.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\r\n\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |C|     2           |      8       |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Flags (8)  |  Length (24 bits)   |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Courier New\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Courier New\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Courier New\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  +----------------------------------+\u003c/span\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  |X|          Stream-ID (31bits)    |\u003c/span\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  +----------------------------------+\u003c/span\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n  |  Unused (16 bits) |              |\u003cbr /\u003e\r\n  |--------------------              |\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Name/value header block          |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +----------------------------------+\u003c/font\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\r\n\r\n\u003c/div\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003eLength: An unsigned 24 bit value representing the number of bytes after the length field. The total size of a HEADERS frame is 8 bytes + length. The length for this frame must be greater than or equal to 8.  The minimum length of the length field is 4 (when the number of name value pairs is 0).\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eNV entries: The number of name/value pairs that follow.\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eThe \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2#TOC-Name-Value-header-block-format\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003eName/Value block\u003c/a\u003e is the same as a SYN_REPLY.\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:bold\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eName/Value header block format\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003eThe SYN_STREAM, SYN_REPLY, and HEADERS frames contain a Name/value header block.  The header block used by both the request and the response is the same.  It is designed so that headers can be easily appended to the end of a list and also so that it can be easily parsed by receivers.  Each numeric value is 2 bytes.\u003c/font\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:left\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +------------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:left\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  | Number of Name/Value pairs (int16) |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:left\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e----\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e---\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e-\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |     Length of name (int16)         |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +------------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |           Name (string)            |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +------------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |     Length of value  (int16)       |\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +------------------------------------+\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:left\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |          Value   (string)          |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  +------------------------------------+\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\r\n\u003c/font\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  |           (repeats)                |\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eEach header name must have at least one value. Header names must be all lower case.  The length of each name and value must be greater than zero.  A receiver of a zero-length name or value must send a RST_STREAM with code PROTOCOL error. \u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe): Verify that the 64KB limits are sufficient.  JoeyH notes that it is possible to send 50 4KB cookies over HTTP today, and that would not work in this model.\u003c/font\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003eDuplicate header names are not allowed.  To send two identically named headers, send a header with two values, where the values are separated by a single NUL (0) byte.  Senders must not send multiple, in-sequence NUL characters.  Receivers of multiple, in-sequence NUL characters must send a RST_STREAM with code PROTOCOL_ERROR on the stream.\u003c/p\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eStrings are utf8 encoded and are not NUL terminated.\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px;font-family:arial,sans-serif\"\u003eThe entire contents of the name/value header block is compressed using zlib deflate.  There is a single zlib stream (context) for all name value pairs in one direction on a connection.   SPDY uses a SYNC_FLUSH between frame which uses compression. The stream is initialized with the following dictionary (without line breaks and IS null-terminated):\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eoptionsgetheadpostputdeletetraceacceptaccept-charsetaccept-encodingaccept-\u003cbr /\u003e\r\nlanguageauthorizationexpectfromhostif-modified-sinceif-matchif-none-matchi\u003cbr /\u003e\r\nf-rangeif-unmodifiedsincemax-forwardsproxy-authorizationrangerefererteuser\u003cbr /\u003e\r\n-agent10010120020120220320420520630030130230330430530630740040140240340440\u003cbr /\u003e\r\n5406407408409410411412413414415416417500501502503504505accept-rangesageeta\u003cbr /\u003e\r\nglocationproxy-authenticatepublicretry-afterservervarywarningwww-authentic\u003cbr /\u003e\r\nateallowcontent-basecontent-encodingcache-controlconnectiondatetrailertran\u003cbr /\u003e\r\nsfer-encodingupgradeviawarningcontent-languagecontent-lengthcontent-locati\u003cbr /\u003e\r\noncontent-md5content-rangecontent-typeetagexpireslast-modifiedset-cookieMo\u003cbr /\u003e\r\nndayTuesdayWednesdayThursdayFridaySaturdaySundayJanFebMarAprMayJunJulAugSe\u003cbr /\u003e\r\npOctNovDecchunkedtext/htmlimage/pngimage/jpgimage/gifapplication/xmlapplic\u003cbr /\u003e\r\nation/xhtmltext/plainpublicmax-agecharset\u003diso-8859-1utf-8gzipdeflateHTTP/1\u003cbr /\u003e\r\n.1statusversionurl\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;font-family:arial,sans-serif\"\u003e\u003cfont color\u003d\"#FF0000\"\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;font-family:arial,sans-serif\"\u003e\u003cfont color\u003d\"#FF0000\"\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:40px;font-family:arial,sans-serif\"\u003e\u003cfont\u003e\u003cfont\u003e\u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe): Add Brian O's compression data and notes.\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-WINDOW_UPDATE\" /\u003eWINDOW_UPDATE\u003c/h4\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eAlthough WINDOW_UPDATE was originally defined in DRAFT 2, it was never implemented. The specification for this frame is thus removed, and this note exists for those who might remember its existence.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003ePlease look at DRAFT 3 for flow-control related definitions.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003chr /\u003e\r\n\u003c/div\u003e\r\n\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-HTTP-Layering-over-SPDY\" /\u003eHTTP Layering over SPDY\u003c/h2\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSPDY is intended to be as compatible as possible with current web-based applications. This means that, from the perspective of the server business logic or application API, the features of HTTP must not change. To achieve this, all of the application request and response header semantics are preserved, although the syntax of conveying those semantics has changed.  Thus, the rules from the \u003ca href\u003d\"http://www.w3.org/Protocols/rfc2616/rfc2616.html\" rel\u003d\"nofollow\"\u003eHTTP/1.1 specification in RFC 2616\u003c/a\u003e apply with the changes in the sections below.\u003c/font\u003e\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-size:16px;font-weight:bold\"\u003eStandard Transactions\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eHTTP request/responses will generally be mapped as one request/response to one stream.  Multiple requests can be issued in parallel, with each request issued on an independent stream.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eRequest\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThe client initiates a request by sending a SYN_STREAM frame.  For requests which do not contain a body, the SYN_STREAM must set the FIN_FLAG, indicating that the client intends to send no further data on this stream.  For requests which do contain a body, the SYN_STREAM will not contain the FIN_FLAG, and the body will follow the SYN_STREAM in a series of DATA frames.  The last DATA frame will set the FIN_FLAG to indicate the end of the body.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe SYN_STREAM Name/Value section will contain all of the HTTP headers which are associated with an HTTP request. \u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe HTTP header block in SPDY is mostly unchanged from today's HTTP header block, with the following differences:\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe first line of the request is unfolded into name/value pairs like other HTTP headers and must be present:\u003c/font\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"method\" - the HTTP method for this request (e.g. \"GET\", \"POST\", \"HEAD\", etc)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan\u003e\"scheme\" - the scheme portion of the URL for this request (e.g. \"https\")\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"url\" - the\u003c/font\u003e\u003cspan\u003e absolute path for this request (e.g. \"/foo/bar.html\")\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\"version\" - the HTTP version of this request (e.g. \"HTTP/1.1\")\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDuplicate header names are not allowed.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHeader names are all lowercase.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe Connection and Keep-Alive headers are no longer valid and are ignored if present.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eHTTP request headers are compressed. This is accomplished by compressing all data sent by the client with gzip encoding.\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe \"host\" header is ignored. The host:port portion of the HTTP URL is the definitive host.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUser-agents are expected to support gzip and deflate compression. Regardless of the Accept-Encoding sent by the user-agent, the server may select gzip or deflate encoding at any time.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePOST-specific changes:\u003c/font\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePOST requests are expected to contain a data stream as part of the post; see Data flow below.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eContent-length\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eChunked encoding is no longer valid.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003eThe browser is free to prioritize requests as it sees fit. If the browser cannot make progress without receiving a resource, it should attempt to raise the priority of that resource. Resources such as images, should use the lowest priority whenever possible.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf a client sends a SYN_STREAM without all of the method, url, and version headers, the server must reply with a HTTP 400 BAD REQUEST reply.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eImplementors Note:  Section 5.1 of the HTTP/1.1 specification specifies that HTTP/1.1 compliant servers MUST support absolute URIs in the request line.  SPDY is using absolute URIs only, instead of relative URIs + Host headers.  From practical experience, we have noticed that many HTTP/1.1 servers do not support absolute URIs and are in violation of the HTTP/1.1 standard.  As a result, any implementors of SPDY -\u0026gt; HTTP proxies may wish to translate from SPDY's absolute URIs into relative URI + Host headers to maximize compatibility with existing HTTP/1.1 servers.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Response\" /\u003eResponse\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eThe server responds to a client request with a SYN_REPLY frame. The Name/Value section of the frame contains the HTTP response headers. Symmetric to the client's upload stream, the server will follow the SYN_REPLY with a series of DATA frames, and the last data frame will contain the FLAG_FIN to indicate successful end-of-stream.\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eThe response status line is unfolded into name/value pairs like other HTTP headers and must be present:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\"status\" - The HTTP response status code (e.g. \"200\" or \"200 OK\")\u003c/span\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\"version\" - The HTTP response version (e.g. \"HTTP/1.1\")\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eIf the SPDY reply happens before a SYN_STREAM, then it includes parameters that inform the client regarding the request that would have been made to receive this response, by including url and method keys. \u003c/li\u003e\r\n\u003cli\u003eAll header names must be lowercase.\u003c/li\u003e\r\n\u003cli\u003eThe Connection and Keep-alive response headers are no longer valid.\u003c/li\u003e\r\n\u003cli\u003eContent-length is only advisory for length.\u003c/li\u003e\r\n\u003cli\u003eChunked encoding is no longer valid.\u003c/li\u003e\r\n\u003cli\u003eDuplicate header names are not allowed.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/font\u003e\r\n\u003cdiv\u003eIf a client receives a SYN_REPLY without a status or without a version header, the client must reply with a RST_STREAM frame indicating a PROTOCOL ERROR.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe): Describe use of GOAWAY.\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Server-Push-Transactions\" /\u003eServer Push Transactions\u003c/h3\u003e\r\nSPDY enables a server to send multiple replies to a client for a single request.  The rationale for this feature is that sometimes a server knows that it will need to send multiple resources in response to a single request.  Without server push features, the client must first download the primary resource, then discover the secondary resource(s), and request them.  Pushing of resources avoids this delay, but also creates a potential race where a server can be pushing content which a browser is in the process of requesting.  The following mechanics attempt to prevent the race condition while enabling the performance benefit.\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Server-Implementation\" /\u003eServer Implementation\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eWhen the server intends to push a resource to the client, it opens a new stream by sending a unidirectional SYN_STREAM.  The SYN_STREAM must include an Associated-To-Stream-ID.  The SYN_STREAM must also include a header for \"url\" which contains the full URL for the resource being pushed.  The purpose of the association is to differentiate which request induced the pushed stream; without it, if the browser had two tabs open to the same page, each pushing unique content under a fixed URL, the browser would not be able to differentiate the requests.  Server pushed streams are unidirectional, and must set the FLAG_UNIDIRECTIONAL flag in the SYN_STREAM.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eThe Associated-To-Stream-ID must be the ID of an existing, open stream with the client.  The reason for this restriction is to have a clear endpoint for pushed content.  If the client requested a resource on stream 11, the server replies on stream 11.  It can push any number of additional streams to the client before it issues a FLAG_FIN on stream 11.  However, once the originating stream is closed no further push streams may be created.  The pushed streams do not need to be closed (FIN set) before the originating stream is closed, they only need to be created before the originating stream closes.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eIt is illegal for a server to push a resource with the Associated-To-Stream-ID of 0.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo avoid race conditions with the client, the SYN_STREAM for the pushed resources must be sent prior to sending any content which could allow the client to discover the pushed resource and request it.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe server must only push resources which would have been returned from a GET request.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNote:  If the server does not have all of the Name/Value Response headers available at the time it issues the SYN_STREAM for the pushed resource, it may later use a HEADER frame to augment the name/value pairs to be associated with the pushed stream.  The HEADER frame must not contain a header for 'url' (e.g. the server can't change the identity of the resource to be pushed).  If the HEADERS frame must not contain duplicate headers with a previously sent SYN_STREAM or HEADERS frame.  The server must send a HEADERS before sending any data frames on the stream.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe):  Consider Set-Cookie effects on push streams.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Client-Implementation\" /\u003eClient Implementation\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003eWhen fetching a resource the client has 3 possibilities:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003col style\u003d\"list-style-type:decimal\"\u003e\u003cli\u003ethe resource is not being pushed\u003c/li\u003e\r\n\u003cli\u003ethe resource is being pushed, but the data has not yet arrived\u003c/li\u003e\r\n\u003cli\u003ethe resource is being pushed, and the data has started to arrive\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cdiv\u003eWhen a SYN_STREAM frame which contains an Associated-To-Stream-ID is received, the client must not issue GET requests for the URL in the pushed stream, and instead wait for the pushed stream to arrive.  \u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWhen a client receives a SYN_STREAM from the server with an Associated-To-Stream-ID of 0, it must reply with a RST_STREAM with error code INVALID_STREAM.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eWhen a client receives a SYN_STREAM from the server without an 'url' in the Name/Value section, it must reply with a RST_STREAM with error code PROTOCOL_ERROR.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo cancel server push streams, the client can use a RST_STREAM on an individual pushed stream with error code CANCEL.  Upon receipt, the server will stop sending on this stream immediately (this is an Abrupt termination).  Note that there may be data already in transit for this stream.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eTo cancel all server push streams related to a request, the client can use a RST_STREAM on the original stream with error code CANCEL.  By closing that stream, the server will no longer be able to push any streams with in-association-to for the original stream.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf the server sends a HEADER frame containing duplicate headers with a previous SYN_STREAM or HEADERS frame for the same stream, the client must reply with a RST_STREAM with error code PROTOCOL ERROR.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf the server sends a HEADER frame after sending a data frame for the same stream, the client must ignore the HEADERS frame.  \u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe):  This is really undesirable for server-push.  We want the push notifications to be able to flow asynchronously in the stream.\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#FF0000\"\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#FF0000\"\u003eTODO(mbelshe): Define how HTTP Trailers should work: \u003cspan style\u003d\"color:rgb(0,0,0);font-family:arial;font-size:small\"\u003e\"For HTTP, the rules for http trailers apply, as specified in: \u003ca href\u003d\"http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.40\" rel\u003d\"nofollow\" target\u003d\"_blank\"\u003ehttp://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.40\u003c/a\u003e\"\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont color\u003d\"#FF0000\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:arial;font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Deployment\" /\u003eDeployment\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eSince SPDY does provide faster access to resources, it should be used in preference to HTTP/HTTPS.  To facilitate this, clients and servers are encouraged to employ these features.\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Server-Advertisement-of-SPDY-through-the-HTTP-Alternate-Protocol-header\" /\u003eServer Advertisement of SPDY through the HTTP Alternate-Protocol header\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhen a server receives a non-SPDY request which could have been served via SPDY, it should append a Alternate-Protocol header into the response stream.  Note that it is valid to have multiple Alternate-Protocols headers.  The field-value can also be specified as a comma-separated list, as per RFC2616 section 4.2.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eSyntax:\u003c/span\u003e\u003c/div\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eAlternate-Protocol: \u0026lt;port\u0026gt;:\u0026lt;protocol\u0026gt;\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\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003eTo specify SPDY as an alternate protocol available on port 123, use:\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eAlternate-Protocol: 123:spdy/2\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\r\n\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\nTo specify SPDY via TLS/NPN as an alternate protocol available on port 443, use:\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eAlternate-Protocol: 443:npn-spdy/2\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eTo specify support for SPDY versions 1 and 2 (currently non-existent) via TLS/NPN as alternate protocols available on port 443, use:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\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\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003eAlternate-Protocol: 443:npn-spdy/2,443:npn-spdy/2\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\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 a client receives a Alternate-Protocol header, it should attempt to piggyback future http requests over SPDY by using the specified port.  Note that the server may reply with multiple field values or a comma-separated field value for Alternate-Protocol (and in this manner indicate the various SPDY versions it supports).  The client may select any protocol it supports and attempt to use that.  If it cannot establish a SPDY connection on that port, it should fallback to standard HTTP and persist the failure for the browser session so that it doesn't re-attempt in the near future.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Server-Advertisement-of-SPDY-through-TLS-NPN-extension\" /\u003eServer Advertisement of SPDY through TLS NPN extension\u003c/h4\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhen a server receives a connection to its HTTPS port that includes the TLS NPN extension (\u003cspan style\u003d\"font-size:13px\"\u003e\u003ca href\u003d\"http://www.ietf.org/id/draft-agl-tls-nextprotoneg-00.txt\" rel\u003d\"nofollow\"\u003ehttp://www.ietf.org/id/draft-agl-tls-nextprotoneg-00.txt\u003c/a\u003e), it should respond with all the SPDY versions that it supports.  Currently, the only valid string is \"spdy/2\" (spdy/1 isn't implemented anywhere anymore).  The client can thereby choose which SPDY version it supports and proceed from there.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Piggybacking-HTTP-requests-over-SPDY-sessions\" /\u003ePiggybacking HTTP requests over SPDY sessions\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eSPDY does not introduce a new protocol scheme specific to SPDY.  However, all HTTP requests can \"piggyback\" on an existing SPDY session.  So, if a client has successfully negotiated any SPDY session to a port that the server has indicated (via Alternate-Protocol) is an acceptable alternate protocol for the HTTP host port pair, all future http requests to that host port pair should use the SPDY session rather than opening a new HTTP connection.\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eNote:  If your site does load balancing in such a way that http content would not be available over the SPDY session, your site may not be able to use SPDY.\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\u003ch2\u003e\u003ca name\u003d\"TOC-Incompatibilities-with-SPDY-Draft-1\" /\u003eIncompatibilities with SPDY Draft #1\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eRenamed the FIN_STREAM to RST_STREAM\u003c/li\u003e\r\n\u003cli\u003eAdded the FLAG_UNIDIRECTIONAL to the SYN_STREAM\u003c/li\u003e\r\n\u003cli\u003eDefined behavior of SPDY-protocol version checking\u003c/li\u003e\r\n\u003cli\u003eMade GOAWAY message stronger - it should always be sent before closing a connection.\u003c/li\u003e\r\n\u003cli\u003eAdded Associated-To-Stream-ID into the SYN_STREAM, allowing for a stream to declare its relationship to an existing stream.\u003c/li\u003e\r\n\u003cli\u003eReworked the SUBRESOURCE frame.  Instead of first declaring a SUBRESOURCE, with an associated stream, the SYN_REPLY can be used.  Added a HEADERS frame for late-bound headers to be added to a stream.\u003c/li\u003e\r\n\u003cli\u003eReworked the Server Push mechanism.\u003c/li\u003e\u003cli\u003eAdded flow control: new WINDOW_UPDATE frame, new status code in RST_STREAM, added new field to SETTINGS for initial window size, and made SETTINGS always the first frame of the connection (still optional and asynchronous).\u003c/li\u003e\u003cli\u003eUpdated HELLO frame format and renamed to SETTINGS.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\n\u003c/font\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Future-work-experiments\" /\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eFuture work/experiments\u003c/font\u003e\u003c/h2\u003e\r\n\u003cfont face\u003d\"arial, sans-serif\"\u003e\r\nThe following are thoughts/brainstorms for future work and experiments.\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCaching\u003cbr /\u003e\r\nSince we're proposing to do almost everything over an encrypted channel, we're making caching either difficult or impossible.\u003cbr /\u003e\r\nWe've had some discussions about having a non-secure, static-only content channel (where the resources are signed, or cryptographic hashes of the insecure content are sent over a secure link), but have made no headway yet...\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\r\n\u003c/li\u003e\r\n\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDoS potential\u003c/font\u003e\u003c/li\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\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;margin-left:40px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe potential for DoS of the server (by increasing the amount of state) is no worse than it would be for TCP connections. In fact, since more of the state is managed in userspace, it is easier to detect and react to increases in resource utilization. The client side, however, does have a potential for DoS since the server may now attempt to use client resources which would not normally be considered to be large per stream state.\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:6px;margin-right:6px;margin-bottom:6px;margin-left:6px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px;font-family:Verdana;font-size:10pt;background-color:rgb(255,255,255);min-height:1100px;line-height:normal\"\u003e\r\n\u003cdiv style\u003d\"margin-left:40px\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eMore investigation needs to be done about attack modes and remediation responses.\u003c/span\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\r\n\u003c/div\u003e\r\n\u003cul style\u003d\"font-family:arial,sans-serif\"\u003e\u003cli\u003eStream capacity.\u003cbr /\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\r\n\u003cdiv style\u003d\"margin-left:40px\"\u003eToday, HTTP has no knowledge of approximate client bandwidth, and TCP only slowly and indirectly discovers it as a connection warms up. However, by the time TCP has warmed up, the page is often already completely loaded. To ensure that bandwidth is utilized efficiently, SPDY allows the client to tell the server its approximate bandwidth. The SETTINGS message is part of this, but measurement, reporting and all of the other infrastructure and behavioral modifications are lacking.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eServer-controlled connection parameters.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:arial,sans-serif\"\u003e\r\n\u003cdiv style\u003d\"margin-left:40px\"\u003eThe \"server\" -- since either side may be considered a \"server\" in SPDY, \"server\" refers here to the side which receives requests for new sessions -- can inform the other side of reasonable connection or stream limits which should be respected. As with stream capacity, the SETTINGS message provides a container for signaling this, but no work has yet been done to figure out what values should be set, when, and what behavioral changes should be expected when the value does change.\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003ePrefetching/server push\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cblockquote style\u003d\"border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eIf the client can inform the server (or vice versa) how much bandwidth it is willing to allocate to various activities, then the server can push or prefetch resources without a) impacting the activities that the user wants to perform; or b) being too inefficient. While this approach still has inefficiencies (the server still send sparts of resources that the client already has before the client gets around to sending a FIN to the server), it doesn't seem to be grossly inefficient when coupled with the client telling the server how much slack (bandwidth) it is is willing to give to the server. However, this means that the client must be able to dynamically adjust the slack that it provides for server push or prefetching, for example, if it sees an increase in PING time.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/div\u003e\r\n\u003c/span\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eRe-prioritization of streams\u003c/div\u003e\r\n\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cblockquote style\u003d\"border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eUsers often switch between multiple tabs in the browser. When the user switches tasks, the protocol should allow for a change in priority as the user now wants different data at a higher priority. This would likely involve creating priority groups so that the relative priority of resources for a tab can be managed all at once instead of having to make a number of changes proportional to the number of requests (which is 100% likely to be the same or larger!)\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cul\u003e\u003cli\u003eFlow control\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-left:40px\"\u003eEach side can announce how much data or bandwidth it will accept for each class of streams. If this is done, then speculative operations such as server push can soak up a limited amount of the pipe (especially important if the pipe is long and thin). This may allow for the elimination of more complex \"is this already in the cache\" or \"announce what I have in my cache\" schemes which are likely costly and complex.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eDNS data\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cdiv style\u003d\"font-family:arial,sans-serif\"\u003e\r\n\u003cdiv style\u003d\"margin-left:40px\"\u003eIt is suboptimal that the browser must discover new hostnames and then look them up in cases where it is fetching new resources controlled by the same entity. For example, there shouldn't be a need to do another DNS lookup for a resource from static.foo.com. when the browser has already resolved xxx.foo.com. In these cases, it would seemingly make sense to send (over the SPDY channel) the DNS data (signed in such a way that the user-agent can verify that it is authoritative).\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eRedirect to a different IP while retaining the HOST header\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-left:40px\"\u003eFor large sites or caches, it may be advantageous to supplement DNS frontend load balancing with the ability to send the user to a sibling that is less loaded, but also able to serve the request. This is not possible today with HTTP, as redirects must point to a different name (or use an IP, which amounts to the same thing), so that cookies, etc. are treated differently. This feature would likely be tied to the DNS data feature, or a more interesting verification mechanism would need to exist.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eNew headers\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eRequest headers:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eNever been to this site before header.  When the server receives this header, it is used as permission to open multiple, server-initiated streams carrying subresource content. If sent, then the server can freely push all the resources necessary for the page.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eResponse\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003eSubresource headers\u003c/span\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cli\u003eMark Nottingham notes that having the method/uri/version in separate headers, rather than at the front of the block, may make it harder for servers to quickly access this information. Being compressed hurts too.\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Contributors\" /\u003eContributors\u003c/h2\u003e\r\n\u003cdiv\u003eThank you to all those who read, commented, and contributed to this work:\u003cbr /\u003e\r\n\u003cspan\u003e    \u003c/span\u003eMike Belshe, Roberto Peon, Adam Langley, Jim Morrison, Mark Nottingham, Alyssa Wilk, Costin Manolache, William Chan, Vitaliy Lvin, Joe Chan\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/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/td\u003e\r\n\u003c/tr\u003e\r\n\u003c/tbody\u003e\r\n\u003c/table\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/385872135698932510"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft2"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3377699728661853761"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3377699728661853761"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3377699728661853761"}],"author":[{}],"sites$pageName":{"$t":"spdy-protocol-draft2"},"sites$revision":{"$t":"99"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6525918253735357368"},"published":{"$t":"2012-02-14T21:24:42.662Z"},"updated":{"$t":"2012-02-14T21:24:42.716Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-14T21:24:42.662Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"04_filled.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6525918253735357368"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6360596036256815927"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/password-generation/04_filled.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6525918253735357368"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6525918253735357368"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6525918253735357368"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6525918253735357368"}],"author":[{"name":{"$t":"Garrett Casto"},"email":{"$t":"gcasto@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8039202078672272857"},"published":{"$t":"2012-02-14T21:24:41.514Z"},"updated":{"$t":"2012-02-14T21:24:41.560Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-14T21:24:41.514Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"03_suggestion.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8039202078672272857"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6360596036256815927"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/password-generation/03_suggestion.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8039202078672272857"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8039202078672272857"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8039202078672272857"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8039202078672272857"}],"author":[{"name":{"$t":"Garrett Casto"},"email":{"$t":"gcasto@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1143954426162486600"},"published":{"$t":"2012-02-14T21:24:40.141Z"},"updated":{"$t":"2012-02-14T21:24:40.196Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-14T21:24:40.141Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"02_hover.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1143954426162486600"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6360596036256815927"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/password-generation/02_hover.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1143954426162486600"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1143954426162486600"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1143954426162486600"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1143954426162486600"}],"author":[{"name":{"$t":"Garrett Casto"},"email":{"$t":"gcasto@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1153459034905829819"},"published":{"$t":"2012-02-14T21:24:39.160Z"},"updated":{"$t":"2012-02-14T21:24:39.208Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-14T21:24:39.160Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"01_form.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1153459034905829819"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6360596036256815927"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/password-generation/01_form.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1153459034905829819"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1153459034905829819"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1153459034905829819"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1153459034905829819"}],"author":[{"name":{"$t":"Garrett Casto"},"email":{"$t":"gcasto@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9088850089521209233"},"published":{"$t":"2011-03-25T20:00:22.603Z"},"updated":{"$t":"2012-02-08T22:52:10.685Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-08T22:52:10.684Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging a Trusted Plugin on Windows"},"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\u003col\u003e\u003cli\u003eGet VS2008\u003c/li\u003e\r\n\u003cli\u003eSet up the project/Solution using the wizard: make a Win32 Console app, and then click through the wizard to modify the project to be a Win32 DLL, that exports symbols.  Visit here for more info: \u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/ms235636(v\u003dvs.80).aspx\" rel\u003d\"nofollow\"\u003ehttp://msdn.microsoft.com/en-us/library/ms235636(v\u003dvs.80).aspx\u003c/a\u003e\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli\u003eIn the project properties, turn off precompiled headers.  Do this so you can use the same #include stack in your sources to build both untrusted and trusted.\u003c/li\u003e\r\n\u003cli\u003eNote: I ran into problems using the ppapi headers that come with NaCl:\u003c/li\u003e\r\n\u003col\u003e\u003cli\u003e1\u0026gt;d:\\native_client_sdk\\toolchain\\win_x86\\nacl64\\include\\machine\\_types.h(19) : fatal error C1083: Cannot open include file: 'native_client/src/include/portability.h': No such file or directory\u003c/li\u003e\r\n\u003cli\u003eI tried -D__native_client__, but this produced even more errors.\u003c/li\u003e\r\n\u003cli\u003eTo resolve this, I copied toolchain/win_x86/nacl64/include/ppapi to sit at the same level as examples\u003c/li\u003e\r\n\u003c/ol\u003e\r\n\u003cli\u003eIn the project properties, add \u0026lt;native_client_sdk\u0026gt; to the header search paths.\u003c/li\u003e\r\n\u003cli\u003eAfter copying the ppapi headers, the project still won't build because I need to copy in the ppapi C++ sources and build them too.  I DEPSed in the ppapi sources from nacl/ppapi and added all the files in ppapi/cpp/*.cc to the VS project.\u003c/li\u003e\r\n\u003cli\u003eI had to change some source files.  When you build under nacl-gcc, things like inttypes.h (and stdint.h) are automagically part of the #include chain.  This is not so when building trusted.  In this case, I added #include \u0026lt;ppapi/c/pp_stdtype.h\u0026gt; to the files that needed it.  (Note that on Windows, there does not seem to be a \u0026lt;stdint.h\u0026gt; or \u0026lt;inttypes.h\u0026gt;).\u003c/li\u003e\r\n\u003cli\u003eEdit hello_world/hello_world.html so that the embed tag has type\u003d\"application/x-hello-world\" and no nacl\u003d attribute.\u003c/li\u003e\r\n\u003cli\u003eInstead of handling a onload event in the EMBED tag, you have to call moduleDidLoad() directly after the EMBED tag.\u003c/li\u003e\r\n\u003cli\u003eRun the local HTTP server in examples.\u003c/li\u003e\r\n\u003cli\u003eOnce the DLL is built, run \u003cfont face\u003d\"'courier new', monospace\"\u003echrome --register-pepper-plugins\u003d\"d:\\native_client_sdk\\examples\\NaClExamples\\HelloWorld\\Debug\\HelloWorld.dll;application/x-hello-world\" --user-data-dir\u003dd:\\trusted-debug-profile -\u003c/font\u003e\u003cfont face\u003d\"monospace\"\u003e-wait-for-debugger-children\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003eVisit localhost:5103 and run the hello_world example.\u003c/li\u003e\r\n\u003cli\u003eTo debug the DLL you have to attach to the right process.  It isn't clear how you find this, other than by guessing.  I had limited success in pulling up the Debug -\u0026gt; Attach... panel, then launching chrome and visiting localhost:5103/hello_world/hello_world.html, then hitting Refresh on the Attach panel and attaching the the new \"chrome.exe\" process.  I have not been able to figure out how to debug startup issues.  There are some extra debugging hints here: \u003ca href\u003d\"http://www.chromium.org/developers/how-tos/debugging\"\u003ehttp://www.chromium.org/developers/how-tos/debugging\u003c/a\u003e\u003c/li\u003e\r\n\u003c/ol\u003e\r\nImplications:\r\n\u003cdiv\u003e\r\n\u003col\u003e\u003cli\u003eThe SDK will have to DEPS in and bundle src/ppapi from the chromium project.\u003c/li\u003e\r\n\u003cli\u003eWhen building a trusted plugin, you have to use the chromium ppapi headers and build the .cc files, then switch over to different headers and link with libppapi_cpp.a to build a .nexe.  We could automate some of this by adding a build step in the SDK to build libppapi_cpp.a and bundling that library.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ePotential show-stopper\u003c/b\u003e: on Windows, there is no built-in pthreads library.  This means the pi_generator example will not build, nor will any other app that uses pthread, unless we can find a pthreads lib that we can re-distribute.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ePotential show-stopper\u003c/b\u003e: None of this work allows for .dso's, which are ELF.  These will not load on Windows.  Not sure if it's possible to make .dso's into DLLs and mimic the dynamic loading process.  dlopen() will not work for the same reason that pthreads don't work (no Windows support).\u003c/li\u003e\r\n\u003c/ol\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/4451585025687063479"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin/debugging-trusted-plugin-on-windows"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9088850089521209233"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9088850089521209233"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9088850089521209233"}],"author":[{}],"sites$pageName":{"$t":"debugging-trusted-plugin-on-windows"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6883654703379413561"},"published":{"$t":"2011-03-25T17:40:14.447Z"},"updated":{"$t":"2012-02-08T22:51:15.143Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-08T22:51:15.142Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging a Trusted Plugin 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\u003cbr /\u003e\u003ctable cellspacing\u003d\"0\" style\u003d\"width:1195px;table-layout:fixed;margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;padding-top:10px;padding-right:10px;padding-bottom:10px;padding-left:10px\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003col style\u003d\"list-style-type:decimal\"\u003e\u003cli\u003eMake an new Xcode project, use the GUI to make a Bundle project that uses Core Foundation.\u003c/li\u003e\u003cli\u003eAdd existing NaCl sources\u003c/li\u003e\u003cli\u003eDEPS in ppapi from chromium, add the C++ sources - create a Group and add the ppapi files directly.  Adding ppapi as a folder reference doesn't work.\u003c/li\u003e\u003cli\u003eSet \"Header search paths\" to point to the chromium ppapi headers (|SDK_root|/third_party), NOT the built-in NaCl headers.\u003c/li\u003e\u003cli\u003eAdd the SDK root to \"Header Search Paths\"\u003c/li\u003e\u003cli\u003eBuild the plugin.\u003c/li\u003e\u003cli\u003eEdit hello_world/hello_world.html so that the embed tag has type\u003d\"application/x-hello-world\" and no nacl\u003d attribute.\u003c/li\u003e\u003cli\u003eInstead of handling a onload event in the EMBED tag, you have to call moduleDidLoad() directly after the EMBED tag.\u003c/li\u003e\u003cli\u003eMake sure to uncheck \"Load Symbols Lazily\" in the Debugging panel of Xcode preferences.\u003c/li\u003e\u003cli\u003eTo debug, you have to use Chromium - best is to get a waterfall build from \u003cfont face\u003d\"'courier new', monospace\"\u003ehttp://build.chromium.org/f/chromium/snapshots/Mac/\u003c/font\u003e.  This style of debugging is not supported with Google Chrome Dev Channel\u003c/li\u003e\u003col style\u003d\"list-style-type:decimal\"\u003e\u003cli\u003eIn Xcode, ctrl-click on \"Executables\" and select \"Add Custom Executable…\".\u003c/li\u003e\u003cli\u003eCall the new custom exec, say, \"Chromium Dev\"\u003c/li\u003e\u003cli\u003ePoint it at the .app wrapper for Chromium that you got from the waterfall, e.g. ~/Downloads/chrome-mac/Chromium.app.\u003c/li\u003e\u003cli\u003eAdd these arguments in the Arguments tab:\u003c/li\u003e\u003col style\u003d\"list-style-type:decimal\"\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e--user-data-dir\u003d/tmp/nacl-debug-profile\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e--register-pepper-plugins\u003d\"$HOME/Source/nacl-sdk/src/examples/hello_world/HelloWorld/build/Debug/HelloWorld.bundle;application/x-hello-world\"\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e--single-process\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003efile://$HOME/Source/nacl-sdk/src/examples/hello_world/hello_world.html\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eIt is possible to debug a plugin using Chrome Dev channel, but it's a little more raw:\u003c/font\u003e\u003c/li\u003e\u003col style\u003d\"list-style-type:decimal\"\u003e\u003cli\u003eIn a shell, run Chrome like this: \u003cfont face\u003d\"'courier new', monospace\"\u003eGoogle\\ Chrome.app/Contents/MacOS/Google\\ Chrome --user-data-dir\u003d/tmp/nacl-debug-profile --register-pepper-plugins\u003d\"$HOME/Source/nacl-sdk/src/examples/hello_world/HelloWorld/build/Debug/HelloWorld.bundle;application/x-hello-world\" file://$HOME/Source/nacl-sdk/src/examples/hello_world/hello_world.html\u003c/font\u003e\u003c/li\u003e\u003cli\u003eIn Chrome, create a new tab and visit \u003cfont face\u003d\"'courier new', monospace\"\u003eabout:memory\u003c/font\u003e, this will list the PID of the plugin tab.\u003c/li\u003e\u003cli\u003eIn Xcode, Run -\u0026gt; Attach To Process, then pick the appropriate PID.\u003c/li\u003e\u003col style\u003d\"list-style-type:decimal\"\u003e\u003cli\u003eNote: if you get various errors about formatting, just click \"Continue\"\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\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/4451585025687063479"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin/trusted-debugging-on-mac"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6883654703379413561"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6883654703379413561"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6883654703379413561"}],"author":[{"name":{"$t":"Michael Linck"},"email":{"$t":"mlinck@chromium.org"}}],"sites$pageName":{"$t":"trusted-debugging-on-mac"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1688163658707732483"},"published":{"$t":"2011-04-27T17:50:49.703Z"},"updated":{"$t":"2012-02-08T22:50:24.779Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-08T22:50:24.779Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging a Trusted Plugin on Linux"},"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\u003cbr /\u003e\u003col\u003e\u003cli\u003eGet a Chromium check-out.  You can usually use the revision from the nacl-sdk DEPS file.\u003c/li\u003e\u003cli\u003eYou don’t need to build all of chromium, just pepper.\u003c/li\u003e\u003col\u003e\u003cli\u003eGo to the src/ directory in your check-out\u003c/li\u003e\u003cli\u003etype: ‘make ppapi_tests’ to build the pepper tests as well as any libraries they depend on.  You’ll end up with libppapi_cpp.a and libppapi_cpp_object.a.\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eBuild trusted version of the code\u003c/li\u003e\u003col\u003e\u003cli\u003eFor a C plugin you don’t have to link against anything.  ppapi C is all headers.\u003c/li\u003e\u003cli\u003eFor C++, you need libppapi_cpp.a and libppapi_cpp_objects.a.  Link against ppapi_cpp_objects and ppapi_cpp from chrome.\u003c/li\u003e\u003col\u003e\u003cli\u003elink order matters: ppapi_cpp_objects has to come before ppapi_cpp\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eBe sure to specify -fno-rtti and -fPIC since chrome does not build run-time type information by default, and you’ll be generating a shared library as your plugin.\u003c/li\u003e\u003cli\u003eFor the linking step, be sure to specify -shared\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eTo load your plugin, your application will need an embed tag.  For trusted plugins this should not have a “nacl” but a regular “type” attribute, for example: type\u003d\"application/x-hello-world\"\u003c/li\u003e\u003cli\u003eUnlike with an untrusted plugin, instead of handling a onload event in the EMBED tag, you have to call moduleDidLoad() directly after the EMBED tag.\u003c/li\u003e\u003cli\u003eTo debug, you have to use Chromium - best is to get a waterfall for your platform build from http://build.chromium.org/f/chromium/snapshots/  You can also finish the chromium build you checked out but be prepared to wait a while.  This style of debugging is not supported with Google Chrome Dev Channel\u003c/li\u003e\u003cli\u003eIn a shell, launch chrome with the following arguments: \u003c/li\u003e\u003col\u003e\u003cli\u003e--user-data-dir\u003d/tmp/nacl_debugging_chrome_profile\u003c/li\u003e\u003cli\u003e--register-pepper-plugins\u003d\"location/of/your/plugin.so;application/x-hello-world\"\u003c/li\u003e\u003cli\u003e--single-process \u003c/li\u003e\u003cli\u003efile://location/of/your/web_page.html\u003c/li\u003e\u003c/ol\u003e\u003cli\u003eIn Chrome, create a new tab and visit about:memory, this will list the pid of the plugin tab.\u003c/li\u003e\u003cli\u003eYou can now use gdb to attach to the pid and debug your plugin\u003c/li\u003e\u003c/ol\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/4451585025687063479"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin/debugging-a-trusted-plugin-on-linux"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1688163658707732483"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1688163658707732483"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1688163658707732483"}],"author":[{"name":{"$t":"Michael Linck"},"email":{"$t":"mlinck@chromium.org"}}],"sites$pageName":{"$t":"debugging-a-trusted-plugin-on-linux"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4451585025687063479"},"published":{"$t":"2012-02-08T22:49:16.617Z"},"updated":{"$t":"2012-02-08T22:49:56.627Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-08T22:49:56.627Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Debugging a Trusted Plugin"},"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\"\u003eIn some cases it can be useful to develop/port your Native Client module using a two-step process, first as a non-portable trusted Pepper plugin for Windows, Mac, or Linux, then porting to Native Client. In particular this approach allows you to use the standard debuggers and tools from your preferred desktop operating system during trusted plugin development.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eDevelopers should be mindful of the following potential issues when planning this course of development:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eSome libraries commonly used with Native Client will not build easily on all operating systems.\u003c/li\u003e\u003cli\u003eThreading models differ between trusted Pepper and untrusted Pepper implementations.\u003c/li\u003e\u003cli\u003eExtra effort may be required to get source to compile with multiple different compilers, for example GCC vs. MS Visual Studio.\u003c/li\u003e\u003cli\u003eCertain operations such as platform-specific library calls and system calls may succeed during trusted development but fail in Native Client. \u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003eWith this in mind, these sub-pages provide some tips on working with trusted Pepper plugins on Windows, Mac and Linux.\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/924743253795182224"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/debugging-documentation/debugging-a-trusted-plugin"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4451585025687063479"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4451585025687063479"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4451585025687063479"}],"author":[{}],"sites$pageName":{"$t":"debugging-a-trusted-plugin"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/521366527991152016"},"published":{"$t":"2012-02-03T11:03:50.817Z"},"updated":{"$t":"2012-02-03T11:03:50.835Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-02-03T11:03:50.817Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Waterfall.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/521366527991152016"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4013094278607135655"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tree-sheriffs/sheriff-details-chromium/Waterfall.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/521366527991152016"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/521366527991152016"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/521366527991152016"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/521366527991152016"}],"author":[{"name":{"$t":"Alexander Potapenko"},"email":{"$t":"glider@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Wyl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6936503372791019790"},"published":{"$t":"2009-11-11T18:45:59.270Z"},"updated":{"$t":"2012-01-28T18:43:41.765Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-28T18:43:41.764Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"SPDY: An experimental protocol for a faster web"},"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 style\u003d\"font-family:Verdana\"\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-Executive-summary\" /\u003eExecutive summary\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003eAs part of the \u003ca href\u003d\"http://code.google.com/speed/\" title\u003d\"\u0026quot;Let's make the web faster\u0026quot;\"\u003e\"Let's make the web faster\"\u003c/a\u003e initiative, we are experimenting with alternative protocols to help reduce the latency of web pages. One of these experiments is SPDY (pronounced \"SPeeDY\"), an application-layer protocol for transporting content over the web, designed specifically for minimal latency.  In addition to a specification of the protocol, we have developed a SPDY-enabled Google Chrome browser and open-source web server. In lab tests, we have compared the performance of these applications over HTTP and SPDY, and have observed up to 64% reductions in page load times in SPDY. We hope to engage the open source community to contribute ideas, feedback, code, and test results, to make SPDY the next-generation application protocol for a faster web. \u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-Background:-web-protocols-and-web-latency\" /\u003eBackground: web protocols and web latency\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont size\u003d\"2\"\u003eToday, HTTP and TCP are the protocols of the web.  TCP is the generic, reliable transport protocol, providing guaranteed delivery, duplicate suppression, in-order delivery, flow control, congestion avoidance and other transport features.  HTTP is the application level protocol providing basic request/response semantics. While we believe that there may be opportunities to improve latency at the transport layer, our initial investigations have focussed on the application layer, HTTP. \u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont size\u003d\"2\"\u003eUnfortunately, HTTP was not particularly designed for latency.  Furthermore, the web pages transmitted today are significantly different from web pages 10 years ago and demand improvements to HTTP that could not have been anticipated when HTTP was developed. The following are some of the features of HTTP that inhibit optimal performance:\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eSingle request per connection. Because HTTP can only fetch one resource at a time (HTTP pipelining helps, but still enforces only a FIFO queue), a server delay of 500 ms prevents reuse of the TCP channel for additional requests.  Browsers work around this problem by using multiple connections.  Since 2008, most browsers have finally moved from 2 connections per domain to 6\u003c/font\u003e. \u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eExclusively client-initiated requests. In HTTP, only the client can initiate a request. Even if the server knows the client needs a resource, it has no mechanism to inform the client and must instead wait to receive a request for the resource from the client.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eUncompressed request and response headers. Request headers today vary in size from ~200 bytes to over 2KB.  As applications use more cookies and user agents expand features, typical header sizes of 700-800 bytes is common.\u003c/font\u003e\u003cfont size\u003d\"2\"\u003e \u003cfont size\u003d\"2\"\u003eFor modems or ADSL connections, in which the uplink bandwidth is fairly low, this latency can be significant. \u003c/font\u003eReducing the data in headers could directly improve the serialization latency to send requests.  \u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eRedundant headers. In addition, several headers are repeatedly sent across requests on the same channel. However, headers such as the User-Agent, Host, and Accept* are generally static and do not need to be resent.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eOptional data compression. HTTP uses optional compression encodings for data. Content should always be sent in a compressed format. \u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-Previous-approaches\" /\u003ePrevious approaches\u003c/h3\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eSPDY is not the only research to make HTTP faster. \u003c/span\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003eThere have been other proposed solutions to web latency, mostly at the level of the transport or session layer:\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.sctp.org/\" rel\u003d\"nofollow\" style\u003d\"color:rgb(85,26,139)\" target\u003d\"_blank\" title\u003d\"Stream Control Transmission Protocol\"\u003e\u003cfont size\u003d\"2\"\u003eStream Control Transmission Protocol\u003c/font\u003e\u003c/a\u003e\u003cfont size\u003d\"2\"\u003e (SCTP) -- a transport-layer protocol to replace TCP, which provides multiplexed streams and stream-aware congestion control.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://tools.ietf.org/html/draft-natarajan-http-over-sctp-00\" rel\u003d\"nofollow\" target\u003d\"_blank\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eHTTP over SCTP\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-size:small\"\u003e -- a proposal for running HTTP over SCTP. \u003ca href\u003d\"http://www.cis.udel.edu/%7Eleighton/\" rel\u003d\"nofollow\" target\u003d\"_blank\"\u003eComparison of HTTP Over SCTP and TCP in High Delay Networks\u003c/a\u003e describes a research study comparing the performance over both transport protocols. \u003c/span\u003e\u003ca href\u003d\"http://tools.ietf.org/html/draft-natarajan-http-over-sctp-00\" rel\u003d\"nofollow\" target\u003d\"_blank\" /\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003e\u003ca href\u003d\"http://pdos.csail.mit.edu/uia/sst/\" rel\u003d\"nofollow\"\u003eStructured Stream Transport\u003c/a\u003e\u003c/font\u003e\u003cfont size\u003d\"2\"\u003e (SST) -- \u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cspan style\u003d\"font-size:small\"\u003ea protocol which invents \"structured streams\": lightweight, independent streams to be carried over a common transport. \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cfont size\u003d\"2\"\u003eIt replaces TCP or runs on top of UDP.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://www.w3.org/Protocols/MUX/\" rel\u003d\"nofollow\" target\u003d\"_blank\" title\u003d\"Simon Spero's MUX\"\u003e\u003cfont size\u003d\"2\"\u003eMUX\u003c/font\u003e\u003c/a\u003e\u003cfont size\u003d\"2\"\u003e and \u003c/font\u003e\u003ca href\u003d\"http://www.w3.org/TR/WD-mux\" rel\u003d\"nofollow\" target\u003d\"_blank\" title\u003d\"Jim Getty's SMUX\"\u003e\u003cfont size\u003d\"2\"\u003eSMUX\u003c/font\u003e\u003c/a\u003e\u003cfont size\u003d\"2\"\u003e -- intermediate-layer protocols (in between the transport and application layers) that provide multiplexing of streams. They were proposed years ago at the same time as HTTP/1.1. \u003c/font\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\nThese proposals offer solutions to some of the web's latency problems, but not all. The problems inherent in HTTP (compression, prioritization, etc.) should still be fixed, regardless of the underlying transport protocol. In any case, in practical terms, changing the transport is very difficult to deploy. Instead, we believe that there is much low-hanging fruit to be gotten by addressing the shortcomings at the application layer. Such an approach requires minimal changes to existing infrastructure, and (we think) can yield significant performance gains.\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-Goals-for-SPDY\" /\u003eGoals for SPDY\u003c/h2\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont size\u003d\"2\"\u003eThe SPDY project defines and implements an application-layer protocol for the web which greatly reduces latency. The high-level goals for SPDY are:\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eTo target a 50% reduction in page load time. Our preliminary results have come close to this target (see below).\u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eTo minimize deployment complexity. SPDY uses TCP as the underlying transport layer, so requires no changes to existing networking infrastructure.  \u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eTo avoid the need for any changes to content by website authors. The only changes required to support SPDY are in the client user agent and web server applications.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"2\"\u003eTo bring together like-minded parties interested in exploring protocols as a way of solving the latency problem. We hope to develop this new protocol in partnership with the open-source community and industry specialists.\u003c/font\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003eSome specific technical goals are:\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eTo allow many concurrent HTTP requests to run across a single TCP session.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eTo reduce the bandwidth currently used by HTTP by compressing headers and eliminating unnecessary headers.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eTo define a protocol that is easy to implement and server-efficient. We hope to reduce the complexity of HTTP by cutting down on edge cases and defining easily parsed message formats.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eTo make SSL the underlying transport protocol, for better security and compatibility with existing network infrastructure. Although SSL does introduce a latency penalty, we believe that the long-term future of the web depends on a secure network connection. In addition, the use of SSL is necessary to ensure that communication across existing proxies is not broken.  \u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eTo enable the server to initiate communications with the client and push data to the client whenever possible.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003e\u003cfont size\u003d\"4\"\u003eSPDY design and features\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eSPDY adds a session layer atop of SSL that allows for multiple concurrent, interleaved streams over a single TCP connection. \u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eThe usual HTTP GET and POST message formats remain the same; however, SPDY specifies a new framing format for encoding and transmitting the data over the wire.\u003c/p\u003e\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cbr /\u003e\u003c/p\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e \u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-whitepaper/soarjOjSeS5hoFYvjtAnxCg.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1258490355439/spdy/spdy-whitepaper/soarjOjSeS5hoFYvjtAnxCg.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eStreams are bi-directional, i.e. can be initiated by the client and server. \u003c/div\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eSPDY aims to achieve lower latency through basic (always enabled) and advanced (optionally enabled) features.\u003c/p\u003e\r\n\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-Basic-features\" /\u003eBasic features\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\" /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont color\u003d\"#3399ff\" face\u003d\"Arial, sans-serif\"\u003e\u003cfont color\u003d\"#000000\" face\u003d\"Verdana\" size\u003d\"3\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cb\u003eMultiplexed streams\u003c/b\u003e\u003c/i\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cblockquote style\u003d\"border-style:none;border-width:medium;margin:0pt 0pt 0pt 40px;padding:10px\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eSPDY allows for unlimited concurrent streams over a single TCP connection. Because requests are interleaved on a single channel, the efficiency of TCP is much higher: fewer network connections need to be made, and fewer, but more densely packed, packets are issued.\u003c/p\u003e\r\n\u003c/blockquote\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003ci\u003e\u003cb\u003eRequest prioritization\u003c/b\u003e\u003c/i\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eAlthough unlimited parallel streams solve the serialization problem, they introduce another one: if bandwidth on the channel is constrained,\u003cfont size\u003d\"2\"\u003e the client may block requests for fear of clogging the channel. To overcome this problem, SPDY implements request priorities\u003c/font\u003e\u003cfont size\u003d\"3\"\u003e\u003cfont size\u003d\"2\"\u003e: the client can request as many items as it wants from the server, and assign a priority to each request. This prevents the network channel from being \u003cfont size\u003d\"2\"\u003econgested with non-critical resources when a high priority request is pending\u003c/font\u003e\u003cfont size\u003d\"2\"\u003e. \u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cb\u003eHTTP header compression\u003c/b\u003e\u003c/i\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cblockquote style\u003d\"border-style:none;border-width:medium;margin:0pt 0pt 0pt 40px;padding:10px\"\u003eSPDY compresses request and response HTTP headers, resulting in fewer packets and fewer bytes transmitted.\u003cbr /\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-Advanced-features\" /\u003eAdvanced features\u003c/h3\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003eIn addition, SPDY provides an advanced feature, \u003ci\u003eserver-initiated streams\u003c/i\u003e. Server-initiated streams can be used to deliver content to the client without the client needing to ask for it. This option is configurable by the web developer in two ways:\u003c/font\u003e\u003c/p\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/p\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ci\u003e\u003cb\u003eServer push\u003c/b\u003e\u003c/i\u003e\u003cb\u003e.\u003c/b\u003e \u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cblockquote style\u003d\"border-style:none;border-width:medium;margin:0pt 0pt 0pt 40px;padding:10px\"\u003e\u003cfont size\u003d\"2\"\u003eSPDY experiments with an option for servers to push data to clients via the X-Associated-Content header. This header informs the client that the server is pushing a resource to the client before the client has asked for it.  For initial-page downloads (e.g. the first time a user visits a site), this can vastly enhance the user experience.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/blockquote\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003ci\u003e\u003cb\u003eServer hint\u003c/b\u003e\u003c/i\u003e. \u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cblockquote style\u003d\"border-style:none;border-width:medium;margin:0pt 0pt 0pt 40px;padding:10px\"\u003e\u003cfont size\u003d\"2\"\u003eRather than automatically pushing resources to the client, the server uses the \u003c/font\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"2\"\u003eX-Subresources header to \u003ci\u003esuggest\u003c/i\u003e to the client that it should ask for specific resources, in cases where the server knows in advance of the client that those resources will be needed. However, the server will still wait for the client request before sending the content.\u003c/font\u003e\u003c/font\u003e\u003cfont size\u003d\"2\"\u003e  Over slow links, this option can reduce the time it takes for a client to discover it needs a resource by hundreds of milliseconds, and may be better for non-initial page loads.\u003c/font\u003e\u003c/blockquote\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003eFor technical details, see the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/spdy/spdy-protocol/spdy-protocol-draft1\" target\u003d\"_blank\"\u003eSPDY draft protocol specification\u003c/a\u003e. \u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-SPDY-implementation:-what-we-ve-built\" /\u003eSPDY implementation: what we've built\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eThis is what we have built:\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin:0px 0pt 0px 1.5em\"\u003e\u003cli style\u003d\"margin:0px 0pt\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eA high-speed, in-memory server which can serve both HTTP and SPDY responses efficiently, over TCP and SSL. We will be releasing this code as open source in the near future.\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin:0px 0pt;text-align:left\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eA modified Google Chrome client which can use HTTP or SPDY, over TCP and SSL. The source code is at \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/net/spdy/\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/net/spdy/\u003c/a\u003e. (Note that code currently uses the internal code name of \"flip\"; this will change in the near future.)\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin:0px 0pt;text-align:left\"\u003e\r\n\u003cp style\u003d\"margin:0px;direction:inherit\"\u003eA testing and benchmarking infrastructure that verifies pages are replicated with high fidelity. In particular, we ensure that SPDY preserves origin server headers, content encodings, URLs, etc. We will be releasing our testing tools, and instructions for reproducing our results, in the near future.\u003cbr /\u003e\r\n\u003c/p\u003e\r\n\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch3 style\u003d\"font-size:12pt\"\u003e\u003ca name\u003d\"TOC-Preliminary-results\" /\u003ePreliminary results\u003c/h3\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eWith the prototype Google Chrome client and web server that we developed, we ran a number of lab tests to benchmark SPDY performance against that of HTTP.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nWe downloaded 25 of the \"top 100\" websites over simulated home network connections, with 1% packet loss. We ran the downloads 10 times for each site, and calculated the average page load time for each site, and across all sites. The results show a speedup over HTTP of 27% - 60% in page load time over plain TCP (without SSL), and 39% - 55% over SSL.\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003ci\u003eTable 1: Average page load times for top 25 websites\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#000000\" cellpadding\u003d\"3\" cellspacing\u003d\"0\" height\u003d\"147\" style\u003d\"font-size:1em;line-height:inherit;border-collapse:collapse\" width\u003d\"850\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd colspan\u003d\"2\" style\u003d\"direction:inherit\"\u003eDSL 2 Mbps downlink, 375 kbps uplink\u003c/td\u003e\r\n\u003ctd colspan\u003d\"2\" style\u003d\"direction:inherit\"\u003eCable 4 Mbps downlink, 1 Mbps uplink\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cb\u003eA\u003c/b\u003e\u003cb\u003everage ms\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cb\u003eSpeedup\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cb\u003eAverage ms\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cb\u003eSpeedup\u003c/b\u003e\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eHTTP\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e3111.916\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e2348.188\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eSPDY basic multi-domain* connection / TCP\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e2242.756\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e27.93%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1325.46\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e43.55%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eSPDY basic single-domain* connection / TCP\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1695.72\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e45.51%\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e933.836\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e60.23%\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eSPDY single-domain + server push / TCP\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1671.28\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e46.29%\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e950.764\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e59.51%\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eSPDY single-domain + server hint / TCP\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1608.928\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e48.30%\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e856.356\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e63.53%\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eSPDY basic single-domain / SSL\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1899.744\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e38.95%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1099.444\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e53.18\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003eSPDY single-domain + client prefetch / SSL\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1781.864\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e42.74%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e1047.308\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"20%\"\u003e55.40%\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\n* In many cases, SPDY can stream all requests over a single connection, regardless of the number of different domains from which requested resources originate. This allows for full parallelization of all downloads. However, in some cases, it is not possible to collapse all domains into a single domain. In this case, SPDY must still open a connection for each domain, incurring some initial RTT overhead for each new connection setup. We ran the tests in both modes: collapsing all domains into a single domain (i.e. one TCP connection); and respecting the actual partitioning of the resources according to the original multiple domains (\u003d one TCP connection per domain). We include the results for both the strict \"single-domain\" and \"multi-domain\" tests; we expect real-world results to lie somewhere in the middle.\u003c/div\u003e\r\n\u003ch4 style\u003d\"font-size:10pt\"\u003e\u003ca name\u003d\"TOC-The-role-of-header-compression\" /\u003eThe role of header compression\u003c/h4\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eHeader compression resulted in an ~88% reduction in the size of request headers and an ~85% reduction in the size of response headers. On the lower-bandwidth DSL link, in which the upload link is only 375 Kbps, request header compression in particular, led to significant page load time improvements for certain sites (i.e. those that issued large number of resource requests). We found a reduction of 45 - 1142 ms in page load time simply due to header compression.\u003c/div\u003e\r\n\u003ch4 style\u003d\"font-size:10pt\"\u003e\u003ca name\u003d\"TOC-The-role-of-packet-loss-and-round-trip-time-RTT-\" /\u003eThe role of packet loss and round-trip time (RTT)\u003c/h4\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eWe did a second test run to determine if packet loss rates and round-trip times (RTTs) had an effect on the results. For these tests, we measured only the cable link, but simulated variances in packet loss and RTT. \u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eWe discovered that SPDY's latency savings increased proportionally with increases in packet loss rates, up to a 48% speedup at 2%. (The increases tapered off above the 2% loss rate, and completely disappeared above 2.5%. In the real world, packets loss rates are typically 1-2%, and RTTs average 50-100 ms in the U.S.) The reasons that SPDY does better as packet loss rates increase are several: \u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eSPDY sends ~40% fewer packets than HTTP, which means fewer packets affected by loss.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eSPDY uses fewer TCP connections, which means fewer chances to lose the SYN packet. In many TCP implementations, this delay is disproportionately expensive (up to 3 s).\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eSPDY's more efficient use of TCP usually triggers TCP's fast retransmit instead of using retransmit timers. \u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eWe discovered that SPDY's latency savings also increased proportionally with increases in RTTs, up to a 27% speedup at 200 ms. The  The reason that SPDY does better as RTT goes up is because SPDY fetches all requests in parallel. If an HTTP client has 4 connections per domain, and 20 resources to fetch, it would take roughly 5 RTs to fetch all 20 items.  SPDY fetches all 20 resources in one RT.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ci\u003eTable 2: Average page load times for top 25 websites by packet loss rate\u003c/i\u003e\u003cbr /\u003e\r\n\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#000000\" cellpadding\u003d\"3\" cellspacing\u003d\"0\" height\u003d\"194\" style\u003d\"font-size:1em;line-height:inherit;border-collapse:collapse\" width\u003d\"581\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd colspan\u003d\"2\" style\u003d\"direction:inherit;font-family:arial,sans-serif\"\u003eAverage ms\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003eSpeedup\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003ePacket loss rate\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003eHTTP\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003eSPDY basic (TCP)\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e0%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1152\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1016\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e11.81%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e0.5%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1638\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1105\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e32.54%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e2060\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1200\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e41.75%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1.5%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e2372\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1394\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e41.23%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e2%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e2904\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1537\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e47.7%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e2.5%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e3028\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e1707\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit;font-family:arial,sans-serif\" width\u003d\"25%\"\u003e43.63%\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\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003ci\u003e\u003cbr /\u003e\r\n\u003c/i\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont color\u003d\"#000000\" face\u003d\"Arial,sans-serif\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003cfont face\u003d\"Arial, sans-serif\"\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003ci\u003eTable 3: Average page load times for top 25 websites by RTT\u003c/i\u003e\u003cbr /\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003ctable border\u003d\"1\" bordercolor\u003d\"#000000\" cellpadding\u003d\"3\" cellspacing\u003d\"0\" height\u003d\"220\" style\u003d\"font-size:1em;line-height:inherit;border-collapse:collapse\" width\u003d\"582\"\u003e\r\n\u003ctbody\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e\u003cb\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd colspan\u003d\"2\" style\u003d\"direction:inherit\"\u003e\u003cb\u003eAverage ms\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e\u003cb\u003eSpeedup\u003c/b\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e\u003cb\u003eRTT in ms\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e\u003cb\u003eHTTP\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e\u003cb\u003eSPDY basic (TCP)\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e20\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1240\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1087\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e12.34%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e40\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1571\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1279\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e18.59%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e60\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1909\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1526\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e20.06%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e80\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e2268\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e1727\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e23.85%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e120\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e2927\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e2240\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e23.47%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e160\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e3650\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e2772\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e24.05%\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003c/tr\u003e\r\n\u003ctr style\u003d\"text-align:left\"\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e200\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e4498\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e3293\u003cbr /\u003e\r\n\u003c/td\u003e\r\n\u003ctd style\u003d\"direction:inherit\" width\u003d\"25%\"\u003e26.79%\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/font\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\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\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-SPDY-next-steps:-how-you-can-help\" /\u003eSPDY next steps: how you can help\u003c/h2\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eOur initial results are promising, but we don't know how well they represent the real world. In addition, there are still areas in which SPDY could improve. In particular:\u003cbr /\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eBandwidth efficiency is still low. Although dialup bandwidth efficiency rate is close to 90%, for high-speed connections efficiency is only about ~32%.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eSSL poses other latency and deployment challenges. Among these are: the additional RTTs for the SSL handshake; encryption; difficulty of caching for some proxies. We need to do more SSL tuning.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eOur packet loss results are not conclusive. Although much research on packet-loss has been done, we don't have enough data to build a realistic model model for packet loss on the Web. We need to gather this data to be able to provide more accurate packet loss simulations.\u003cbr /\u003e\r\n\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eSPDY single connection loss recovery sometimes underperforms multiple connections. That is, opening multiple connections is still faster than losing a single connection when the RTT is very high. We need to figure out when it is appropriate for the SPDY client to make a new connection or close an old connection and what effect this may have on servers.\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eThe server can implement more intelligence than we have built in so far. We need more research in the areas of server-initiated streams, obtaining client network information for prefetching suggestions, and so on.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cbr /\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\" /\u003e\r\nTo help with these challenges, we encourage you to get involved:\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eSend feedback, comments, suggestions, ideas to the \u003ca href\u003d\"http://groups.google.com/group/chromium-discuss?pli\u003d1\" title\u003d\"chromium-discuss discussion group\"\u003echromium-discuss discussion group\u003c/a\u003e.\u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eDownload, build, run, and test the \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/net/spdy/\" title\u003d\"Google Chrome client code\"\u003eGoogle Chrome client code\u003c/a\u003e. \u003cbr /\u003e\r\n\u003c/font\u003e\u003c/li\u003e\r\n\u003cli style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003eContribute improvements to the code base.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\u003ch2 style\u003d\"font-size:14pt\"\u003e\u003ca name\u003d\"TOC-SPDY-frequently-asked-questions\" /\u003eSPDY frequently asked questions\u003c/h2\u003e\r\n\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:normal;font-family:verdana,sans-serif\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003eQ: Doesn't HTTP pipelining already solve the latency problem?\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eA: No. While pipelining does allow for multiple requests to be sent in parallel over a single TCP stream, it is still but a single stream.  Any delays in the processing of anything in the stream (either a long request at the head-of-line or packet loss) will delay the entire stream.  Pipelining has proven difficult to deploy, and because of this remains disabled by default in all of the major browsers.\u003c/div\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003cbr style\u003d\"font-family:verdana,sans-serif\" /\u003e\r\n\u003cfont size\u003d\"4\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003eQ: Is SPDY a replacement for HTTP?\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eA: No. SPDY replaces some parts of HTTP, but mostly augments it. At the highest level of the application layer, the request-response protocol remains the same. SPDY still uses HTTP methods, headers, and other semantics. But SPDY overrides other parts of the protocol, such as connection management and data transfer formats.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-size:13px;border-collapse:collapse\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eQ: Why did you choose this name?\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eA:\r\nWe wanted a name that captures speed. SPDY, pronounced \"SPeeDY\",\r\ncaptures this and also shows how compression can help improve speed.\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003eQ: Should SPDY change the transport layer?\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eA: More research should be done to determine if an alternate transport could reduce latency.  However, replacing the transport is a complicated endeavor, and if we can overcome the inefficiencies of TCP and HTTP at the application layer, it is simpler to deploy.\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cb\u003eQ: TCP has been time-tested to avoid congestion and network collapse.  Will SPDY break the Internet?\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003eA: No.  SPDY runs atop TCP, and benefits from all of TCP's congestion control algorithms.  Further, HTTP has already changed the way congestion control works on the Internet.  For example, HTTP clients today open up to 6 concurrent connections to a single server; at the same time, some HTTP servers have increased the initial congestion window to 4 packets. Because TCP independently throttles each connection, servers are effectively sending up to 24 packets in an initial burst.  The multiple connections side-step TCP's slow-start. SPDY, by contrast, implements multiple streams over a single connection. \u003c/font\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\r\n\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003eQ: What about SCTP?\u003c/b\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003e\u003cbr /\u003e\r\n\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eA: SCTP is an interesting potential alternate transport, which offers multiple streams over a single connection. However, again, it requires changing the transport stack, which will make it very difficult to deploy across existing home routers. \u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont size\u003d\"2\"\u003eAlso, SCTP alone isn't the silver bullet; application-layer changes still need to be made to efficiently use the channel between the server and client.\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003eQ: What about BEEP?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;direction:inherit\"\u003eA: While BEEP is an interesting protocol which offers a similar grab-bag of features, it doesn't focus on reducing the page load time. It is missing a few features that make this possible. Additionally, it uses text-based framing for parts of the protocol instead of binary framing. This is wonderful for a protocol which strives to be as extensible as possible, but offers some interesting security problems as it is more difficult to parse correctly.\u003c/div\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003c/font\u003e\u003c/span\u003e\u003c/font\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/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/5048080902362104097"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/spdy/spdy-whitepaper"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6936503372791019790"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6936503372791019790"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6936503372791019790"}],"author":[{}],"sites$pageName":{"$t":"spdy-whitepaper"},"sites$revision":{"$t":"22"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7387838865489593366"},"published":{"$t":"2012-01-23T23:06:32.871Z"},"updated":{"$t":"2012-01-23T23:06:32.882Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-23T23:06:32.871Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"dot.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7387838865489593366"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4883956482089151969"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/profile-architecture/dot.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7387838865489593366"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7387838865489593366"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7387838865489593366"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7387838865489593366"}],"author":[{"name":{"$t":"Elliot Glaysher"},"email":{"$t":"erg@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},"published":{"$t":"2012-01-11T18:56:12.002Z"},"updated":{"$t":"2012-01-11T22:38:07.071Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T22:38:07.070Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Omnibox History Quick Provider Index Caching"},"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-Why-Caching-is-Important-in-this-Case\" /\u003e\u003cb\u003eWhy Caching is Important in this Case\u003c/b\u003e\u003c/h2\u003e\u003cdiv\u003eThe internal indexes for the HQP can take some time to build from scratch. This is done by querying all records in the the URL visit history database. Instances of this database have grown to have tens of thousands of entries reaching over 100 MB in size. Building the HQP indexes at startup from such a large database would delay the availability of this feature noticeably and would have a noticeable impact on the responsiveness of the browser.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe objective then is to eliminate having to rebuild the internal indexes used by the HQP. Once that index data has been built, the HQP saves it into a profile-specific cache file. (The name of this file is 'History Provider Cache'.) At profile startup, this cache file is read and used to repopulate the HQP index data. At profile shutdown the HQP index data is written to the cache file.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eInitially, Pickle was being used as the binary encoding mechanism for recording the cache file and the transaction file. During subsequent discussions, some discomfort was expressed with Pickle as its primary client is IPC, not large file encoding. As a result, the encoding mechanism was changed to Protocol Buffers which is where the implementation stands today. There are drawbacks to both Pickle and Protocol Buffers as the cache is only updated at browser shutdown.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eA snapshot-based approach, as currently used, would benefit from having a transaction journal file into which new, changed and deleted visits would be record. This transaction file would be kept constantly updated and then used at profile startup to make adjustments to the HQP index as restored from the most recent cache file snapshot. A new snapshot would then be recorded for the next profile startup.\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBefore the transaction journal approach was begun, however, it was decided that moving to a SQLite-based caching mechanism would be prudent. Doing so would eliminate the need for a transaction journal inasmuch as the SQLite-based cache would \u003ci\u003ealways\u003c/i\u003e be up-to-date. Effort to implement the SQLite caching has been ongoing but has not yet incorporated into the HQP.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eThe current implementation \u003cb\u003edoes not\u003c/b\u003e employ a transaction journal, thus there is some risk that historical information about site visits subsequent to profile startup could be lost if the application crashes. \u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-Situation-Today\" /\u003e\u003cb\u003eThe Situation Today\u003c/b\u003e\u003c/h3\u003e\u003cdiv\u003eCurrently, all cache file operations are performed on the main thread. This could slowdown startup though no noticeable impact has been reported by users. Nevertheless, it is important to move all file operations off of the main thread. This leads us to...\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-Properly-Threaded-Solution\" /\u003e\u003cb\u003eThe Properly Threaded Solution\u003c/b\u003e\u003c/h4\u003e\u003cdiv\u003eModifications to the HQP index caching code are underway such that all cache file and database operations will be performed on the appropriate thread.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cu\u003eStartup/Restoring\u003c/u\u003e\u003cimg border\u003d\"0\" height\u003d\"320\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1326315606847/omnibox-history-provider/caching/Startup.png\" style\u003d\"display:inline;float:right;margin-top:5px;margin-right:10px;margin-bottom:5px;margin-left:10px\" width\u003d\"307\" /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe illustration to the right shows the threading model for profile initialization. For a larger image \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/Startup.png?attredirects\u003d0\"\u003eclick here\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThree threads are involved: the main (or UI) thread, the FILE thread, and the History Database thread.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf there is a HQP cache file and that file can be successfully read then the internal index data for the HQP is reconstituted from the contents of that cache file and swapped into the HQP. The file reading and internal index data reconstitution is performed on the FILE thread; swapping in the new index data is performed on the main thread. Swapping of the index data on the main thread is safe since all other accesses to the HQP's internal data occurs on the main thread.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf there is no HQP cache file or that file is unreadable for some reason then the history database (The database file itself is named 'History'.) is queried on the history thread\u003cbr /\u003eand the internal index data for the HQP is reconstituted using the records from that database. Once this operation has completed the HQP index data is swapped in on the main thread. Note that if there is no history database, the database is corrupt, there are no qualifying records in the database, or any other error occurs that a new but empty HQP index data is swapped in.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe observer, if any, is notified on the main thread. (Currently, the only observer is in unit_tests.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cu\u003eShutdown/Saving\u003c/u\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cimg border\u003d\"0\" height\u003d\"140\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1326315773179/omnibox-history-provider/caching/Shutdown.png\" style\u003d\"display:inline;float:left;margin-top:5px;margin-right:10px;margin-bottom:0px;margin-left:0px\" width\u003d\"320\" /\u003eThe illustration to the left shows the threading model for shutdown. For a larger image \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/Shutdown.png?attredirects\u003d0\"\u003eclick here\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhen the profile is shutdown, a copy of the HQP's index data is made on the main thread and then written to the cache file on the FILE thread. Once again, making the copy of the index data on the main thread affords safety as all other accesses to that index data are performed on the main thread.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe observer, if any, is notified on the FILE thread. (Currently, the only observer is in unit_tests.)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe history database thread is not involved in shutdown.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Excruciating-Detail\" /\u003eExcruciating Detail\u003c/h2\u003e\u003c/div\u003e\u003cdiv\u003eThe illustration below gives a detailed image showing all classes and functions involved in the profile startup/cache restoral operation. For a larger image \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/StartupDetail.png?attredirects\u003d0\"\u003eclick here\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:center\"\u003e\u003cfont color\u003d\"#ff0000\"\u003e\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/omnibox-history-provider/caching/StartupDetail.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"370\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1326321316394/omnibox-history-provider/caching/StartupDetail.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe illustration below a detailed image showing all classes and functions involved in the profile shutdown/cache saving operation. For a larger image \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/ShutdownDetail.png?attredirects\u003d0\"\u003eclick here\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:center\"\u003e\u003cfont color\u003d\"#ff0000\"\u003e\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/omnibox-history-provider/caching/ShutdownDetail.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"300\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1326321376462/omnibox-history-provider/caching/ShutdownDetail.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\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/815622450236891865"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5092467109309664277"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"}],"author":[{}],"sites$pageName":{"$t":"caching"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7416621220608846778"},"published":{"$t":"2012-01-11T22:36:00.026Z"},"updated":{"$t":"2012-01-11T22:36:16.462Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T22:36:16.454Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ShutdownDetail.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7416621220608846778"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/ShutdownDetail.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7416621220608846778"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7416621220608846778"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7416621220608846778"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7416621220608846778"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2905495280150152042"},"published":{"$t":"2012-01-11T22:34:29.992Z"},"updated":{"$t":"2012-01-11T22:35:16.394Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T22:35:16.372Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"StartupDetail.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2905495280150152042"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/StartupDetail.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2905495280150152042"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2905495280150152042"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2905495280150152042"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2905495280150152042"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/815622450236891865"},"published":{"$t":"2011-02-16T21:21:10.419Z"},"updated":{"$t":"2012-01-11T22:32:59.794Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T20:58:20.115Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Omnibox: History Provider"},"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\u003eOne of the autocomplete providers for the omnibox (the HistoryQuickProvider, HQP for short) serves up autocomplete candidates from the profile's history database. As the user starts typing into the omnibox, the HQP performs a search in its index of significant historical visits for the term or terms which have\u003cdiv style\u003d\"display:inline;float:right;margin:5px 10px\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/Screen%20shot%202011-02-16%20at%202.59.44%20PM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"142\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1297893730349/omnibox-history-provider/Screen%20shot%202011-02-16%20at%202.59.44%20PM.png\" width\u003d\"320\" /\u003e\u003c/a\u003e\u003c/div\u003e\r\n been typed. The resulting candidates are scored and a limited number of only the most relevant matching URLs visited are presented to the user. For example, imagine the user has visited drudgereport.com frequently and has started to type '\u003cb\u003edru\u003c/b\u003e' in the omnibox. They will be presented with autocomplete suggestions as shown in the screenshot to the right.\u003cbr /\u003e\u003cbr /\u003eSubstring matching is also performed. The drudgereport.com suggestion will also be made if the user types '\u003cb\u003erep\u003c/b\u003e', though the \u003cdiv style\u003d\"display:inline;float:left;margin:5px 10px 0pt 0pt\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/Screen%20shot%202011-02-16%20at%203.16.49%20PM.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/1297894829255/omnibox-history-provider/Screen%20shot%202011-02-16%20at%203.16.49%20PM.png\" width\u003d\"320\" /\u003e\u003c/a\u003e\u003c/div\u003eresult will not be scored as highly and is likely not to be the top-most suggestion, as shown in the screenshot on the left.\u003cbr /\u003e\u003cbr /\u003eMultiple terms also work. drudgereport.com will be one of the top suggestions, in this example, when the user types '\u003cb\u003edr re\u003c/b\u003e', '\u003cb\u003ere dr\u003c/b\u003e', and similar partial words.\u003cbr /\u003e\u003cbr /\u003eThe URL of the visited page is indexed and searched. As of Chrome 15, the page title is also indexed and searched.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Objectives\" /\u003eObjectives\u003c/h2\u003eThe HQP is intended to very quickly provide scored autocomplete suggestions from a limited subset of all known historical URL visits. The specific objectives are:\u003cbr /\u003e\u003col\u003e\u003cli\u003eProvide results in 20 ms or less.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eProvide the top 3 best matches for the terms typed by the user.\u003c/li\u003e\u003cli\u003eProvide results as each character in the terms has been typed.\u003c/li\u003e\u003cli\u003eAccommodate all browser supported languages.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eConsider only URLs:\u003c/li\u003e\u003cul\u003e\u003cli\u003efor which the URL was specifically typed into the omnibox OR\u003c/li\u003e\u003cli\u003ewhich has been visited at least at least 4 times OR\u003c/li\u003e\u003cli\u003ehas been visited within the last 72 hours.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eMatch against the URL and/or the page title.\u003c/li\u003e\u003cli\u003eMatch against partial strings.\u003c/li\u003e\u003cli\u003eMatch against one or more terms.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eMatch against internal substrings (i.e. do not limit matches to start-of-string).\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eProvide results immediately upon browser startup.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eDo not degrade startup and shutdown times.\u003c/li\u003e\u003cli\u003eRequire reasonable memory resources.\u003cbr /\u003e\u003c/li\u003e\u003c/ol\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Approaches-Considered\" /\u003eApproaches Considered\u003c/h2\u003eThree primary alternatives were considered:\u003cbr /\u003e\u003col\u003e\u003cli\u003ePerform queries against the history database as the user types search terms.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eCreate a custom in-memory subset of the history database and perform queries against this custom database as the user types search terms.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eCreate a custom in-memory index of the history database and perform \r\nqueries against this index as the user types search terms.\u003c/li\u003e\u003c/ol\u003eOption #1 is far too slow and does not satisfy other requirements such as partial string matches. Also, properly handling word-breaks for all languages is extremely difficult.\u003cbr /\u003e\u003cbr /\u003eOption #2 is much faster but still does not satisfy the language and partial string match requirements.\u003cbr /\u003e\u003cbr /\u003eOption #3 is more complex to implement but satisfies all requirements. Caching of the in-memory data structures is required in order to meet startup/shutdown requirements. Further, in order to minimize an impact from writing the cache at shutdown and whenever updates to the index meant refreshing the cache a simple-minded transaction log is required.\u003cbr /\u003e\u003cbr /\u003eWithin Option #3 are other considerations specifically as they relate to the cache:\u003cbr /\u003e\u003col\u003e\u003cli\u003eDuring startup, the index must be built as quickly as possible (see Objectives 9 and 10). A cache helps satisfy these objectives. Unfortunately, in the absence of a cache a complete query of the history database must be performed in order to rebuild the IMUI; that database can be quite large, reaching tens of thousands of URL visits. Fortunately, a rebuild of the IMUI should rarely be necessary. The bulk of the pressure during startup will be the speed of loading the cache and repopulating the IMUI data structures.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eDuring shutdown, the IMUI must be cached as quickly as possible. On desktop systems, users are intolerant of an application taking more than a few milliseconds to shut down and get out of the way. A complete write of the IMUI data to the cache at shutdown may be quick enough to meet shutdown time requirements. If those requirement cannot be met, then an approach where the cache is constantly kept up-to-date may be required.\u003c/li\u003e\u003cli\u003eDuring operation, it's important to keep the on-disk cache up-to-date in case the browser unexpectedly shuts down.\u003c/li\u003e\u003c/ol\u003eIn summary, a cache will be required as well as some mechanism for keeping that cache up-to-date as the user visits sites and as old, stale visits are removed from the index.\u003cbr /\u003e\u003cbr /\u003eFor a detailed discussion of the HQP caching implementation please see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching\"\u003eCaching\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Components\" /\u003eComponents\u003c/h2\u003eThere are two primary components to the history autocomplete provider: the HistoryQuickProvider (HQP) and the InMemoryURLIndex (IMUI).\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-HistoryQuickProvider\" /\u003eHistoryQuickProvider\u003c/h3\u003eThe HistoryQuickProvider, an AutocompleteProvider, is a client of the InMemoryURLIndex. HQP, when asked for autocomplete candidates, marshalls the search term (or terms) and asks the IMUI to provide scored and sorted matches for that term (or terms). HQP then composes a list of AutocompleteMatches from the IMUI results and notifies the autocomplete system that results are available.\u003cbr /\u003e\u003cbr /\u003eThe design of the HQP follows the typical AutocompleteProvider pattern and is not further discussed here.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-InMemoryURLIndex\" /\u003eInMemoryURLIndex\u003c/h3\u003eAll of the interesting stuff is in the IMUI. In essence, the text of the URL and the page title for all qualified history items (URL visits from the history database) are broken down into individual words and characters and inserted into in-memory data structures with a reference to the original history item. Here is a diagram of these data structures:\u003cbr /\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\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/omnibox-history-provider/HQP.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"266\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1297900195934/omnibox-history-provider/HQP.jpg\" width\u003d\"320\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Indexing\" /\u003eIndexing\u003c/h4\u003eDuring a build of the index, and whenever the user visits a site, the URL and the page title for that visit are added to the index. Here's how it works:\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003eFor this example, let's use \"http://www.americanentertainer.com/xj20gg1Z.html\" with a page title of \"Recent Movies\".\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003eFor each qualifying URL visit:\u003cbr /\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eInsert an entry into the \u003cb\u003ehistory_info_map_\u003c/b\u003e for the \u003cb\u003eHistoryID\u003c/b\u003e of the URL visit.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eThe URL and page title are broken down into individual words:\u003c/li\u003e\u003cul\u003e\u003cli\u003ehttp www americanentertainer xj 20 gg 1 Z html recent movies\u003cbr /\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eFor each word:\u003c/li\u003e\u003col\u003e\u003cli\u003eAppend the word to the \u003cb\u003eword_list_\u003c/b\u003e with the insertion index serving as the \u003cb\u003eWordID\u003c/b\u003e.\u003c/li\u003e\u003cli\u003eInsert the word into the \u003cb\u003eword_map_\u003c/b\u003e with its \u003cb\u003eWordID\u003c/b\u003e.\u003c/li\u003e\u003cli\u003eAdd the \u003cb\u003eHistoryID\u003c/b\u003e for the URL visit to the \u003cb\u003eHistoryIDSet\u003c/b\u003e of the \u003cb\u003eword_id_history_map_\u003c/b\u003e item corresponding to the \u003cb\u003eWordID\u003c/b\u003e, adding a new map entry if necessary.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eBreak the word down into a set of unique, individual characters.\u003c/li\u003e\u003cli\u003eFor each character:\u003c/li\u003e\u003col\u003e\u003cli\u003eAdd the \u003cb\u003eWordID\u003c/b\u003e for the word containing the character to the \u003cb\u003eWordIDSet\u003c/b\u003e of the \r\n\u003cb\u003echar_word_map_\u003c/b\u003e item corresponding to the character, adding a new map \r\nentry if necessary.\u003c/li\u003e\u003c/ol\u003e\u003c/ol\u003e\u003c/ol\u003eThe \u003cb\u003eavailable_words_\u003c/b\u003e list contains the \u003cb\u003eWordID\u003c/b\u003es for entries in the \u003cb\u003eword_list_\u003c/b\u003e which are no longer in use. This occurs when URL visits no longer qualify for use by the HQP and one or more words of the URL or its page title are no longer referenced by any of the indexed URL visits. Maintaining this list prevents an ever growing \u003cb\u003eword_list_\u003c/b\u003e (a poor-man's garbage collection).\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Searching\" /\u003eSearching\u003c/h4\u003eThe following diagram demonstrates what occurs in the HQP as the user types into the omnibox. In this case, the user has type the four characters: \u003cb\u003ed r u d\u003c/b\u003e.\u003cbr /\u003e\u003cdiv style\u003d\"display:inline;margin:5px 10px;float:right\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/HQP%20Search.jpg?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"320\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1298047467444/omnibox-history-provider/HQP%20Search.jpg\" width\u003d\"256\" /\u003e\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cbr /\u003eWhatever the user types may constitute multiple search terms, either deliberately or not. The following are examples of multiple search terms:\u003cbr /\u003e\u003cbr /\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" 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\"text-align:center;width:211px;height:16px\"\u003e\u003cb\u003ewhat's in the omnibox\u003cbr /\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"text-align:center;width:183px;height:16px\"\u003e\u003cb\u003ehow it's broken down\u003cbr /\u003e\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:211px;height:16px\"\u003e fox542steal\u003c/td\u003e\u003ctd style\u003d\"width:183px;height:16px\"\u003e fox 542 steal\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:211px;height:16px\"\u003e amer spec\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:183px;height:16px\"\u003e amer spec\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:211px;height:16px\"\u003e google.com/search?source\u003dig\u0026amp;hl\u003den\u003c/td\u003e\u003ctd style\u003d\"width:183px;height:16px\"\u003e google com source ig hl en\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cbr /\u003eWhen multiple terms are present, each term is evaluated separately by the HQP and the result sets are intersected immediately after the final union step shown in the illustration. In order to meet omnibox typing responsiveness objectives, should there be more than 500 result candidates at this point the scoring operation is terminated and no results are suggested by the HQP. This is likely to happen for very short search strings (i.e. for a search string of 'w' as that will occur in most URLs being candidates). The results of that intersection are then scored, reduced and sorted.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-To-Do\" /\u003eTo Do\u003c/h2\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Immediately\" /\u003eImmediately\u003c/h4\u003e\u003c/div\u003e\u003cul\u003e\u003cli\u003eUpdate the threading model for cache file reading\u003c/li\u003e\u003cli\u003eUse SQLite as the caching mechanism.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Future\" /\u003eFuture\u003c/h4\u003e\u003c/div\u003e\u003cul\u003e\u003cli\u003eRecord HQP statistics (qualifying visit count, size of cache and transaction files, etc.).\u003c/li\u003e\u003cli\u003eValidate the scoring algorithm through user feedback.\u003c/li\u003e\u003cli\u003eSee if there is a way to offer in-line autocomplete results for multiple-term searches.\u003c/li\u003e\u003cli\u003eDetermine if the full cache ought to be occasionally written, clearing the transaction file.\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":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/815622450236891865"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/815622450236891865"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/815622450236891865"}],"author":[{}],"sites$pageName":{"$t":"omnibox-history-provider"},"sites$revision":{"$t":"8"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6645725882369929578"},"published":{"$t":"2012-01-11T20:45:13.962Z"},"updated":{"$t":"2012-01-11T21:02:53.179Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T21:02:53.165Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Shutdown.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6645725882369929578"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/Shutdown.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6645725882369929578"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6645725882369929578"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6645725882369929578"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6645725882369929578"}],"author":[{}],"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6334986958652507481"},"published":{"$t":"2012-01-11T20:33:39.138Z"},"updated":{"$t":"2012-01-11T21:00:06.847Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T21:00:06.839Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Startup.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6334986958652507481"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/Startup.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6334986958652507481"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6334986958652507481"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6334986958652507481"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6334986958652507481"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/644862527070375214"},"published":{"$t":"2012-01-11T20:30:15.217Z"},"updated":{"$t":"2012-01-11T20:30:15.231Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T20:30:15.217Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Initialization.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/644862527070375214"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5092467109309664277"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/omnibox-history-provider/caching/Initialization.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/644862527070375214"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/644862527070375214"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/644862527070375214"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/644862527070375214"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1092029674931654850"},"published":{"$t":"2011-12-02T15:51:15.939Z"},"updated":{"$t":"2012-01-11T16:11:24.439Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T16:11:24.429Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"FlimflamServiceStateMachine.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1092029674931654850"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6732688660809667187"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/network-portal-detection/FlimflamServiceStateMachine.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1092029674931654850"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1092029674931654850"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1092029674931654850"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1092029674931654850"}],"author":[{}],"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3792762003351228811"},"published":{"$t":"2012-01-11T16:10:32.036Z"},"updated":{"$t":"2012-01-11T16:10:32.044Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-11T16:10:32.036Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"FlimflamServiceStateMachine.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3792762003351228811"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6732688660809667187"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/network-portal-detection/FlimflamServiceStateMachine.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3792762003351228811"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3792762003351228811"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3792762003351228811"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3792762003351228811"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/405212515963567913"},"published":{"$t":"2011-12-02T15:53:09.349Z"},"updated":{"$t":"2012-01-11T15:59:06.699Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-02T15:53:09.349Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"FlimflamServiceStateMachine (1).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/405212515963567913"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6732688660809667187"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/network-portal-detection/FlimflamServiceStateMachine%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/405212515963567913"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/405212515963567913"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/405212515963567913"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/405212515963567913"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/617514915322594686"},"published":{"$t":"2011-11-14T22:07:00.091Z"},"updated":{"$t":"2012-01-05T03:08:31.846Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2012-01-05T03:08:31.846Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Using R to reduce Page Cycler Regressions"},"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\"\u003eSee also \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:7d62b54e98418ea1\" class\u003d\"disabled\"\u003ehttps://sites.google.com/a/chromium.org/dev/developers/testing/page-cyclers/analyzing-page-cycler-results\u003c/a\u003e.\u003cdiv\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ff0000\"\u003eIMPORTANT: When you see a page cycler regression, make sure to upload a saved copy of the before/after stdio data off the bot. We regularly delete that data off of buildbot, and you'll need it to do any of the analysis below.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMost of the time, with page cycler regressions, there are a handful of pages in that test suite that regress. If you can narrow down which pages regressed, it's easier to make a reduce suite that you can iterate on quickly to address the regression.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eR is a programming language for statistical analysis that make it easy to do analysis on these results. I got a copy at \u003ca href\u003d\"http://cran.r-project.org/bin/macosx/\" rel\u003d\"nofollow\"\u003ehttp://cran.r-project.org/bin/macosx/\u003c/a\u003e. I know very little R. If you have more experience with R, please fix up this page to be moar awesome.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe page cycler stdio page has a detailed output of the runtime of each page in the page cycler test. For example, page_cycler_moz spits out:\u003c/div\u003e\u003cdiv\u003e\u003cpre\u003e\u003cspan style\u003d\"font-family:Courier New,courier,monotype;font-size:16px;font-weight:normal\"\u003ePages: [bugzilla.mozilla.org,espn.go.com,home.netscape.com,hotwired.lycos.com,lxr.mozilla.org,my.netscape.com,news.cnet.com,slashdot.org,vanilla-page,web.icq.com,www.altavista.com,www.amazon.com,www.aol.com,www.apple.com,www.cnn.com,www.compuserve.com,www.digitalcity.com,www.ebay.com,www.excite.com,www.expedia.com,www.google.com,www.iplanet.com,www.mapquest.com,www.microsoft.com,www.moviefone.com,www.msn.com,www.msnbc.com,www.nytimes.com,www.nytimes.com_Table,www.quicken.com,www.spinner.com,www.sun.com,www.time.com,www.tomshardware.com,www.travelocity.com,www.voodooextreme.com,www.w3.org_DOML2Core,www.wired.com,www.yahoo.com,www.zdnet.com,www.zdnet.com_Gamespot.com]\r\n*RESULT times: t\u003d [376,292,128,85,178,79,87,38,9,54,27,40,43,20,73,35,32,92,37,45,8,44,21,77,34,47,24,52,68,69,42,18,91,71,39,153,144,47,46,80,101,27,35,34,27,53,32,31,29,10,43,22,25,39,14,57,28,25,24,33,35,8,17,14,20,25,44,19,38,66,22,37,15,38,50,32,95,122,40,18,47,49,27,34,35,27,53,31,30,28,10,44,19,26,39,14,57,29,26,24,33,36,8,17,15,19,25,44,19,38,65,24,37,15,40,49,33,94,123,42,18,46,48,26,35,33,27,53,33,30,29,10,44,20,26,40,15,56,29,26,24,33,37,9,17,15,19,26,43,18,38,66,23,37,15,38,51,32,94,121,41,18,47,49,26,35,34,26,54,31,29,28,10,45,21,25,39,14,56,29,26,24,32,36,7,17,14,19,25,43,18,39,65,21,36,15,38,50,31,92,122,41,18,47,49,26,35,35,26,53,31,30,29,9,44,20,25,38,14,57,29,26,25,33,37,8,16,15,20,25,41,19,39,66,23,34,15,39,50,32,93,122,41,19,47,50,26,35,35,25,53,31,31,29,9,44,21,25,39,14,56,30,25,25,33,36,9,17,15,19,25,44,19,38,67,22,36,14,40,51,31,94,122,41,18,47,50,25,36,33,27,53,33,29,29,10,45,21,25,39,14,57,30,27,24,33,37,8,17,15,20,25,43,19,38,66,22,35,14,39,51,33,95,124,40,19,47,49,26,35,35,25,53,32,29,28,10,45,20,25,40,14,56,30,26,25,33,37,9,17,15,20,25,43,19,38,66,22,38,14,40,51,32,94,123,42,19,45,50,27,35,35,26,52,32,30,29,9,44,20,25,39,15,57,29,27,25,34,37,8,17,16,20,27,43,20,39,66,22,37,13,38,51,33,96,123,41,19,45,50] ms\u003c/span\u003e\u003cspan\u003e\r\n\u003c/span\u003e\u003c/pre\u003e\u003c/div\u003eThe pages listed under \"Pages:\" are loaded in a loop 10 times. So, t[0] is the time to load bugzilla.mozilla.org the first time, and t[10] is the time to load it the second time around.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eLets create some dummy page cycler data to work with. Lets stay that someone commits a patch that causes a regression.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eBefore patch:\u003c/div\u003e\u003cdiv\u003ePages: [ojan.com, glens-head.org];\u003c/div\u003e\u003cdiv\u003e*RESULT times: t\u003d [0,99,2,56,0,99,2,56,0,99,2,56,0,99,2,56,0,99,2,56] ms\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAfter patch:\u003cbr /\u003e\u003cdiv\u003e\u003cdiv\u003ePages: [ojan.com, glens-head.org];\u003c/div\u003e\u003cdiv\u003e*RESULT times: t\u003d [105,34,206,57,105,34,206,57,105,34,206,57,105,34,206,57,105,34,206,57] ms\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eClearly, looking at this, ojan.com got a lot slower. Looking at real page cycler data, it's a lot hard to make sense of.\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Get-the-data-into-R\" /\u003eGet the data into R\u003c/h2\u003e\u003cdiv\u003eSo, start the R interpreter and copy-paste the before and after runtimes:\u003c/div\u003e\u003cdiv\u003e\u0026gt; before \u003d c(0,99,2,56,0,99,2,56,0,99,2,56,0,99,2,56,0,99,2,56)\u003c/div\u003e\u003cdiv\u003e\u0026gt; after \u003d c(105,34,206,57,105,34,206,57,105,34,206,57,105,34,206,57,105,34,206,57)\u003c/div\u003e\u003cdiv\u003e\u0026gt; pages \u003d c('ojan.com','glens-head.org')\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Working-with-the-data\" /\u003eWorking with the data\u003c/h2\u003e\u003cdiv\u003e// Get an easy summary of before\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; summary(before)\u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e   0.00    1.50   29.00   39.25   66.75   99.00 \u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Get all the before times for ojan.com\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; seq(1, 10 * length(pages), length(pages))\u003c/div\u003e\u003cdiv\u003e [1]  1  3  5  7  9 11 13 15 17 19\u003c/div\u003e\u003cdiv\u003e\u0026gt; before[seq(1, 10 * length(pages), length(pages))]\u003c/div\u003e\u003cdiv\u003e [1] 0 2 0 2 0 2 0 2 0 2\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Get all the before times for glens-head.org\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; before[seq(2, 10 * length(pages), length(pages))]\u003c/div\u003e\u003cdiv\u003e [1] 99 56 99 56 99 56 99 56 99 56\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Now lets make that a function\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; oneSite \u003d function(data, index) {\u003c/div\u003e\u003cdiv\u003e    data[seq(index, 10 * length(pages), length(pages))];\u003c/div\u003e\u003cdiv\u003e}\u003c/div\u003e\u003cdiv\u003e\u0026gt; oneSite(before, 1)\u003c/div\u003e\u003cdiv\u003e [1] 0 2 0 2 0 2 0 2 0 2\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// And we can make a function to print the before/after summaries for a given index.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; summaries \u003d function(index) {\u003c/div\u003e\u003cdiv\u003e    print(pages[index]);\u003c/div\u003e\u003cdiv\u003e    print(summary(oneSite(before, index)));\u003c/div\u003e\u003cdiv\u003e    print(summary(oneSite(after, index)));\u003c/div\u003e\u003cdiv\u003e}\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Before/after summaries for ojan.com\u003c/div\u003e\u003cdiv\u003e\u0026gt; summaries(1)\u003c/div\u003e\u003cdiv\u003e[1] \"ojan.com\"\u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e      0       0       1       1       2       2 \u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e  105.0   105.0   155.5   155.5   206.0   206.0 \u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Now we can loop and see before/after summaries for each site in the cycler.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; for (i in 1:length(pages)) {\u003c/div\u003e\u003cdiv\u003e    summaries(i);\u003c/div\u003e\u003cdiv\u003e}\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e[1] \"ojan.com\"\u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e      0       0       1       1       2       2 \u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e  105.0   105.0   155.5   155.5   206.0   206.0 \u003c/div\u003e\u003cdiv\u003e[1] \"glens-head.org\"\u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e   56.0    56.0    77.5    77.5    99.0    99.0 \u003c/div\u003e\u003cdiv\u003e   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. \u003c/div\u003e\u003cdiv\u003e   34.0    34.0    45.5    45.5    57.0    57.0 \u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Print all sites where the mean regressed by more than 10ms.\u003c/div\u003e\u003cdiv\u003e\u0026gt; threshold \u003d 10;\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; for (i in 1:length(pages)) {\u003c/div\u003e\u003cdiv\u003e    if (mean(oneSite(before, i)) \u0026lt; (mean(oneSite(after, i) - threshold))) {\u003c/div\u003e\u003cdiv\u003e        summaries(i);\u003c/div\u003e\u003cdiv\u003e    }\u003c/div\u003e\u003cdiv\u003e}\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Graphs\" /\u003eGraphs\u003c/h2\u003e\u003cdiv\u003e// Bloxplot visualizing the median and stddev.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; boxplot(before, after)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Plot with the dots from before as one color and the dots of after as another.\u003c/div\u003e\u003cdiv\u003e\u0026gt; plot(before, after, col\u003d2:3)\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e// Plot each site individually using the oneSite function from above.\u003c/div\u003e\u003cdiv\u003e\u0026gt; boxplot(oneSite(before, 1), oneSite(after, 1))\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e// Plot all the sites in separate graphs.\u003c/div\u003e\u003cdiv\u003e\u0026gt; par(mfrow\u003dc(ceiling(sqrt(length(pages))),ceiling(sqrt(length(pages)))))  // Make a graphics context big enough for all the graphs. Might need to make the window that pops up very large for the next loop to work.\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u0026gt; for (i in 1:length(pages)) {\u003c/div\u003e\u003cdiv\u003e    boxplot(oneSite(before, i), oneSite(after, i), main\u003dpages[i])\u003c/div\u003e\u003cdiv\u003e}\u003c/div\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/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/using-r-to-reduce-page-cycler-regressions"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/617514915322594686"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/617514915322594686"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/617514915322594686"}],"author":[{"name":{"$t":"Ojan Vafai"},"email":{"$t":"ojan@chromium.org"}}],"sites$pageName":{"$t":"using-r-to-reduce-page-cycler-regressions"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9025618754103405977"},"published":{"$t":"2011-12-21T23:44:48.137Z"},"updated":{"$t":"2011-12-21T23:44:48.170Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-21T23:44:48.137Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"GoogleChromeStandaloneEnterprise.msi"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9025618754103405977"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1735362785781827953"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/administrators/windows-quick-start/GoogleChromeStandaloneEnterprise.msi"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9025618754103405977"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9025618754103405977"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9025618754103405977"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9025618754103405977"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5347611380684392223"},"published":{"$t":"2010-03-10T18:41:00.589Z"},"updated":{"$t":"2011-12-20T23:45:15.817Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T23:45:15.816Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Install Dialog 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\u003ch3\u003e\u003ca name\u003d\"TOC-Problem\" /\u003e\u003cb\u003eProblem\u003c/b\u003e\u003c/h3\u003eThe current extension install dialog displays a different string of text depending on the permissions the extension requests. This has a few problems:\u003cdiv\u003e\u003col\u003e\u003cli\u003eIt isn't extensible. We keep adding new permissions, but it's hard to update the text strings to deal with all possible combinations of permissions.\u003c/li\u003e\u003cli\u003eIt isn't clear. Users don't realize that the text is telling them something specific about the extension they're installing.\u003c/li\u003e\u003cli\u003eAdvanced users have complained that they would like to see the details of the exact permissions being requested, not the text form.\u003c/li\u003e\u003cli\u003eVery advanced users have requested the ability to disable individual permissions during installation.\u003c/li\u003e\u003c/ol\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Proposal\" /\u003e\u003cb\u003eProposal\u003c/b\u003e\u003c/h3\u003e\u003cdiv\u003eThe current set of permissions are:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eData on a domain (eg www.google.com)\u003c/li\u003e\u003cli\u003etabs system details (urls, titles, etc)\u003c/li\u003e\u003cli\u003ebrowsing history\u003c/li\u003e\u003cli\u003egeolocation\u003c/li\u003e\u003cli\u003eunlimited storage quota\u003c/li\u003e\u003cli\u003edesktop notifications\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eSome of these permissions are too granular to be useful to most users during installation, and should be hidden by default. For example, most users won't want to approve access to desktop notifications during installation. Installation should grant that privilege automatically. Similar for extra storage quota. Access to the tab system and to the history system are basically the same kind of access, so those should be grouped.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThus the user-visible permissions for the above would be simplified to:\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eData on a domain\u003c/li\u003e\u003cli\u003eBrowsing history (tabs, history, etc)\u003c/li\u003e\u003cli\u003eGeolocation\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eThe new install dialog should show a list of high-level permissions by default, but give advanced users a way to see the detailed list if they want.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eSo something like:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\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| | icon | Install Gmail Checker?             |\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\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\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\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\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e+---------------------------------------------+\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e| This extension will have access to:         |\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| ! Your private data on mail.google.com,     |\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e|   www.google.com, and 3 other web sites.    |\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| ! Your physical location on planet Earth.   |\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| ! Your browsing history.                    |\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| [more details]                              |\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|                                             |\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e|                           [  ok  ] [cancel] |\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\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\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eWhen the user clicks \"more details\", the dialog expands and shows all the permissions requested in as much detail possible. In the future, we might also make it possible to turn off individual permissions in that area, but the extension system doesn't support that yet.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Text-details-for-high-level-permissions\" /\u003eText details for high-level permissions\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eSite access\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour private data on www.google.com.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour private data on www.google.com and foo.com.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour private data on www.google.com, foo.com, and 5 other sites.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour private data on all web sites.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eTabs and History\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour browsing history.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eGeolocation\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour physical location on planet Earth.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eNPAPI\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eFull access to your computer and private data.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eCamera (future)\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour computer's camera\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eMicrophone (future)\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eYour computer's microphone\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cb\u003eInfinite Storage, Notifications\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\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\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u0026lt;none\u0026gt;\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cbr /\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/361818175711938067"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/extension-system-changes/install-dialog-2"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5347611380684392223"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5347611380684392223"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5347611380684392223"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"install-dialog-2"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2299381518211219964"},"published":{"$t":"2010-04-08T18:43:26.858Z"},"updated":{"$t":"2011-12-20T23:40:06.858Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-09-03T00:03:47.643Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"benchmark.crx"},"summary":{},"content":{"type":"application/x-chrome-extension","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2299381518211219964"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7401683726684770434"},{"rel":"alternate","type":"application/x-chrome-extension","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/chrome-benchmarking-extension/benchmark.crx"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2299381518211219964"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2299381518211219964"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2299381518211219964"},{"rel":"edit-media","type":"application/x-chrome-extension","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2299381518211219964"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7195847863502340518"},"published":{"$t":"2010-01-26T17:03:58.134Z"},"updated":{"$t":"2011-12-20T23:40:06.858Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-01-26T17:03:58.134Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"benchmark-sm2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7195847863502340518"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7401683726684770434"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/chrome-benchmarking-extension/benchmark-sm2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7195847863502340518"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7195847863502340518"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7195847863502340518"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7195847863502340518"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4995823422751423183"},"published":{"$t":"2010-01-26T17:02:08.258Z"},"updated":{"$t":"2011-12-20T23:40:06.857Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-01-26T17:02:08.258Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"benchmark-lg.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4995823422751423183"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7401683726684770434"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/chrome-benchmarking-extension/benchmark-lg.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4995823422751423183"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4995823422751423183"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4995823422751423183"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4995823422751423183"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7954079328582666658"},"published":{"$t":"2010-01-26T16:59:24.904Z"},"updated":{"$t":"2011-12-20T23:40:06.857Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-01-26T17:03:36.279Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"benchmark-sm.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7954079328582666658"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7401683726684770434"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/chrome-benchmarking-extension/benchmark-sm.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7954079328582666658"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7954079328582666658"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7954079328582666658"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7954079328582666658"}],"author":[{}],"sites$revision":{"$t":"4"}},{"gd$etag":"\"WSl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3065030436457097565"},"published":{"$t":"2009-02-03T04:32:19.316Z"},"updated":{"$t":"2011-12-20T22:52:11.328Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T22:52:11.328Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#listpage","label":"listpage"}],"title":{"$t":"API Wish 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\"\u003e\u003cdiv dir\u003d\"ltr\"\u003eAn early design document containing an unsorted list of things we've want to do as extension APIs. Some of these ideas have now been implemented.\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/903657469582497800"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apiwishlist"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3065030436457097565"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3065030436457097565"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3065030436457097565"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"gs$worksheet":{"name":"API Wish List"},"gs$header":{"row":"1"},"gs$data":{"startRow":"2","gs$column":[{"index":"A","name":"Name"},{"index":"B","name":"Notes"},{"index":"C","name":"Use cases"},{"index":"D","name":"Priority"}]},"gd$feedLink":{"href":"https://sites.google.com/feeds/content/chromium.org/dev?parent\u003d3065030436457097565"},"sites$pageName":{"$t":"apiwishlist"},"sites$revision":{"$t":"20"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/570283359659542682"},"published":{"$t":"2009-02-03T04:56:15.198Z"},"updated":{"$t":"2011-12-20T22:52:11.126Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T04:56:15.198Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/570283359659542682"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/570283359659542682"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/570283359659542682"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Name","$t":"New Tab Page"},{"index":"B","name":"Notes","$t":"Replace it entirely, or add modules (iframes?) to it."},{"index":"C","name":"Use cases","$t":""},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/986606757242304045"},"published":{"$t":"2009-02-03T05:02:35.023Z"},"updated":{"$t":"2011-12-20T22:52:11.126Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-03-13T18:58:46.319Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/986606757242304045"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/986606757242304045"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/986606757242304045"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Read-write user scripts"},{"index":"B","name":"Notes","$t":"Inject javascript into pages."},{"index":"C","name":"Use cases","$t":"Like Greasemonkey"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8103809349618207829"},"published":{"$t":"2009-02-03T04:55:29.796Z"},"updated":{"$t":"2011-12-20T22:52:11.126Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-05-18T16:58:46.766Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8103809349618207829"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8103809349618207829"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8103809349618207829"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Name","$t":"Thumbnail"},{"index":"B","name":"Notes","$t":"Generate thumbnails from open tabs. Access read and write to the thumbnail database."},{"index":"C","name":"Use cases","$t":"CtrlTab Preview"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5343694844479654920"},"published":{"$t":"2009-02-03T04:51:42.667Z"},"updated":{"$t":"2011-12-20T22:52:11.125Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:10:47.523Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5343694844479654920"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5343694844479654920"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5343694844479654920"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Sidebars"},{"index":"B","name":"Notes","$t":""},{"index":"C","name":"Use cases","$t":"Delicious"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6435602062861443337"},"published":{"$t":"2009-02-03T04:53:43.574Z"},"updated":{"$t":"2011-12-20T22:52:11.125Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T04:53:43.574Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6435602062861443337"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6435602062861443337"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6435602062861443337"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Name","$t":"Storage"},{"index":"B","name":"Notes","$t":"Should come for free via HTML5 APIs."},{"index":"C","name":"Use cases","$t":""},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7293571569852095579"},"published":{"$t":"2009-02-03T04:51:56.602Z"},"updated":{"$t":"2011-12-20T22:52:11.125Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:10:36.058Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7293571569852095579"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7293571569852095579"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7293571569852095579"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Shelves and bottom bars"},{"index":"B","name":"Notes","$t":"They may be able to be the same thing. Shelves have a different default presentation than bottom bars (constrained height, like a toolbar, different background and edges)."},{"index":"C","name":"Use cases","$t":"Download status, Firebug"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4530015168857835467"},"published":{"$t":"2009-02-03T04:59:47.461Z"},"updated":{"$t":"2011-12-20T22:52:11.124Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:10:00.597Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4530015168857835467"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4530015168857835467"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4530015168857835467"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Settings"},{"index":"B","name":"Notes","$t":"Interact with various Chromium settings, like what pages JavaScript is enabled for, what pages cookies are sent to, user agent settings, proxy settings, etc"},{"index":"C","name":"Use cases","$t":"NoScript, privacy filters, proxy switchers"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4591292272993007795"},"published":{"$t":"2009-02-03T04:56:50.046Z"},"updated":{"$t":"2011-12-20T22:52:11.124Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:05:57.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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4591292272993007795"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4591292272993007795"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4591292272993007795"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Element-specific actions"},{"index":"B","name":"Notes","$t":"Tell Chromium to somehow highlight a DOM element and advertise that an action is possible."},{"index":"C","name":"Use cases","$t":"Send this image to a friend on Facebook"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4675015324175526665"},"published":{"$t":"2009-02-03T05:11:42.142Z"},"updated":{"$t":"2011-12-20T22:52:11.124Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:11:42.142Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4675015324175526665"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4675015324175526665"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4675015324175526665"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Name","$t":"Pop-out areas"},{"index":"B","name":"Notes","$t":"Ability to render web content outside the viewport"},{"index":"C","name":"Use cases","$t":"Pull out areas from toolbars, shelves"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5053271597626323521"},"published":{"$t":"2009-02-03T04:52:27.929Z"},"updated":{"$t":"2011-12-20T22:52:11.124Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:07:15.786Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5053271597626323521"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5053271597626323521"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5053271597626323521"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Name","$t":"Keyboard and mouse handlers"},{"index":"B","name":"Notes","$t":"Extensions should be able to listen to events over the entire browser UI."},{"index":"C","name":"Use cases","$t":"CtrlTab Preview, Gestures"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5188837038047582845"},"published":{"$t":"2009-02-03T04:50:34.224Z"},"updated":{"$t":"2011-12-20T22:52:11.124Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-03-13T18:57:54.444Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5188837038047582845"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5188837038047582845"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5188837038047582845"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"10"},"gs$field":[{"index":"A","name":"Name","$t":"Themes"},{"index":"B","name":"Notes","$t":"Customizing the look and feel of the interface. We might surface them to users as different than extensions, but they will use a lot of the underlying infrastructure."},{"index":"C","name":"Use cases","$t":"It turns out people like to decorate."},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/277403861370056448"},"published":{"$t":"2009-07-01T15:34:18.736Z"},"updated":{"$t":"2011-12-20T22:52:11.123Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-07-01T15:34:18.736Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/277403861370056448"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/277403861370056448"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/277403861370056448"}],"author":[{}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Name","$t":"Menus"},{"index":"B","name":"Notes","$t":"add items to in-page context menus and system menus"},{"index":"C","name":"Use cases","$t":"bookmarking and recommendation systems, many more"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3445399149638710730"},"published":{"$t":"2009-02-03T04:55:47.361Z"},"updated":{"$t":"2011-12-20T22:52:11.123Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:05:36.405Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3445399149638710730"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3445399149638710730"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3445399149638710730"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Downloads"},{"index":"B","name":"Notes","$t":"APIs to manipulate the download system."},{"index":"C","name":"Use cases","$t":"DownThemAll"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3835342747410636552"},"published":{"$t":"2009-03-27T17:02:38.460Z"},"updated":{"$t":"2011-12-20T22:52:11.123Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-03-27T17:02:38.460Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3835342747410636552"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3835342747410636552"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3835342747410636552"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Name","$t":"Async DOM"},{"index":"B","name":"Notes","$t":"An idea to allow manipulation of the DOM asynchronously from the browser process."},{"index":"C","name":"Use cases","$t":"This would allow Greasemonkey-type use cases without having to require authors split apart their code into separate processes. It should also be more efficient."},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4296709366719782970"},"published":{"$t":"2009-02-03T04:58:07.221Z"},"updated":{"$t":"2011-12-20T22:52:11.123Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-03-13T18:57:32.532Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4296709366719782970"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4296709366719782970"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4296709366719782970"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Read-only user scripts"},{"index":"B","name":"Notes","$t":"Read-only javascript access to the DOM."},{"index":"C","name":"Use cases","$t":""},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4409194592674599042"},"published":{"$t":"2009-02-03T04:55:58.721Z"},"updated":{"$t":"2011-12-20T22:52:11.123Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:08:27.364Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4409194592674599042"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4409194592674599042"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4409194592674599042"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Omnibox"},{"index":"B","name":"Notes","$t":"Take part in omnibox sessions."},{"index":"C","name":"Use cases","$t":"Make cloud-based bookmark and history first-class in Chromium UI"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1714264307639361238"},"published":{"$t":"2009-02-03T04:57:06.290Z"},"updated":{"$t":"2011-12-20T22:52:11.122Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:08:01.599Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1714264307639361238"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1714264307639361238"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1714264307639361238"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Network"},{"index":"B","name":"Notes","$t":"Listen for requests, watch data go by, etc."},{"index":"C","name":"Use cases","$t":"Cloud-based history"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1777221490795027356"},"published":{"$t":"2009-04-23T01:14:42.421Z"},"updated":{"$t":"2011-12-20T22:52:11.122Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-04-23T01:14:42.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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1777221490795027356"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1777221490795027356"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1777221490795027356"}],"author":[{"name":{"$t":"Elliot Glaysher"},"email":{"$t":"erg@chromium.org"}}],"sites$revision":{"$t":"3"},"gs$field":[{"index":"A","name":"Name","$t":"Navigation Interception"},{"index":"B","name":"Notes","$t":"APIs for an extension to intercept a navigation event and modify it."},{"index":"C","name":"Use cases","$t":"Automated file format converters, auto-incognito mode on certain website URLs"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2632856729112871623"},"published":{"$t":"2009-02-03T04:58:58.146Z"},"updated":{"$t":"2011-12-20T22:52:11.122Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:05:03.214Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2632856729112871623"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2632856729112871623"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2632856729112871623"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Name","$t":"Content layers"},{"index":"B","name":"Notes","$t":"A separate DOM for use by extensions that renders on top of a content DOM. Extensions (user scripts) can access both, but the top layer's CSS is isolated from the bottom layer."},{"index":"C","name":"Use cases","$t":"Drawing selection UI, like FlashGot"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDQpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2773852181260635195"},"published":{"$t":"2009-02-03T04:57:49.880Z"},"updated":{"$t":"2011-12-20T22:52:11.122Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-02-03T05:07:24.871Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2773852181260635195"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2773852181260635195"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2773852181260635195"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"8"},"gs$field":[{"index":"A","name":"Name","$t":"Launch external programs"},{"index":"B","name":"Notes","$t":"Just a simple command line, for more interaction with native code use NPAPI"},{"index":"C","name":"Use cases","$t":"Download accelerators"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3437519433570742467"},"published":{"$t":"2009-03-10T20:33:34.350Z"},"updated":{"$t":"2011-12-20T22:52:11.122Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-03-10T20:33:34.350Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3437519433570742467"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3437519433570742467"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3437519433570742467"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"7"},"gs$field":[{"index":"A","name":"Name","$t":"Internationalization"},{"index":"B","name":"Notes","$t":"This is particularly necessary in cases where UI is declarative. For example, if we have declarative content gleam or tool buttons. It is also useful for internationalizing HTML without having to use JS at runtime."},{"index":"C","name":"Use cases","$t":""},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1271547382256303576"},"published":{"$t":"2009-02-03T04:55:00.761Z"},"updated":{"$t":"2011-12-20T22:52:11.121Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2009-05-05T14:49:30.027Z"},"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/3065030436457097565"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1271547382256303576"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1271547382256303576"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1271547382256303576"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$revision":{"$t":"9"},"gs$field":[{"index":"A","name":"Name","$t":"History"},{"index":"B","name":"Notes","$t":"APIs to the built-in history and bookmark system. For example, to be notified when the star button is pressed, or to push items into either database."},{"index":"C","name":"Use cases","$t":"Synchronization"},{"index":"D","name":"Priority","$t":""}]},{"gd$etag":"\"Wil7JmA5\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8167865954091486015"},"published":{"$t":"2009-03-12T09:00:03.523Z"},"updated":{"$t":"2011-12-20T01:52:50.829Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T01:52:50.829Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"APIs as stateless service calls"},"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\" style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cb\u003eNote: \u003c/b\u003eThis is the original proposal and is kept for historical reasons.  It may be made obsolete by more recent documentation.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003chr /\u003e\u003c/div\u003e\u003cdiv\u003eWe want to give extensions programmatic APIs to interact with many of the browsers' subsystems. Some examples include: tabs, history, bookmarks, downloads, and the omnibar.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAn interesting wrinkle in Chrome is that in reality, these data structures exist in another process. Because of this, it's impossible to keep a perfectly consistent view of the world in the extension process. There will at time be conflicts between what the extension thinks the current state of the system is, and what it actually is. We need to design APIs that makes this fundamental problem as easy to deal with as possible.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Proposal\" /\u003eProposal\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003eWe could model these APIs as stateless service calls, similar to the way AJAX applications work. Each call will be asynchronous, and just dumb data gets passed back and forth across the void.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor example:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003ewindow.onload \u003d populate;\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\"\u003efunction populate() {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003eextension.bookmarks.getAllBookmarks\u003c/span\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003e(function(results) {\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    // Assuming something MochiKit-ish is present.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e    forEach(results, function(bookmark) {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e      var div \u003d DIV(A(bookmark.title, bookmark.url), \" \", A(\"edit\"));\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      div.id \u003d \"b\" + result.id;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      div.lastChild.onclick \u003d bind(edit, result.id);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      return div;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    });\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  });\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\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\"\u003efunction edit(id) {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  var newTitle \u003d prompt(\"Enter new title\");\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003eextension.bookmarks.updateBookmark\u003c/span\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e(\u003c/span\u003e{id: id, title: newTitle}\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e);\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe advantages of this approach:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eChrome doesn't have to send copies of browser state to any extension process until it is requested.\u003c/li\u003e\u003cli\u003eChrome doesn't have to have complex machinery to keep multiple copies of browser state synchronized across processes.\u003c/li\u003e\u003cli\u003eThe API reflects the underlying reality -- that the interaction with the browser is asynchronous.\u003c/li\u003e\u003cli\u003eFits a wide variety of applications, so many APIs can follow a similar pattern, making new APIs easier for chrome-team to build and easier for developers to learn.\u003c/li\u003e\u003cli\u003eThis feels like idiomatic JavaScript.\u003c/li\u003e\u003c/ul\u003eThe disadvantages:\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eNot object-oriented. The verbs are at the top level and accept nouns as arguments. This could get ugly in cases where a subsystem has many nouns.\u003c/li\u003e\u003cli\u003eMore coupled to JavaScript (bad if we ever wanted to make these APIs available to other languages).\u003c/li\u003e\u003cli\u003eMay encourage us to be lazy with API design by trying to wedge everything into this CRUD idiom.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Details\" /\u003eDetails\u003c/h2\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Conflicts\" /\u003eConflicts\u003c/h4\u003e\u003cdiv\u003e\u003cdiv\u003eWithout cross-process locking, conflicts can occur in any of our APIs. For example, you can attempt to navigate a tab that has since been closed. My feeling is that conflicts should *not* be treated as exceptions. For simple things, we should just let the last change win. For more complex cases that make no sense, we should print a warning to the console, but not treat it as a fully-fledged error. In the limit, there is nothing the developer can really do about these cases. We can propagate the real state back to the extension via events and the extension can do something about it if it wants (I think in most cases, it won't care).\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Constraints\" /\u003eConstraints\u003c/h4\u003e\u003cdiv\u003e\u003cdiv\u003eMany of these data models have constraints and side-effects. For example, it doesn't make sense to set a window's zIndex negative, and changing the index of a tab affects the index of other tabs in the same window. Constraints and side-effects in this system would typically be handled by the server side and propagated back to the client by events, if the extension developer had registered to receive them.\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Non-data-APIs\" /\u003eNon-data APIs\u003c/h4\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003eSome APIs don't fit this model. For example, interacting with the omnibar or receiving requests from content scripts. We'd just have to handle these on a case-by-cases basis. I've outlined some ideas below.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Alternative-Ideas\" /\u003eAlternative Ideas\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003eThe main alternative is to have a stateful DOM-style API, like this:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eforeach(\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003ewindow.extensions.bookmarks\u003c/span\u003e, function(bookmark) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  var div \u003d DIV(A(bookmark.title, bookmark.url), \" \", A(\"edit\"));\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  div.id \u003d \"b\" + result.id;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  div.lastChild.onclick \u003d bind(edit, bookmark);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  return div;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003efunction edit(bookmark) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  var newTitle \u003d prompt(\"Enter new title\");\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ebookmark.title \u003d newTitle;\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ebookmark.save();\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'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eT\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eh\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ee\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003em\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ea\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ei\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003en\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ed\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eo\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ew\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003en\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003es\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ei\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ed\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ee\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eo\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ef\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e \u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003et\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eh\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ei\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003es\u003c/font\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e approach is that it requires synchronizing the state of the relevant object models between the extension and browser processes, and resolving conflicts. Also, as in my example here, we still might want to have an explicit update step if the operation would require writing to disk in the browser process.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-API-Hierarchy-Proposal\" /\u003eAPI Hierarchy Proposal\u003c/h2\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echromium.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // An event is a way to register to be notified when something happens. In the rest of this\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // documentation, Events are referred to as first-class, with the following notation:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  //\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  //   event name(Arg1Type arg1, Arg2Type arg2, ...);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  //\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // What this means is that the Event in variable \"name\" wants handlers with the signature:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  //\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  //   void handler(Arg1Type arg1, Arg2Type arg2, ...)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  class Event\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    void addListener(object callback(...))\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    void removeListener(object callback(...))\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    bool hasListener(object callback(...))\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    // Dispatches the event. Mainly this would be used by the framework, but it might be useful\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    // to expose to developers.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    void dispatch(...)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // A class that is essentially a client to an extension \"server\" process. Provides ways to\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // interact with the extension server, usually from a content script, but theoretically from\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // content or another extension.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  class Extension\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    constructor(int id)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e    Port connect()\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    string getURL(string path)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // One end of a connection between an extension process and a content script (or content, or\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // another extension).\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  class Port\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    event onmessage\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    void postMessage(object args)  // args is any json-compatible type\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:3828aafea64ed4a4\" class\u003d\"disabled\"\u003ebrowser.\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/downloads-api\"\u003edownloads.\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/system/errors/NodeNotFound?suri\u003dwuid:gx:264da90e341e11c6\" class\u003d\"disabled\"\u003ebookmarks.\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/history-api\"\u003ehistory.\u003c/a\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\u003cfont face\u003d\"'courier new'\"\u003e  // TODO:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  thumbnails.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    // I think these all fit the basic CRUD pattern.\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  \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/omnibox-api\"\u003eomnibox.\u003c/a\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    // This one should be really fun to figure out.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // The \"self\" module is defined differently depending on whether you are inside a content\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // script or not.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  // When in an extension, 'self' is a module, just like 'tabs', 'history', etc, that\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  // provides access to some meta features.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  self.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e    // For access to other parts of an extension.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e    DOMWindow background  // Gets the single background process if there is one\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    DOMWindow[] toolstrips  // Gets a list of live toolstrip instances\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    // Fired when somebody first creates a channel to this extension\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    Event onconnect(Port port)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  // When in a content script, 'self' is an Extension instance referring to the parent\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  // extension. Content scripts can use this to talk to their parent without having to\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // know its ID, which should be handy during development.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  Extension self\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Examples\" /\u003eExamples\u003c/h2\u003e\u003cdiv\u003eMove all google tabs into a new window:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ec\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eh\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003er\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eo\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003em\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ei\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eu\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003em\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e.tabs.getAllTabs(function(tabs) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  var tabsToMove \u003d [];\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  tabs.forEach(function(tab) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    // Too bad the URL isn't a parsed representation :(\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    if (tab.url.indexOf(\"google.com\")) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e      tabsToMove.push(tab);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    }\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  }\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  if (tabsToMove.length \u0026gt; 0) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    chromium.tabs.createWindow(null, function(newWindow) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e      tabsToMove.forEach(function(tab) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e        chromium.tabs.updateTab({\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e          id: tab.id,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e          windowId: newWindow.id\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e        });\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e      });\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    });\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  }\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e});\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWrite out navigation entries to console:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ec\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eh\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003er\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eo\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003em\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003ei\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eu\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003em\u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e.tabs.ontabchange.addListener(function(old, new) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  if (old.url !\u003d new.url) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e    console.log(\"navigated to: \" + newTab.url);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003eCommunication between content scripts and extension:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// Content script\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003evar port \u003d chromium.self.connect();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003eport.onmessage.addListener(function(message) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  console.log(\"got message: \" + message);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003eport.postMessage({pageUrl: location.href});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e// Extension\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003echromium.self.onconnect.addListener(function(port) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  console.log(\"received message from: \" + port.pageUrl);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  port.postMessage(\"ack\");\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e});\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/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/1413957628261797388"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/api-pattern-design-doc"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8167865954091486015"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8167865954091486015"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8167865954091486015"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"api-pattern-design-doc"},"sites$revision":{"$t":"53"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1413957628261797388"},"published":{"$t":"2011-12-20T00:47:25.799Z"},"updated":{"$t":"2011-12-20T01:18:37.086Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T01:18:37.086Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"How the Extension System Works"},"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:6;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":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/380426731291280413"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1413957628261797388"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1413957628261797388"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1413957628261797388"}],"author":[{}],"sites$pageName":{"$t":"how-the-extension-system-works"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/808050688040069617"},"published":{"$t":"2009-06-01T06:24:37.327Z"},"updated":{"$t":"2011-12-20T00:50:31.879Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:24:56.728Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Text Translate 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-Problem\" /\u003eProblem\u003c/h2\u003e\u003cdiv\u003eExtension developers would like to be able to translate the text of pages. Transforming arbitrary DOM trees into blocks of text of suitable length for translation is hard, and potentially time consuming if done naively. Noticing dynamic updates to the page is also difficult to do correctly. Also, modifying the content of text nodes may confuse some web applications who weren't expecting mutation events to occur (this is probably a minor problem though).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Proposal\" /\u003eProposal\u003c/h2\u003e\u003cdiv\u003eExpose an API that can feed an extension process blocks of text to translate. Chromium takes care of the hard work of creating nice blocks of text, removing html tags, noticing dynamic updates, handling races between the extension and renderer process, and modifying the text of the page in the most compat-friendly way.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe extension just has to translate and return the text when requested.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-API\" /\u003eAPI\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.textTranslate\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  // Start translating text for the specified tab. The callback gets called\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // repeatedly until stop() is called. Each time it is called it will pass\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // a block of text that needs translating.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // NOTE: tab.documentId doesn't yet exist and needs to be added.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  void start(int tabId, int documentId, void callback(int blockId, string text))\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  // The extension should call this function when a block of text has been\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // translated.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  void updateBlock(int blockId, string translatedText))\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\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Stop translating text for a tab.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  void stop(int tabId, int documentId)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Example-Usage\" /\u003eExample Usage\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// Start translating \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.tabs.getCurrent(null, function(tab) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  chrome.textTranslate.start(tab.id, tab.documentId, translate);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\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\u003cfont face\u003d\"'courier new', monospace\"\u003efunction translate(blockId, text) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  var req \u003d new XMLHttpRequest();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  req.open(\"POST\", \"http://www.google.com/sometranslateservice\", false);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  req.onreadystatechange \u003d function() {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    if (req.readyState \u003d\u003d 4) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      chrome.textTranslate.updateBlock(blockId, req.responseText);\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  }\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  req.send(null);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Implementation-Details\" /\u003eImplementation Details\u003c/h2\u003e\u003cdiv\u003eTODO: Flesh this area out Here are some ideas:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eIt seems reasonable for a \"block\" to just be any block-level element, such as \"div\", and \"p\".\u003c/li\u003e\u003cli\u003eInvalidation should happen on a block level. So if a text node inside a block changes, the whole block is retranslated. But if a parent node of a block changes, the block is not retranslated.\u003c/li\u003e\u003cli\u003eThere will have to be code in the renderer tracking outstanding translate requests so that they can be abandoned if the related blocks change.\u003c/li\u003e\u003cli\u003eIf possible, we should do the text modification at the CSS layer in webcore so that it is not visible to the web page (similar to how text-transform is implemented today).\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/text-translate-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/808050688040069617"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/808050688040069617"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/808050688040069617"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"text-translate-api"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"WCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4998179433917969612"},"published":{"$t":"2011-01-07T02:22:05.436Z"},"updated":{"$t":"2011-12-20T00:50:31.878Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:23:12.141Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Settings 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 style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eOverview\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eThis page proposes adding methods/events to chrome.settings to let extensions store settings data (assumed to be small pieces of string-like data) that is synced across a user's browser instances.  Initially, the module would start in the chrome.experimental.settings namespace.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eUse cases\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eEver since extensions/apps sync was implemented, extension settings sync has been an oft-requested and \u003ca href\u003d\"http://googlesystem.blogspot.com/2010/12/predictions-for-googles-2011.html\" rel\u003d\"nofollow\"\u003eanticipated\u003c/a\u003e feature.  Syncing an extension's settings greatly enhances the usefulness of extension sync.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eCould this API be part of the web platform?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eNo.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eDo you expect this API to be fairly stable?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eYes.  This API is based on the HTML5 storage spec which is unlikely to change much.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eWhat UI does this API expose?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eNo additional UI is exposed.  However, we may need to add UI to chrome://extensions for turning off settings sync for particular extensions.  On the other hand, extension developers could do this themselves.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eHow could this API be abused?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eAn ill-behaved extension could create lots of data to sync, bogging down both the client and the server.  This may also cause the user to be throttled, possibly affecting sync for other data types (e.g., bookmarks, preferences).\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003cb\u003eHow would you implement your desired features if this API didn't exist?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eCurrently, extensions sync their settings by stuffing data in bookmarks.  This is obviously very hacky and causes problems for sync.\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eAre you willing and able to develop and maintain this API?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eThe sync team can develop and maintain this API.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eDraft API spec\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eIt might be helpful to refer to docs for the HTML5 storage spec: see \u003ca href\u003d\"http://diveintohtml5.org/storage.html\" rel\u003d\"nofollow\"\u003ethis overview\u003c/a\u003e and \u003ca href\u003d\"http://dev.w3.org/html5/webstorage/\" rel\u003d\"nofollow\"\u003ethe spec itself\u003c/a\u003e.\u003ca href\u003d\"/\" /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\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 style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cb\u003eAPI Reference: chrome.experimental.settings (later chrome.extension.settings)\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cb\u003eMethods\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cb\u003egetSettings\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.experimental.settings.getSettings(function callback)\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cb\u003e    Parameters\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cb\u003e\u003ci\u003e     callback ( function )\u003c/i\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cb\u003e    Callback function\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e    The callback parameter should specify a function that looks like this:\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e    \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003efunction(Storage settings) {...}\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e    \u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cb\u003esettings ( Storage )\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Arial,Verdana,sans-serif\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e    The settings Storage object.  It is guaranteed that nothing else will access this (including sync) for the lifetime of the callback.\u003c/font\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/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cb\u003eEvents\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cb\u003eonSettingsChanged\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.experimental.settings.onSettingChanged.addListener(function(StorageEvent e) {...});\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003eFires when a setting has been changed, either locally or from another browser instance.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cb\u003e    Parameters\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cb\u003e    e ( StorageEvent )\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e    Details of the setting that was changed.\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cul\u003e\u003cli\u003eThe Storage object passed to the getSettings callback behaves very similarly to the localStorage object; it is persisted across browser restarts and is per-profile.  However, any changes made to it may eventually be synced to other browser instances with synced turned on.  Also, the onSettingsChanged event may be fired when changes from other browser instances are synced to the local one.\u003c/li\u003e\u003cli\u003eNo guarantees are made as to how long it takes for changes to propagate, or even if they're propagated at all.  Sync may be turned off, clients may be throttled, and other reasons may prevent or delay propagation.\u003c/li\u003e\u003cli\u003eEach top-level key-value pair is guaranteed to be synced atomically.  That is, while settings[\"a\"] and settings[\"b\"] may be synced independently, two clients writing separate values to the same key will cause the final state to be either one or the other.  However, the settings Storage object at worst behaves like another localStorage.\u003c/li\u003e\u003cli\u003eThe storage limits for the settings Storage object are more stringent than localStorage; tentatively, it is planned that each key/value pair can have a maximum of 16kb, and the total storage for an extension cannot exceed 100kb.  It is expected that the most common use case for this are small pieces of string-like data, e.g. settings and preferences.\u003c/li\u003e\u003cli\u003eExtension developers must take care not to modify settings too often or else they risk being throttled (if they do on the order of hundreds or thousands of changes in a 24 hour period).\u003c/li\u003e\u003cli\u003eSync will only kick in after a call to getSettings to propagate any changed settings and/or apply any new settings.  This means that an extension developer has some control on how often sync fires.\u003c/li\u003e\u003cli\u003eUninstalling an extension currently clears all settings data for it.  (This may be surprising in some cases; we may need to revisit this in the future.)\u003c/li\u003e\u003cli\u003eThis API will have its own manifest permission (\"settings\") but won't trigger a warning.\u003c/li\u003e\u003c/ul\u003e\u003c/font\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif\"\u003eExample usage:\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// Imagine an extension that retrieves data from a particular URL.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.experimental.settings.getSettings(function(settings) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Do initial frobnigation, setting a default value if necessary.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  var dataUrl \u003d settings[\"dataUrl\"];\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  if (!dataUrl) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    // This will be propagated to other browser instances after this\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    // callback.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    dataUrl \u003d settings[\"dataUrl\"] \u003d \"http://www.foo.com/mydata\";\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  doInitialFrobnigate(dataUrl);\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\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// Do an update every time the dataUrl setting is changed (either\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// locally or remotely).\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.experimental.settings.onSettingChanged.addListener(function(e) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  if (e.key \u003d\u003d \"dataUrl\") {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    console.info(\"Changing data URL from \" + e.oldValue + \" to \" + e.newValue);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    doUpdateFrobnigate(e.newValue);\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\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\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eExample code demonstrating when it's okay to access the settings object:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.extension.settings.getSettings(function(settings) {\u003cbr /\u003e // While this callback is being invoked, the extension has exclusive access to the settings.\u003cbr /\u003e // At other times the extension does not have access. We do this to avoid raciness between\u003cbr /\u003e // multiple processes manipulating the data concurrently.\u003cbr /\u003e var foo \u003d settings.foo;\u003cbr /\u003e settings.foo \u003d foo + 1;  // using settings object here is OK\u003cbr /\u003e\u003cbr /\u003e window.setTimeout(function() {\u003cbr /\u003e    // This is invalid! The extension no longer has access to |settings|. We need to make it\u003cbr /\u003e    // so that trying to read or write from the settings object after the callback is complete\u003cbr /\u003e    // throws an error.\u003cbr /\u003e   alert(settings.foo);\u003cbr /\u003e }, 1000);\u003cbr /\u003e\u003cbr /\u003e // Access to the extension's settings goes away at the end of this callback.\u003cbr /\u003e});\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eOpen questions\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003eIs there a need for syncing other types of data, e.g. large pieces of data or structured data?\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003eDo we need anything for the enterprise use case?  It may be useful to be able to provide a default settings object and maybe even to mark some settings non-editable.\u003c/font\u003e\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/settings"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4998179433917969612"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4998179433917969612"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4998179433917969612"}],"author":[{"name":{"$t":"Fred Akalin"},"email":{"$t":"akalin@chromium.org"}}],"sites$pageName":{"$t":"settings"},"sites$revision":{"$t":"21"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8988943017329619355"},"published":{"$t":"2011-10-28T13:49:59.888Z"},"updated":{"$t":"2011-12-20T00:50:31.878Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:23:32.188Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Settings pages"},"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-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eOverview\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eWe want to enable extensions to provide custom settings UI to extend the (more and more) minimal settings UI that is build into Chrome.\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eUse cases\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eSimilarly to e.g. browser actions, an extension can define a HTML file in its manifest that it wants to be rendered as part of Chrome's settings UI. We provide a set of widgets (CSS and JavaScript) that an extension can use to render its UI using the same theme as Chrome's settings UI, however, extensions are free to display arbitrary UI.\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eCould this API be part of the web platform?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eno\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eDo you expect this API to be fairly stable?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eThe API itself will be stable. We might change/extend the JavaScript/CSS provided to render the settings UI in the future, however, I expect that it will be possible to do this in a non-breaking way.\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eWhat UI does this API expose?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003eAn extension using this API can display arbitrary HTML as part of Chrome's settings UI.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eHow could this API be abused?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eAn extension using this API can pretend to e.g. manage your passwords, but instead send all passwords you enter to a third-party site. A possible way to mitigate this risk would be to disallow all communication with other extension pages or network resources from settings page. An extension could also mess up your settings, but it already can do so from the background page.\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eIn order to avoid an extension accessing the APIs available to Chrome's settings UI, the extension settings page would be rendered in an sandboxed iframe.\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003cb\u003eHow would you implement your desired features if this API didn't exist?\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003eAn extension could define a browser action or an options page and allow the user to configure settings from there. Option pages, however, are meant for settings for the extension, not settings for the browser. Browser actions aren't where the user expects browser settings either.\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Verdana,sans-serif;margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cb\u003eAre you willing and able to develop and maintain this API?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eYes.\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/settings_pages"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8988943017329619355"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8988943017329619355"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8988943017329619355"}],"author":[{"name":{"$t":"Jochen Eisinger"},"email":{"$t":"jochen@chromium.org"}}],"sites$pageName":{"$t":"settings_pages"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1280397686848985460"},"published":{"$t":"2010-02-25T21:41:42.671Z"},"updated":{"$t":"2011-12-20T00:50:31.877Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-02-25T21:41:42.671Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"process-extension-screenshot.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1280397686848985460"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8399156310382950414"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/processes-api/process-extension-screenshot.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1280397686848985460"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1280397686848985460"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1280397686848985460"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1280397686848985460"}],"author":[{"name":{"$t":"Charles Reis"},"email":{"$t":"creis@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"UCl7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4117523327975588499"},"published":{"$t":"2010-02-25T20:20:52.801Z"},"updated":{"$t":"2011-12-20T00:50:31.877Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:19:57.581Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cookies 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-Overview\" /\u003eOverview\u003c/h3\u003e\r\nThe proposed API allows Chrome extensions to access the browser's cookies, without having to send HTTP requests to obtain those cookies.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Use-Cases\" /\u003eUse Cases\u003c/h3\u003e\r\nWe are developing a Chrome extension that interacts with known services requiring authentication. We would like the extension to be able to detect authentication status changes as they occur in an inexpensive way, by checking for the existence of known cookies associated with that service.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nIn general, any Chrome extension wishing to interact with services that set browser cookies could benefit from this API. The API could also support Chrome extensions which don't care about specific known cookies, but can for instance help the user gain more visibility or control into what cookies are being set on their browser.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Could-this-API-be-part-of-the-web-platform-\" /\u003eCould this API be part of the web platform?\u003c/h3\u003e\r\nNo. The web platform relies on the same origin model, and sites can read their own cookies. This API is for elevated privilege entities (i.e. extensions) to read and write cookies across origins.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Do-you-expect-this-API-to-be-fairly-stable-\" /\u003eDo you expect this API to be fairly stable?\u003c/h3\u003e\r\nYes. The general mechanism of browser cookies is mature and likely stable, making this API equally stable.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-What-UI-does-this-API-expose-\" /\u003eWhat UI does this API expose?\u003c/h3\u003e\r\nNone.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-could-this-API-be-abused-\" /\u003eHow could this API be abused?\u003c/h3\u003e\r\nA malicious extension could steal cookies from sites the user visits. The API also exposes HttpOnly cookie data to the extension. However, as documented above, it is already possible to obtain cookies and to generate HTTP requests from a Chrome extension by using content scripts, so these new APIs don't expose any new vulnerabilities.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-How-would-you-implement-your-desired-features-if-this-API-didn-t-exist-\" /\u003eHow would you implement your desired features if this API didn't exist?\u003c/h3\u003e\r\nOne technique is to use content scripts: loading a URL matching a particular cookie's domain, and inspecting the value of document.cookie in a content script. Another method could involve sending an XmlHttpRequest to a service that will return authentication status information for a particular resource. Both of these techniques require network connectivity and communication, making them undesirable in a real-world application. Loading extra URLs in new windows or hidden iframes in order to access cookies via content scripts poses further potential security, privacy and usability risks.\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Are-you-willing-and-able-to-develop-and-maintain-this-API-\" /\u003eAre you willing and able to develop and maintain this API?\u003c/h3\u003e\r\nYes.\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Draft-API-spec\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eDraft API spec\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Use-the-chrome.experimental.cookies-module-to-access-cookies-from-your-extension.Manifest-You-must-declare-the-cookies-permission-in-your-extension-s-manifest-to-use-the-cookies-API.-You-also-must-request-cross-origin-permissions-for-the-domains-you-wish-t\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eUse the \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.experimental.cookies\u003c/font\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e module to access cookies from your extension.\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Manifest-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eManifest \u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003eYou must declare the \"cookies\" permission in your extension's manifest to use the cookies API. You also must request cross-origin permissions for the domains you wish to access cookies for, using the same match-pattern syntax used for cross-origin XHR permissions. For example:\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-name-:-My-extension-...-permissions-:-cookies-http:-.google.com-...-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003e{\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  \"name\": \"My extension\",\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  ...\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  \"permissions\": [\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    \"cookies\",\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    \"http://*.google.com/\"\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  ],\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  ...\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e}\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Methods\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eMethods\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-get\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eget\u003c/font\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.get-object-details-function-callback-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003echrome.experimental.cookies.get(object details, function callback)\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Retrieves-information-about-a-single-cookie.-If-more-than-one-cookie-of-the-same-name-exists-for-the-given-URL-the-one-with-the-longest-domain-property-longest-path-length-or-earliest-creation-time-will-be-returned.\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eRetrieves information about a single cookie. If more than one cookie of the same name exists for the given URL, the one with the longest domain property, longest path length, or earliest creation time will be returned.\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Parameters\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Parameters1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-details-object-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Details-to-identify-the-cookie-being-retrieved.\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan\u003eDetails to identify the cookie being retrieved.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-url-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-URL-with-which-the-cookie-to-retrieve-is-associated.-This-argument-may-be-a-full-URL-in-which-case-any-data-following-the-URL-path-e.g.-the-query-string-is-simply-ignored.-If-host-permissions-for-this-URL-are-not-specified-in-the-manifest-file-the-API-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan\u003eThe URL with which the cookie to retrieve is associated. This argument may be a full URL, in which case any data following the URL path (e.g. the query string) is simply ignored. If host permissions for this URL are not specified in the manifest file, the API call will fail.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\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\"\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003ename (string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/blockquote\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\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie-to-retrieve.\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan\u003eThe name of the cookie to retrieve.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-storeId-optional-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003estoreId (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-in-which-to-look-for-the-cookie.-By-default-the-current-execution-context-s-cookie-store-will-be-used.\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan\u003eThe ID of the cookie store in which to look for the cookie. By default, the current execution context's cookie store will be used.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-callback-function-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003ecallback (function)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Callback-Function\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eCallback Function\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-callback-parameter-should-specify-a-function-that-looks-like-this:-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:bold;font-size:16px\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eThe callback parameter should specify a function that looks like this: \u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-function-Cookie-cookie-...-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:bold;font-size:16px\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003efunction(Cookie cookie) {...});\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-cookie-optional-Cookie-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003ecookie (optional Cookie)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Contains-details-about-the-cookie.-This-parameter-is-null-if-no-such-cookie-was-found.\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan\u003eContains details about the cookie. This parameter is null if no such cookie was found.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-getAll\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cb\u003egetAll\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.getAll-object-details-function-callback-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003echrome.experimental.cookies.getAll(object \u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-details\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003edetails\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003e, function callback)\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Retrieves-all-cookies-from-a-single-cookie-store-that-match-the-given-information.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eRetrieves all cookies from a single cookie store that match the given information.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Parameters2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-details-object-1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:bold;font-size:16px\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Information-to-filter-the-cookies-being-retrieved.\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:bold;font-size:16px\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal;font-size:16px;font-weight:bold\"\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eInformation to filter the cookies being retrieved.\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/blockquote\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-url-optional-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003eurl (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Restricts-the-retrieved-cookies-to-those-that-would-match-the-given-URL.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eRestricts the retrieved cookies to those that would match the given URL.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-name-optional-string-Filters-the-cookies-by-name.domain-optional-string-Restricts-the-retrieved-cookies-to-those-whose-domains-match-or-are-subdomains-of-this-one.path-optional-string-Restricts-the-retrieved-cookies-to-those-whose-path-exactly-matches-this\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-name-optional-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003ename (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\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\u003ch3\u003e\u003ca name\u003d\"TOC-Filters-the-cookies-by-name.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eFilters the cookies by name.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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 /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-domain-optional-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003edomain (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\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\u003ch3\u003e\u003ca name\u003d\"TOC-Restricts-the-retrieved-cookies-to-those-whose-domains-match-or-are-subdomains-of-this-one.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eRestricts the retrieved cookies to those whose domains match or are subdomains of this one.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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 /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-path-optional-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003epath (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\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\u003ch3\u003e\u003ca name\u003d\"TOC-Restricts-the-retrieved-cookies-to-those-whose-path-exactly-matches-this-string.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eRestricts the retrieved cookies to those whose path exactly matches this string.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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 /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-secure-optional-boolean-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003esecure (optional boolean)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\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\u003ch3\u003e\u003ca name\u003d\"TOC-Filters-the-cookies-by-their-Secure-property.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eFilters the cookies by their Secure property.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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 /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-session-optional-boolean-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003esession (optional \u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-boolean\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-boolean1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003eboolean\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC--\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\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\u003ch3\u003e\u003ca name\u003d\"TOC-Filters-out-session-vs.-persistent-cookies.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eFilters out session vs. persistent cookies.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-storeId-optional-string-1\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\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 /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-storeId-optional-string-2\" /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-storeId-optional-string-3\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003estoreId (optional \u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-string\" /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-string1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-string2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003estring\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC--1\" /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC--2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\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\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\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-cookie-store-to-retrieve-cookies-from.-If-omitted-the-current-execution-context-s-cookie-store-will-be-used.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-The-cookie-store-to-retrieve-cookies-from.-If-omitted-the-current-execution-context-s-cookie-store-will-be-used.1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003eThe cookie store to retrieve cookies from. If omitted, the current execution context's cookie store will be used.\u003c/span\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\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\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\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\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\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\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\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\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 /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-callback-function-1\" /\u003e\u003cspan style\u003d\"font-weight:normal;font-size:13px\"\u003e\u003ci\u003ecallback (function)\u003c/i\u003e\u003c/span\u003e\u003c/h3\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\u003ch4\u003e\u003ca name\u003d\"TOC-Callback-Function1\" /\u003eCallback Function\u003c/h4\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-callback-parameter-should-specify-a-function-that-looks-like-this:\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eThe callback parameter should specify a function that looks like this:\u003c/span\u003e\u003c/h4\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\u003ch4\u003e\u003ca name\u003d\"TOC-function-array-of-Cookie-cookies-...-\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003efunction(array of Cookie cookies) {...});\u003c/code\u003e\u003c/span\u003e\u003c/h4\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\u003ch4\u003e\u003ca name\u003d\"TOC-cookies-array-of-Cookie-\" /\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\u003ci\u003ecookies (array of Cookie)\u003c/i\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-All-the-existing-unexpired-cookies-that-match-the-given-cookie-info.\" /\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\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003eAll the existing, unexpired cookies that match the given cookie info.\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-set\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003eset\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.set-object-details-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003echrome.experimental.cookies.set(object details)\u003c/code\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Sets-a-cookie-with-the-given-cookie-data-may-overwrite-equivalent-cookies-if-they-exist.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Sets-a-cookie-with-the-given-cookie-data-may-overwrite-equivalent-cookies-if-they-exist.1\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eSets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\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\u003ch4\u003e\u003ca name\u003d\"TOC-Parameters3\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-details-object-2\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch4\u003e\u003ca name\u003d\"TOC-Details-about-the-cookie-being-set.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eDetails about the cookie being set.\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\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\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-url-string-1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-request-URI-to-associate-with-the-setting-of-the-cookie.-This-value-can-affect-the-default-domain-and-path-values-of-the-created-cookie.-If-host-permissions-for-this-URL-are-not-specified-in-the-manifest-file-the-API-call-will-fail.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe request-URI to associate with the setting of the cookie. This value can affect the default domain and path values of the created cookie. If host permissions for this URL are not specified in the manifest file, the API call will fail.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-name-optional-string-1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003ename (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie.-Empty-by-default-if-omitted.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe name of the cookie. Empty by default if omitted.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-value-optional-string-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003evalue (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-value-of-the-cookie.-Empty-by-default-if-omitted.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe value of the cookie. Empty by default if omitted.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-domain-optional-string-1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003edomain (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-domain-of-the-cookie.-If-omitted-the-cookie-becomes-a-host-only-cookie.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe domain of the cookie. If omitted, the cookie becomes a host-only cookie.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-path-optional-string-1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003epath (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-path-of-the-cookie.-Defaults-to-the-path-portion-of-the-url-parameter.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe path of the cookie. Defaults to the path portion of the url parameter.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-secure-optional-boolean-1\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003esecure (optional boolean)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-Whether-the-cookie-should-be-marked-as-Secure.-Defaults-to-false.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eWhether the cookie should be marked as Secure. Defaults to false.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-httpOnly-optional-boolean-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003ehttpOnly (optional boolean)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-Whether-the-cookie-should-be-marked-as-HttpOnly.-Defaults-to-false.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eWhether the cookie should be marked as HttpOnly. Defaults to false.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-expirationDate-optional-number-\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003eexpirationDate (optional number)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-expiration-date-of-the-cookie-as-the-number-of-seconds-since-the-UNIX-epoch.-If-omitted-the-cookie-becomes-a-session-cookie.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe expiration date of the cookie as the number of seconds since the UNIX epoch. If omitted, the cookie becomes a session cookie.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\u003ch3\u003e\u003ca name\u003d\"TOC-storeId-optional-string-4\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003estoreId (optional string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\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\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-in-which-to-set-the-cookie.-By-default-the-cookie-is-set-in-the-current-execution-context-s-cookie-store.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003eThe ID of the cookie store in which to set the cookie. By default, the cookie is set in the current execution context's cookie store.\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/blockquote\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003cb\u003eremove\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.remove-object-details-\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.remove-object-details-1\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.remove-object-details-2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003echrome.experimental.cookies.remove(object details)\u003c/code\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Deletes-a-cookie-by-name.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Deletes-a-cookie-by-name.1\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Deletes-a-cookie-by-name.2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Deletes-a-cookie-by-name.3\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003eDeletes a cookie by name.\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\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\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Parameters4\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters5\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters6\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters7\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ccode\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters8\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters9\" /\u003e\u003cfont color\u003d\"#000000\" face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003eParameters\u003c/span\u003e\u003c/font\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/code\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-details-object-3\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/span\u003e\u003c/h4\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\u003ch4\u003e\u003ca name\u003d\"TOC-Information-to-identify-the-cookie-to-remove.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003eInformation to identify the cookie to remove.\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-url-string-2\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-url-string-3\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-URL-associated-with-the-cookie.-If-host-permissions-for-this-URL-are-not-specified-in-the-manifest-file-the-API-call-will-fail.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003eThe URL associated with the cookie. If host permissions for this URL are not specified in the manifest file, the API call will fail.\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cspan style\u003d\"font-style:normal;font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-name-string-\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003ename (string)\u003c/span\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\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\u003ch3\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie-to-remove.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eThe name of the cookie to remove.\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-storeId-optional-string-5\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003estoreId (optional string)\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\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\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eThe ID of the cookie store to look in for the cookie. If unspecified, the cookie is looked for by default in the current execution context's cookie store.\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-getAllCookieStores\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-style:normal;font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cspan style\u003d\"font-style:normal;font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cspan style\u003d\"font-style:normal;font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-getAllCookieStores1\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-getAllCookieStores2\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-getAllCookieStores3\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003egetAllCookieStores\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.getAllCookieStores-function-callback-\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.getAllCookieStores-function-callback-1\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.getAllCookieStores-function-callback-2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003echrome.experimental.cookies.getAllCookieStores(function callback)\u003c/code\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Lists-all-existing-cookie-stores.\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Lists-all-existing-cookie-stores.1\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Lists-all-existing-cookie-stores.2\" /\u003e\u003cb\u003e\u003cb\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal;font-size:13px\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Lists-all-existing-cookie-stores.3\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003eLists all existing cookie stores.\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/b\u003e\u003c/b\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\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\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Parameters10\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters11\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters12\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch3 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters13\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters14\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Parameters15\" /\u003e\u003cfont color\u003d\"#000000\" face\u003d\"Arial, Verdana, sans-serif\" size\u003d\"3\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003eParameters\u003c/span\u003e\u003c/font\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/code\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/span\u003e\u003c/i\u003e\u003c/span\u003e\u003c/i\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-callback-function-2\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ci\u003ecallback (function)\u003c/i\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\" /\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Callback-Function2\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Callback-Function3\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003eCallback Function\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-callback-parameter-should-specify-a-function-that-looks-like-this:1\" /\u003e\u003cspan style\u003d\"font-style:normal;font-weight:normal\"\u003eThe callback parameter should specify a function that looks like this:\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-function-array-of-CookieStore-cookieStores-...-\" /\u003e\u003cspan style\u003d\"font-style:normal;font-weight:normal\"\u003e\u003ccode\u003efunction(array of CookieStore cookieStores) {...});\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-cookieStores-array-of-CookieStore-\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003ecookieStores (array of CookieStore)\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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/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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\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\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-All-the-existing-cookie-stores.\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003eAll the existing cookie stores.\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/div\u003e\u003c/blockquote\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/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Events\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Events1\" /\u003eEvents\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-onChanged\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-onChanged1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-onChanged2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003eonChanged\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.onChanged.addListener-function-object-changeInfo-...-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.onChanged.addListener-function-object-changeInfo-...-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-chrome.experimental.cookies.onChanged.addListener-function-object-changeInfo-...-2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003echrome.experimental.cookies.onChanged.addListener(function(object changeInfo) {...});\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Fired-when-a-cookie-is-set-or-removed.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Fired-when-a-cookie-is-set-or-removed.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Fired-when-a-cookie-is-set-or-removed.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eFired when a cookie is set or removed.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Parameters16\" /\u003eParameters\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-changeInfo-object-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-changeInfo-object-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-changeInfo-object-2\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003echangeInfo (object)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-removed-boolean-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-removed-boolean-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-removed-boolean-2\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eremoved (boolean)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\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\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-True-if-a-cookie-was-removed.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-a-cookie-was-removed.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-a-cookie-was-removed.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eTrue if a cookie was removed.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-cookie-Cookie-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-cookie-Cookie-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-cookie-Cookie-2\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003ecookie (Cookie) \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\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\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Information-about-the-cookie-that-was-set-or-removed.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Information-about-the-cookie-that-was-set-or-removed.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Information-about-the-cookie-that-was-set-or-removed.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eInformation about the cookie that was set or removed.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Types\" /\u003eTypes\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Cookie-object-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Cookie-object-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Cookie-object-2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Cookie-object-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Cookie-object-4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eCookie (object)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Represents-information-about-an-HTTP-cookie.\" /\u003e\u003ci\u003e\u003ci\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Represents-information-about-an-HTTP-cookie.1\" /\u003e\u003cspan style\u003d\"font-style: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\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Represents-information-about-an-HTTP-cookie.2\" /\u003e\u003ci\u003e\u003ci\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Represents-information-about-an-HTTP-cookie.3\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eRepresents information about an HTTP cookie.\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-name-string-1\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-name-string-2\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-name-string-3\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-name-string-4\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-name-string-5\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003ename (string)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-name-of-the-cookie.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe name of the cookie.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-value-string-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-value-string-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-value-string-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-value-string-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-value-string-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003evalue (string)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-value-of-the-cookie.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-value-of-the-cookie.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-value-of-the-cookie.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-value-of-the-cookie.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-value-of-the-cookie.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe value of the cookie.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-domain-string-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-domain-string-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-domain-string-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-domain-string-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-domain-string-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003edomain (string)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-domain-of-the-cookie.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-domain-of-the-cookie.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-domain-of-the-cookie.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-domain-of-the-cookie.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-domain-of-the-cookie.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe domain of the cookie.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-hostOnly-boolean-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-hostOnly-boolean-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-hostOnly-boolean-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-hostOnly-boolean-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-hostOnly-boolean-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003ehostOnly (boolean) \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-host-only-cookie-i.e.-a-request-s-host-must-exactly-match-the-domain-of-the-cookie-.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-host-only-cookie-i.e.-a-request-s-host-must-exactly-match-the-domain-of-the-cookie-.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-host-only-cookie-i.e.-a-request-s-host-must-exactly-match-the-domain-of-the-cookie-.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-host-only-cookie-i.e.-a-request-s-host-must-exactly-match-the-domain-of-the-cookie-.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-host-only-cookie-i.e.-a-request-s-host-must-exactly-match-the-domain-of-the-cookie-.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eTrue if the cookie is a host-only cookie (i.e. a request's host must exactly match the domain of the cookie).\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-path-string-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-path-string-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-path-string-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-path-string-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-path-string-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003epath (string)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-path-of-the-cookie.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-path-of-the-cookie.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-path-of-the-cookie.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-path-of-the-cookie.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-path-of-the-cookie.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe path of the cookie.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-secure-boolean-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-secure-boolean-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-secure-boolean-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-secure-boolean-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-secure-boolean-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003esecure (boolean)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-Secure-i.e.-its-scope-is-limited-to-secure-channels-typically-HTTPS-.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-Secure-i.e.-its-scope-is-limited-to-secure-channels-typically-HTTPS-.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-Secure-i.e.-its-scope-is-limited-to-secure-channels-typically-HTTPS-.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-Secure-i.e.-its-scope-is-limited-to-secure-channels-typically-HTTPS-.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-Secure-i.e.-its-scope-is-limited-to-secure-channels-typically-HTTPS-.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eTrue if the cookie is marked as Secure (i.e. its scope is limited to secure channels, typically HTTPS).\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-httpOnly-boolean-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-httpOnly-boolean-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-httpOnly-boolean-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-httpOnly-boolean-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-httpOnly-boolean-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003ehttpOnly (boolean)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-HttpOnly-i.e.-the-cookie-is-inaccessible-to-client-side-scripts-.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-HttpOnly-i.e.-the-cookie-is-inaccessible-to-client-side-scripts-.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-HttpOnly-i.e.-the-cookie-is-inaccessible-to-client-side-scripts-.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-HttpOnly-i.e.-the-cookie-is-inaccessible-to-client-side-scripts-.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-marked-as-HttpOnly-i.e.-the-cookie-is-inaccessible-to-client-side-scripts-.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eTrue if the cookie is marked as HttpOnly (i.e. the cookie is inaccessible to client-side scripts).\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003ci\u003esession (boolean)\u003cbr /\u003e\u003c/i\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-session-cookie-as-opposed-to-a-persistent-cookie-with-an-expiration-date.\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-session-cookie-as-opposed-to-a-persistent-cookie-with-an-expiration-date.1\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-session-cookie-as-opposed-to-a-persistent-cookie-with-an-expiration-date.2\" /\u003e\u003ccode\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-session-cookie-as-opposed-to-a-persistent-cookie-with-an-expiration-date.3\" /\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-True-if-the-cookie-is-a-session-cookie-as-opposed-to-a-persistent-cookie-with-an-expiration-date.4\" /\u003e\u003ccode\u003e\u003cfont color\u003d\"#000000\" face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eTrue if the cookie is a session cookie, as opposed to a persistent cookie with an expiration date.\u003c/span\u003e\u003c/font\u003e\u003c/code\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/code\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-expirationDate-optional-number-1\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-expirationDate-optional-number-2\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-expirationDate-optional-number-3\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-expirationDate-optional-number-4\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-expirationDate-optional-number-5\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eexpirationDate (optional number) \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-expiration-date-of-the-cookie-as-the-number-of-seconds-since-the-UNIX-epoch.-Not-provided-for-session-cookies.-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-expiration-date-of-the-cookie-as-the-number-of-seconds-since-the-UNIX-epoch.-Not-provided-for-session-cookies.-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-expiration-date-of-the-cookie-as-the-number-of-seconds-since-the-UNIX-epoch.-Not-provided-for-session-cookies.-2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-expiration-date-of-the-cookie-as-the-number-of-seconds-since-the-UNIX-epoch.-Not-provided-for-session-cookies.-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-expiration-date-of-the-cookie-as-the-number-of-seconds-since-the-UNIX-epoch.-Not-provided-for-session-cookies.-4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe expiration date of the cookie as the number of seconds since the UNIX epoch. Not provided for session cookies. \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-storeId-string-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-storeId-string-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-storeId-string-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-storeId-string-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-storeId-string-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003estoreId (string)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-containing-this-cookie-as-provided-in-getAllCookieStores-.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-containing-this-cookie-as-provided-in-getAllCookieStores-.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-containing-this-cookie-as-provided-in-getAllCookieStores-.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-containing-this-cookie-as-provided-in-getAllCookieStores-.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-ID-of-the-cookie-store-containing-this-cookie-as-provided-in-getAllCookieStores-.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe ID of the cookie store containing this cookie, as provided in getAllCookieStores().\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-CookieStore-object-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-CookieStore-object-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-CookieStore-object-2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-CookieStore-object-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-CookieStore-object-4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eCookieStore (object) \u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-A-session-cookie-store-in-the-browser.-An-incognito-mode-window-for-instance-has-a-separate-session-cookie-store-from-other-windows.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-session-cookie-store-in-the-browser.-An-incognito-mode-window-for-instance-has-a-separate-session-cookie-store-from-other-windows.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-session-cookie-store-in-the-browser.-An-incognito-mode-window-for-instance-has-a-separate-session-cookie-store-from-other-windows.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-session-cookie-store-in-the-browser.-An-incognito-mode-window-for-instance-has-a-separate-session-cookie-store-from-other-windows.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-session-cookie-store-in-the-browser.-An-incognito-mode-window-for-instance-has-a-separate-session-cookie-store-from-other-windows.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eA session cookie store in the browser. An incognito mode window, for instance, has a separate session cookie store from other windows.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-id-string-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-id-string-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-id-string-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-id-string-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-id-string-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eid (string)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-The-unique-identifier-for-the-cookie-store.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-unique-identifier-for-the-cookie-store.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-unique-identifier-for-the-cookie-store.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-unique-identifier-for-the-cookie-store.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-The-unique-identifier-for-the-cookie-store.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eThe unique identifier for the cookie store.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-tabIds-array-of-integer-\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-tabIds-array-of-integer-1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-tabIds-array-of-integer-2\" /\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-tabIds-array-of-integer-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-tabIds-array-of-integer-4\" /\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003etabIds (array of integer)\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Identifiers-of-all-the-browser-tabs-that-share-this-cookie-store.\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Identifiers-of-all-the-browser-tabs-that-share-this-cookie-store.1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Identifiers-of-all-the-browser-tabs-that-share-this-cookie-store.2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Identifiers-of-all-the-browser-tabs-that-share-this-cookie-store.3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-Identifiers-of-all-the-browser-tabs-that-share-this-cookie-store.4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003ccode\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif\"\u003eIdentifiers of all the browser tabs that share this cookie store.\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-2\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-5\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-6\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-A-more-formal-description-of-the-API-and-some-sample-code-usage:\" /\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-more-formal-description-of-the-API-and-some-sample-code-usage:1\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-more-formal-description-of-the-API-and-some-sample-code-usage:2\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-more-formal-description-of-the-API-and-some-sample-code-usage:3\" /\u003e\u003ci\u003e\u003ci\u003e\u003cb\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ch4 style\u003d\"display:inline!important\"\u003e\u003ca name\u003d\"TOC-A-more-formal-description-of-the-API-and-some-sample-code-usage:4\" /\u003e\u003cspan style\u003d\"font-style:normal\"\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\u003cspan style\u003d\"font-weight:bold\"\u003eA more formal description of the API and some sample code usage:\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/i\u003e\u003c/i\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/b\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ccode\u003e[\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  {\u003cdiv\u003e    \"namespace\": \"experimental.cookies\",\u003c/div\u003e\u003cdiv\u003e    \"types\": [\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"id\": \"Cookie\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Represents information about an HTTP cookie.\",\u003c/div\u003e\u003cdiv\u003e        \"properties\": {\u003c/div\u003e\u003cdiv\u003e          \"name\": {\"type\": \"string\", \"description\": \"The name of the cookie.\"},\u003c/div\u003e\u003cdiv\u003e          \"value\": {\"type\": \"string\", \"description\": \"The value of the cookie.\"},\u003c/div\u003e\u003cdiv\u003e          \"domain\": {\"type\": \"string\", \"description\": \"The domain of the cookie.\"},\u003c/div\u003e\u003cdiv\u003e          \"hostOnly\": {\"type\": \"boolean\", \"description\": \"True if the cookie is a host-only cookie (i.e. a request's host must exactly match the domain of the cookie).\"},\u003c/div\u003e\u003cdiv\u003e          \"path\": {\"type\": \"string\", \"description\": \"The path of the cookie.\"},\u003c/div\u003e\u003cdiv\u003e          \"secure\": {\"type\": \"boolean\", \"description\": \"True if the cookie is marked as Secure (i.e. its scope is limited to secure channels, typically HTTPS).\"},\u003c/div\u003e\u003cdiv\u003e          \"httpOnly\": {\"type\": \"boolean\", \"description\": \"True if the cookie is marked as HttpOnly (i.e. the cookie is inaccessible to client-side scripts).\"},\u003c/div\u003e\u003cdiv\u003e          \"session\": {\"type\": \"boolean\", \"description\": \"True if the cookie is a session cookie, as opposed to a persistent cookie with an expiration date.\"},\u003c/div\u003e\u003cdiv\u003e          \"expirationDate\": {\"type\": \"number\", \"optional\": true, \"description\": \"The expiration date of the cookie as the number of seconds since the UNIX epoch. Not provided for session cookies.\"},\u003c/div\u003e\u003cdiv\u003e          \"storeId\": {\"type\": \"string\", \"description\": \"The ID of the cookie store containing this cookie, as provided in getAllCookieStores().\"}\u003c/div\u003e\u003cdiv\u003e        }\u003c/div\u003e\u003cdiv\u003e      },\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"id\": \"CookieStore\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Represents a cookie store in the browser. An incognito mode window, for instance, uses a separate cookie store from a non-incognito window.\",\u003c/div\u003e\u003cdiv\u003e        \"properties\": {\u003c/div\u003e\u003cdiv\u003e          \"id\": {\"type\": \"string\", \"description\": \"The unique identifier for the cookie store.\"},\u003c/div\u003e\u003cdiv\u003e          \"tabIds\": {\"type\": \"array\", \"items\": {\"type\": \"integer\"}, \"description\": \"Identifiers of all the browser tabs that share this cookie store.\"}\u003c/div\u003e\u003cdiv\u003e        }\u003c/div\u003e\u003cdiv\u003e      }\u003c/div\u003e\u003cdiv\u003e    ],\u003c/div\u003e\u003cdiv\u003e    \"functions\": [\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"name\": \"get\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Retrieves information about a single cookie. If more than one cookie of the same name exists for the given URL, the one with the longest domain property, longest path length, or earliest creation time will be returned.\",\u003c/div\u003e\u003cdiv\u003e        \"parameters\": [\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"details\",\u003c/div\u003e\u003cdiv\u003e            \"description\": \"Details to identify the cookie being retrieved.\",\u003c/div\u003e\u003cdiv\u003e            \"properties\": {\u003c/div\u003e\u003cdiv\u003e              \"url\": {\"type\": \"string\", \"description\": \"The URL with which the cookie to retrieve is associated. This argument may be a full URL, in which case any data following the URL path (e.g. the query string) is simply ignored. If host permissions for this URL are not specified in the manifest file, the API call will fail.\"},\u003c/div\u003e\u003cdiv\u003e              \"name\": {\"type\": \"string\", \"description\": \"The name of the cookie to retrieve.\"},\u003c/div\u003e\u003cdiv\u003e              \"storeId\": {\"type\": \"string\", \"optional\": true, \"description\": \"The ID of the cookie store in which to look for the cookie. By default, the current execution context's cookie store will be used.\"}\u003c/div\u003e\u003cdiv\u003e            }\u003c/div\u003e\u003cdiv\u003e          },\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"callback\",\u003c/div\u003e\u003cdiv\u003e            \"parameters\": [\u003c/div\u003e\u003cdiv\u003e              {\u003c/div\u003e\u003cdiv\u003e                \"name\": \"cookie\", \"$ref\": \"Cookie\", \"optional\": true, \"description\": \"Contains details about the cookie. This parameter is null if no such cookie was found.\"\u003c/div\u003e\u003cdiv\u003e              }\u003c/div\u003e\u003cdiv\u003e            ]\u003c/div\u003e\u003cdiv\u003e          }\u003c/div\u003e\u003cdiv\u003e        ]\u003c/div\u003e\u003cdiv\u003e      },\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"name\": \"getAll\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Retrieves all cookies from a single cookie store that match the given information.\",\u003c/div\u003e\u003cdiv\u003e        \"parameters\": [\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"details\",\u003c/div\u003e\u003cdiv\u003e            \"description\": \"Information to filter the cookies being retrieved.\",\u003c/div\u003e\u003cdiv\u003e            \"properties\": {\u003c/div\u003e\u003cdiv\u003e              \"url\": {\"type\": \"string\", \"optional\": true, \"description\": \"Restricts the retrieved cookies to those that would match the given URL.\"},\u003c/div\u003e\u003cdiv\u003e              \"name\": {\"type\": \"string\", \"optional\": true, \"description\": \"Filters the cookies by name.\"},\u003c/div\u003e\u003cdiv\u003e              \"domain\": {\"type\": \"string\", \"optional\": true, \"description\": \"Restricts the retrieved cookies to those whose domains match or are subdomains of this one.\"},\u003c/div\u003e\u003cdiv\u003e              \"path\": {\"type\": \"string\", \"optional\": true, \"description\": \"Restricts the retrieved cookies to those whose path exactly matches this string.\"},\u003c/div\u003e\u003cdiv\u003e              \"secure\": {\"type\": \"boolean\", \"optional\": true, \"description\": \"Filters the cookies by their Secure property.\"},\u003c/div\u003e\u003cdiv\u003e              \"session\": {\"type\": \"boolean\", \"optional\": true, \"description\": \"Filters out session vs. persistent cookies.\"},\u003c/div\u003e\u003cdiv\u003e              \"storeId\": {\"type\": \"string\", \"optional\": true, \"description\": \"The cookie store to retrieve cookies from. If omitted, the current execution context's cookie store will be used.\"}\u003c/div\u003e\u003cdiv\u003e            }\u003c/div\u003e\u003cdiv\u003e          },\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"callback\",\u003c/div\u003e\u003cdiv\u003e            \"parameters\": [\u003c/div\u003e\u003cdiv\u003e              {\u003c/div\u003e\u003cdiv\u003e                \"name\": \"cookies\", \"type\": \"array\", \"items\": {\"$ref\": \"Cookie\"}, \"description\": \"All the existing, unexpired cookies that match the given cookie info.\"\u003c/div\u003e\u003cdiv\u003e              }\u003c/div\u003e\u003cdiv\u003e            ]\u003c/div\u003e\u003cdiv\u003e          }\u003c/div\u003e\u003cdiv\u003e        ]\u003c/div\u003e\u003cdiv\u003e      },\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"name\": \"set\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Sets a cookie with the given cookie data; may overwrite equivalent cookies if they exist.\",\u003c/div\u003e\u003cdiv\u003e        \"parameters\": [\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"details\",\u003c/div\u003e\u003cdiv\u003e            \"description\": \"Details about the cookie being set.\",\u003c/div\u003e\u003cdiv\u003e            \"properties\": {\u003c/div\u003e\u003cdiv\u003e              \"url\": {\"type\": \"string\", \"description\": \"The request-URI to associate with the setting of the cookie. This value can affect the default domain and path values of the created cookie. If host permissions for this URL are not specified in the manifest file, the API call will fail.\"},\u003c/div\u003e\u003cdiv\u003e              \"name\": {\"type\": \"string\", \"optional\": true, \"description\": \"The name of the cookie. Empty by default if omitted.\"},\u003c/div\u003e\u003cdiv\u003e              \"value\": {\"type\": \"string\", \"optional\": true, \"description\": \"The value of the cookie. Empty by default if omitted.\"},\u003c/div\u003e\u003cdiv\u003e              \"domain\": {\"type\": \"string\", \"optional\": true, \"description\": \"The domain of the cookie. If omitted, the cookie becomes a host-only cookie.\"},\u003c/div\u003e\u003cdiv\u003e              \"path\": {\"type\": \"string\", \"optional\": true, \"description\": \"The path of the cookie. Defaults to the path portion of the url parameter.\"},\u003c/div\u003e\u003cdiv\u003e              \"secure\": {\"type\": \"boolean\", \"optional\": true, \"description\": \"Whether the cookie should be marked as Secure. Defaults to false.\"},\u003c/div\u003e\u003cdiv\u003e              \"httpOnly\": {\"type\": \"boolean\", \"optional\": true, \"description\": \"Whether the cookie should be marked as HttpOnly. Defaults to false.\"},\u003c/div\u003e\u003cdiv\u003e              \"expirationDate\": {\"type\": \"number\", \"optional\": true, \"description\": \"The expiration date of the cookie as the number of seconds since the UNIX epoch. If omitted, the cookie becomes a session cookie.\"},\u003c/div\u003e\u003cdiv\u003e              \"storeId\": {\"type\": \"string\", \"optional\": true, \"description\": \"The ID of the cookie store in which to set the cookie. By default, the cookie is set in the current execution context's cookie store.\"}\u003c/div\u003e\u003cdiv\u003e            }\u003c/div\u003e\u003cdiv\u003e          }\u003c/div\u003e\u003cdiv\u003e        ]\u003c/div\u003e\u003cdiv\u003e      },\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"name\": \"remove\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Deletes a cookie by name.\",\u003c/div\u003e\u003cdiv\u003e        \"parameters\": [\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"details\",\u003c/div\u003e\u003cdiv\u003e            \"description\": \"Information to identify the cookie to remove.\",\u003c/div\u003e\u003cdiv\u003e            \"properties\": {\u003c/div\u003e\u003cdiv\u003e              \"url\": {\"type\": \"string\", \"description\": \"The URL associated with the cookie. If host permissions for this URL are not specified in the manifest file, the API call will fail.\"},\u003c/div\u003e\u003cdiv\u003e              \"name\": {\"type\": \"string\", \"description\": \"The name of the cookie to remove.\"},\u003c/div\u003e\u003cdiv\u003e              \"storeId\": {\"type\": \"string\", \"optional\": true, \"description\": \"The ID of the cookie store to look in for the cookie. If unspecified, the cookie is looked for by default in the current execution context's cookie store.\"}\u003c/div\u003e\u003cdiv\u003e            }\u003c/div\u003e\u003cdiv\u003e          }\u003c/div\u003e\u003cdiv\u003e        ]\u003c/div\u003e\u003cdiv\u003e      },\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"name\": \"getAllCookieStores\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Lists all existing cookie stores.\",\u003c/div\u003e\u003cdiv\u003e        \"parameters\": [\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"callback\",\u003c/div\u003e\u003cdiv\u003e            \"parameters\": [\u003c/div\u003e\u003cdiv\u003e              {\u003c/div\u003e\u003cdiv\u003e                \"name\": \"cookieStores\", \"type\": \"array\", \"items\": {\"$ref\": \"CookieStore\"}, \"description\": \"All the existing cookie stores.\"\u003c/div\u003e\u003cdiv\u003e              }\u003c/div\u003e\u003cdiv\u003e            ]\u003c/div\u003e\u003cdiv\u003e          }\u003c/div\u003e\u003cdiv\u003e        ]\u003c/div\u003e\u003cdiv\u003e      }\u003c/div\u003e\u003cdiv\u003e    ],\u003c/div\u003e\u003cdiv\u003e    \"events\": [\u003c/div\u003e\u003cdiv\u003e      {\u003c/div\u003e\u003cdiv\u003e        \"name\": \"onChanged\",\u003c/div\u003e\u003cdiv\u003e        \"type\": \"function\",\u003c/div\u003e\u003cdiv\u003e        \"description\": \"Fired when a cookie is set or removed.\",\u003c/div\u003e\u003cdiv\u003e        \"parameters\": [\u003c/div\u003e\u003cdiv\u003e          {\u003c/div\u003e\u003cdiv\u003e            \"type\": \"object\",\u003c/div\u003e\u003cdiv\u003e            \"name\": \"changeInfo\",\u003c/div\u003e\u003cdiv\u003e            \"properties\": {\u003c/div\u003e\u003cdiv\u003e              \"removed\": {\"type\": \"boolean\", \"description\": \"True if a cookie was removed.\"},\u003c/div\u003e\u003cdiv\u003e              \"cookie\": {\"$ref\": \"Cookie\", \"description\": \"Information about the cookie that was set or removed.\"}\u003c/div\u003e\u003cdiv\u003e            }\u003c/div\u003e\u003cdiv\u003e          }\u003c/div\u003e\u003cdiv\u003e        ]\u003c/div\u003e\u003cdiv\u003e      }\u003c/div\u003e\u003cdiv\u003e    ]\u003c/div\u003e\u003cdiv\u003e  }\u003c/div\u003e\u003c/code\u003e\u003cdiv\u003e\u003cdiv\u003e\u003ccode\u003e]\u003c/code\u003e\u003cbr /\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Sample-code\" /\u003eSample code\u003c/h4\u003e\u003ccode\u003efunction updateUserLoginStatusUi() {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  chrome.experimental.cookies.get({\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    url: \"http://www.mysite.com\",\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    name: \"MY_COOKIE\"\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  }, function(cookie) {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    if (cookie) {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e      displayLoggedInUi();\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    } else {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e      displayLoggedOutUi();\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    }\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  });\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e}\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003echrome.experimental.cookies.onChanged.addListener(function(changeInfo) {\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  updateUserLoginStatusUi();\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e});\u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e// Remove a cookie\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003echrome.experimental.cookies.remove(\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    {url: \"http://www.mysite.com\", name: \"MY_COOKIE\"});\u003c/span\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cbr /\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e// Manually expire a cookie\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003echrome.experimental.cookies.set(\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    {\u003c/span\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e  \u003c/span\u003e\u003c/span\u003eurl: \"http://www.mysite.com\",\u003c/span\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e\u003cspan\u003e    \u003cspan\u003e  name: \"MY_COOKIE\",\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e\u003cspan\u003e      expirationDate: 0,\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    });\u003c/span\u003e \u003c/code\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ccode\u003efunction setSessionCookieForTab(tabId, url, name, value) { \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  chrome.experimental.cookies.getAllCookieStores(function(cookieStores) { \u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    var i;\u003c/code\u003e\u003cdiv\u003e\u003ccode\u003e    for (i \u003d 0; i \u0026lt; cookieStores.length; i++) {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e      if (cookieStores[i].tabIds.indexOf(tabId) !\u003d -1) {\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e        chrome.experimental.cookies.set(\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    \u003cspan\u003e    \u003cspan\u003e    {url: url, name: name, value: value, storeId: \u003c/span\u003e\u003c/span\u003e\u003c/span\u003ecookieStores[i].id});\u003c/code\u003e\u003cdiv\u003e\u003ccode\u003e      }\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e    }\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  });\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e}\u003c/code\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/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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/proposal-chrome-extensions-cookies-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4117523327975588499"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4117523327975588499"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4117523327975588499"}],"author":[{}],"sites$pageName":{"$t":"proposal-chrome-extensions-cookies-api"},"sites$revision":{"$t":"29"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1272436538896278612"},"published":{"$t":"2011-10-06T22:49:15.122Z"},"updated":{"$t":"2011-12-20T00:50:31.876Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-10-06T22:49:15.122Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2011-10-06 at 3.47.53 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1272436538896278612"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6139570160557461782"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/panels/Screen%20shot%202011-10-06%20at%203.47.53%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1272436538896278612"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1272436538896278612"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1272436538896278612"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1272436538896278612"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1281647915570312954"},"published":{"$t":"2009-07-09T00:50:39.742Z"},"updated":{"$t":"2011-12-20T00:50:31.876Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:19:17.652Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Preferences 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\u003cfont face\u003d\"'courier new'\"\u003e\u003cspan style\u003d\"font-family:Arial\"\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eThe preferences API allows you to manipulate the browser preferences, such as the accept languages, URLs to restore on startup etc. For the full list of preferences, please refer to chrome/common/pref_names.cc. (Note: since the first version will only implement the access of accept languages, this document will focus on accept languages below.)\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Use-cases\" /\u003eUse cases\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eIt allows extensions to read and write the browser preferences. Given accept languages as an example, page translation extension and dictionary extension will need to get the accept languages from the browser and use them as the targeted languages for page or word translation. \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Could-this-API-be-part-of-the-web-platform-\" /\u003eCould this API be part of the web platform?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eGiven accept languages as an example, read accept languages could be part of the web platform, it could be exposed by window.navigator.acceptLanguages while UI language is exposed through widow.navigator.language. But we would also like to be able to modify accept languages preferences as well by extension, for example, \u003c/font\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eit'd be nice if we could \"learn\" the \u003c/font\u003e\u003cspan style\u003d\"background-repeat:initial\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eaccept\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e-languages through translate, such as if you decline to translate a French page, that would be a good signal that you want it added to the \u003c/font\u003e\u003cspan style\u003d\"background-repeat:initial\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eaccept\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e-languages.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Do-you-expect-this-API-to-be-fairly-stable-\" /\u003eDo you expect this API to be fairly stable?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eYes\u003ci\u003e.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-What-UI-does-this-API-expose-\" /\u003eWhat UI does this API expose?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eNone\u003ci\u003e.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-could-this-API-be-abused-\" /\u003eHow could this API be abused?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eRead accept languages should be OK.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Are-you-willing-and-able-to-develop-and-maintain-this-API-\" /\u003eAre you willing and able to develop and maintain this API?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eYes\u003ci\u003e.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Draft-API-spec\" /\u003eDraft API spec\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003ch2 style\u003d\"background-color:transparent;color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:22px;margin-top:10px;margin-right:10px;margin-bottom:10px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-chrome.preferences.-void-getAcceptLanguages-void-callback-String-acceptLanguages-void-setAcceptLanguages-Value-newAcceptLanguages-void-appendAcceptLanguage-Value-acceptLanguage-\" /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.preferences.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    void getAcceptLanguages(void callback(String acceptLanguages))\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    void setAcceptLanguages(Value newAcceptLanguages)\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    void appendAcceptLanguage(Value acceptLanguage)\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003ci\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/i\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Notes\" /\u003eNotes\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eThe first version will only implement the access of accept languages.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Issues\" /\u003eIssues\u003c/h3\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003eWhere should the accept-languages API live: chrome.preferences.acceptLanguages? or chrome.i18n.acceptLanguages?\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003eAny issues with modifying the browser's accept languages through extension API?\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/preference-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1281647915570312954"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1281647915570312954"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1281647915570312954"}],"author":[{}],"sites$pageName":{"$t":"preference-api"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6139570160557461782"},"published":{"$t":"2011-01-26T00:59:18.441Z"},"updated":{"$t":"2011-12-20T00:50:31.876Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:18:55.538Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Panels"},"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-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eOverview\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003ePanels are windows that are visible to the user even while the user is interacting with other applications. The small windows are positioned at the bottom of the screen, with minimal manual window management by the user. This API will allow extension developers to create and use panels.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\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/extensions/proposed-changes/apis-under-development/panels/Screen%20shot%202011-10-06%20at%203.47.53%20PM.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1324342231876/developers/design-documents/extensions/proposed-changes/apis-under-development/panels/Screen%20shot%202011-10-06%20at%203.47.53%20PM.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eUse cases\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eAn extension opens small \"pop up\" windows, for example, separate chat sessions, calculator, media player, stock/sport/news ticker, task list, scratchpad, that the user wants to keep visible while using a different application or browsing a different web site. Scattered \"pop up\" windows are difficult for the user to keep track of, therefore panels are placed along the bottom of the screen and are \"always on top\".\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eThe user would like easy control of chat windows: finding them, moving them out of the way, etc. Window management of separate chat \"pop ups\" is time consuming. All panels can be minimized/maximized together.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eCould this API be part of the web platform?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eEventually, yes. The current needs are from extension developers. If we figure out how to make this work in the wider context of web platform, we will propose it for the web platform at that point. \u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eDo you expect this API to be fairly stable?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eYes.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eWhat UI does this API expose?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003ePanels will be a new type of window with some unique behaviors and UI.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eHow could this API be abused?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eAn extension could open an excessive number of panels, repeatedly open and close panels, or unnecessarily draw the user's attention to a panel.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003cb\u003eHow would you implement your desired features if this API didn't exist?\u003cbr /\u003e\u003c/b\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eExtensions could continue to use \"pop up\" windows and let users manually arrange them on their screen such that they will not be obscured by other applications. Users would manage each \"pop up\" individually.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eAre you willing and able to develop and maintain this API?\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eYes.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cb\u003eAPI spec\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003eExtend the \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.windows.*\u003c/font\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e API to add a new \"panel\" type, as \u003c/font\u003e\u003c/span\u003ePanels are simply another type of window.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.windows.create\u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e with \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003etype\u003d\"panel\"\u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e will create a new Panel window. Unlike other window types, Panels do not take focus by default. The \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003efocused\u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e attribute can be used to change the default behavior.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.windows.update\u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e has a new \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003edrawAttention\u003c/font\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e option to attract the user's attention to a Panel. This API can be used for all window types. The behavior to attract the user's attention will vary depending on window type and OS.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003eAll other actions on the panel can be achieved via manipulations on the DOMWindow or the window contents, e.g. change the size of the div containing all window content to resize the panel.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;font-family:Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003ePanels are regular windows as far as other extensions [that did not create the panel] are concerned and are included in all other windows-related API, e.g. \u003c/span\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.windows.getAll\u003c/font\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\u003e, \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.extensions.getViews\u003c/font\u003e\u003cfont face\u003d\"verdana, sans-serif\"\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/panels"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6139570160557461782"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6139570160557461782"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6139570160557461782"}],"author":[{}],"sites$pageName":{"$t":"panels"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3676120305999611454"},"published":{"$t":"2011-07-19T18:30:25.368Z"},"updated":{"$t":"2011-12-20T00:50:31.875Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-19T18:30:25.368Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"screenshot.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3676120305999611454"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132406879825112878"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/screenshot.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3676120305999611454"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3676120305999611454"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3676120305999611454"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3676120305999611454"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"Wyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4017283287748642863"},"published":{"$t":"2009-04-13T17:24:06.588Z"},"updated":{"$t":"2011-12-20T00:50:31.875Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:18:00.520Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Omnibox 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\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Status\" /\u003eStatus\u003c/h3\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDream phase.  The underlying omnibox API is fairly complex.  This is a work in progress, and likely incomplete / missing key bits.\u003c/font\u003e\u003c/p\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\u003cp\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThere are two goals for the omnibox extension API:\u003c/font\u003e\u003c/p\u003e\u003cp /\u003e\u003col\u003e\u003cli\u003e\u003cfont face\u003d\"arial\"\u003eRegister a keyword that would allow the extension author to provide simple command hooks.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial\"\u003eBe a full omnibox provider, with autocomplete matches. \u003c/font\u003e\u003c/li\u003e\u003c/ol\u003e\u003cp /\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-API\" /\u003eAPI\u003c/h3\u003eomnibox.\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // The simple way:\u003cbr /\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // keyword-based (tab to search?) API.  Perhaps usable to implement a basic command-line interface.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // Register a keyword for handling in this extension.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  void registerKeyword(string keyword)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e  // Called when the user enters text after using this extension's registered keywords.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  event onKeywordInput(string input)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // The hard way:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // Be a full-on omnibox provider. \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // Notifies Omnibox that matches are ready, and provides them for browser-side\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // use when the Omnibox wants them.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  void matchesAvailable(Match[] matches)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // Called by the Omnibox when the text in the box has been changed.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // TODO: AutocompleteInput has a lot more info than this\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  event onInputChanged(string input)\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  // The user has requested that this match never show up in results again.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  event onMatchDeleted(Match match)  \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e  struct Match {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    int relevance\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    bool deletable\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    string fill_into_edit\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    int inline_autocomplete_offset\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    string destination_url\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    string contents\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    // missing content class\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e    string description\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\u003e\u003cspan style\u003d\"font-family:Arial\"\u003e\u003cdiv\u003e    // missing description class\u003c/div\u003e\u003cdiv\u003e  }\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/omnibox-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4017283287748642863"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4017283287748642863"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4017283287748642863"}],"author":[{}],"sites$pageName":{"$t":"omnibox-api"},"sites$revision":{"$t":"12"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4274232910199432992"},"published":{"$t":"2011-08-10T17:06:17.740Z"},"updated":{"$t":"2011-12-20T00:50:31.875Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-10T17:06:17.740Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"book_screenshot.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4274232910199432992"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132406879825112878"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/book_screenshot.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4274232910199432992"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4274232910199432992"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4274232910199432992"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4274232910199432992"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7183855230449377650"},"published":{"$t":"2011-08-10T17:07:03.715Z"},"updated":{"$t":"2011-12-20T00:50:31.875Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-10T17:07:03.715Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"coverflow_screenshot.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7183855230449377650"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132406879825112878"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/coverflow_screenshot.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7183855230449377650"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7183855230449377650"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7183855230449377650"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7183855230449377650"}],"author":[{}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"KXsmYD1YFQ..\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1132406879825112878"},"published":{"$t":"2011-07-19T17:33:06.554Z"},"updated":{"$t":"2011-12-20T00:50:31.874Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:17:35.922Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Offscreen Tabs (experimental)"},"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 style\u003d\"color:rgb(0,0,0);font-style:normal;font-variant:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;word-spacing:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003e\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\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Display\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eDisplay\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Interaction\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eInteraction\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Window-Size\"\u003e\u003cstrong\u003e1.3 \u003c/strong\u003eWindow Size\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Manifest\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eManifest\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Example-Extensions\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eExample Extensions\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Design-Review-Slides\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eDesign Review Slides\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Spec-outdated-\"\u003e\u003cstrong\u003e5 \u003c/strong\u003eSpec (outdated)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Types\"\u003e\u003cstrong\u003e5.1 \u003c/strong\u003eTypes\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-OffscreenTab\"\u003e\u003cstrong\u003e5.1.1 \u003c/strong\u003eOffscreenTab\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Methods\"\u003e\u003cstrong\u003e5.2 \u003c/strong\u003eMethods\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-create\"\u003e\u003cstrong\u003e5.2.1 \u003c/strong\u003ecreate\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-get\"\u003e\u003cstrong\u003e5.2.2 \u003c/strong\u003eget\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-getAll\"\u003e\u003cstrong\u003e5.2.3 \u003c/strong\u003egetAll\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-remove\"\u003e\u003cstrong\u003e5.2.4 \u003c/strong\u003eremove\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-sendMouseEvent\"\u003e\u003cstrong\u003e5.2.5 \u003c/strong\u003esendMouseEvent\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-sendKeyboardEvent\"\u003e\u003cstrong\u003e5.2.6 \u003c/strong\u003esendKeyboardEvent\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-toDataUrl\"\u003e\u003cstrong\u003e5.2.7 \u003c/strong\u003etoDataUrl\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-update\"\u003e\u003cstrong\u003e5.2.8 \u003c/strong\u003eupdate\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Events\"\u003e\u003cstrong\u003e5.3 \u003c/strong\u003eEvents\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-onUpdated\"\u003e\u003cstrong\u003e5.3.1 \u003c/strong\u003eonUpdated\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/span\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cdiv class\u003d\"sites-embed-align-left-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:425px;\"\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/DyKrHQxZ3MA?rel\u003d0\u0026amp;wmode\u003dopaque\" frameborder\u003d\"0\" allowFullScreen\u003d\"true\" width\u003d\"425\" height\u003d\"355\" /\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-variant:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;word-spacing:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-variant:normal;letter-spacing:normal;line-height:normal;text-indent:0px;text-transform:none;word-spacing:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\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\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"white-space:normal;font-weight:normal;font-size:medium;font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Introduction\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eIntroduction\u003c/span\u003e\u003c/h2\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:Times New Roman;white-space:normal;font-weight:normal;font-size:medium\"\u003e\u003cspan style\u003d\"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\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif\"\u003eThe\u003c/span\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:Courier New;color:rgb(56,118,29);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.experimental.offscreenTabs.*\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e API module allows for interacting with multiple web pages on the screen at the same time. Example applications might look like the \u003c/span\u003e\u003ca href\u003d\"http://decoding.files.wordpress.com/2009/02/safari_40_beta_1.jpg\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,153);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eSafari’s “Top Sites”\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e or \u003c/span\u003e\u003ca href\u003d\"http://www.revthatup.com/wp-content/uploads/2011/04/chrome.jpg\" style\u003d\"font-family:verdana,sans-serif\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"color:rgb(0,0,153);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eChrome’s “Most Visited”\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e page augmented with real-time display updates and user interaction. \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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,0,0);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,0,0);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\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIn combination with WebGL and its texture API capabilities the offscreen tabs module could be used to create true 3D browser environments on the web! \u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Display\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"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\"\u003eDisplay\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe real-time display could be achieved by updating\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e standard HTML \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u0026lt;img\u0026gt;\u003c/span\u003e or \u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u0026lt;canvas\u0026gt;\u003c/span\u003e elements while\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e capturing snapshots of offscreen tabs with the\u003ci\u003e\u003cb\u003e toDataUrl\u003c/b\u003e\u003c/i\u003e \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003emethod. \u003cbr /\u003e\u003c/span\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Interaction\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"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\"\u003eInteraction\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFor interaction, we propose the \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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,0,0);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-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ci\u003e\u003cb\u003esendMouse\u003c/b\u003e \u003c/i\u003eand \u003cb\u003e\u003ci\u003esendKeyboard\u003c/i\u003e\u003c/b\u003e methods. These methods could pass standard \u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eJavaScript mouse and keyboard events along with the offscreen tab ID specifying the offscreen tab these events should be applied to. In the case of mouse events appropriate x and y coordinates should be passed as well. \u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"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\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWhy? Because when an application or extension is responsible for rendering an offscreen tab's contents, only that application knows exactly where a click against the tab's canvas is supposed to be dispatched.\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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,0,0);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-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e Once Chrome picks up the JavaScript events \u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003enew synthesized events will be sent to the appropriate offscreen tab.\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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,0,0);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\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif\"\u003e Most of the fields of the synthesized events will be the same as the ones of the incoming JavaScript events. One exception, for example, are the \u003c/span\u003ex and y coordinates for mouse events as explained above.\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e \u003cbr style\u003d\"font-family:verdana,sans-serif\" /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Window-Size\" /\u003e\u003cfont size\u003d\"3\"\u003e\u003cspan style\u003d\"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\"\u003eWindow Size\u003c/span\u003e\u003c/font\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eSince the offscreen tabs will not be displayed by the browser in separate tabs the developer has to explicitly specify width and height of each offscreen tab's window.\u003c/span\u003e\u003cbr /\u003e\u003cbr style\u003d\"font-family:verdana,sans-serif\" /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Manifest\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eManifest\u003c/span\u003e\u003c/h2\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:rgb(255,255,255);font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThe module requires the specification of an \u003ci\u003eoffscreenTabs\u003c/i\u003e permission type. This permission would enable the API to see all web sites' user data. The developer will have to declare the \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);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\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);background-color:rgb(255,255,255);font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ci\u003eoffscreenTabs\u003c/i\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:rgb(255,255,255);font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e permission in the \u003c/span\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/manifest.html\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,204);background-color:rgb(255,255,255);font-weight:normal;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eextension manifest\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:rgb(255,255,255);font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e. For example:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;color:rgb(0,112,0);background-color:rgb(250,250,250);font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003cbr /\u003e  \"name\": \"My extension\",\u003cbr /\u003e  ...\u003cbr /\u003e  \"permissions\": [\u003cbr /\u003e    \"offscreenTabs\"\u003cbr /\u003e  ],\u003cbr /\u003e  ...\u003cbr /\u003e}\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"white-space:normal;font-weight:normal;font-size:medium;font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-Example-Extensions\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eExample Extensions\u003c/span\u003e\u003c/h2\u003e\u003cfont style\u003d\"font-family:Times New Roman;white-space:normal\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"3\" style\u003d\"font-weight:normal\"\u003eAbove you can see a video of a Chrome extension we have developed with the Offscreen Tab API and WebGL. Here are some additional screenshots:\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003cdiv style\u003d\"font-weight:normal;font-size:medium;display:block;margin-top:5px;margin-right:auto;margin-bottom:0pt;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/book_screenshot.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"220\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1324342231875/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/book_screenshot.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-weight:normal;font-size:medium;display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/coverflow_screenshot.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"211\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1324342231875/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs/coverflow_screenshot.png\" width\u003d\"400\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-weight:normal;font-size:medium;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-weight:normal;font-size:medium;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003ch2 style\u003d\"font-family:Times New Roman;white-space:normal\"\u003e\u003ca name\u003d\"TOC-Design-Review-Slides\" /\u003e\u003cfont\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003eDesign Review Slides\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/h2\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Times New Roman;white-space:normal;font-weight:normal;font-size:medium;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"font-family:Times New Roman;white-space:normal;font-weight:normal;font-size:medium;background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003ca href\u003d\"https://docs.google.com/a/chromium.org/present/edit?id\u003ddcz7497p_9gzwfsfgs\" target\u003d\"_blank\"\u003eSlides from API design review\u003c/a\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch2 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Spec-outdated-\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eSpec (outdated)\u003c/span\u003e\u003c/h2\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cfont size\u003d\"4\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;color:rgb(153,0,0)\"\u003eNote: the information below is outdated. The current API is in the process of being checked in \u003ca href\u003d\"http://codereview.chromium.org/7720002/\" target\u003d\"_blank\"\u003ehere\u003c/a\u003e.\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Types\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eTypes\u003c/span\u003e\u003c/h3\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-OffscreenTab\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003eOffscreenTab\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e        id (int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The ID of the offscreen tab. Tab IDs are unique within a browser session.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e        url (string)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The URL the offscreen tab is displaying.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e        width (int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                Width of the window.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e        height (int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                Height of the window.\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Methods\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eMethods\u003c/span\u003e\u003c/h3\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-create\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003ecreate\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(56,118,29)\"\u003e    create (object createProperties, function callback)\u003c/span\u003e\u003cbr /\u003e        Creates a new offscreen tab.\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003ecreateProperties (object)\u003cbr /\u003e\u003ci\u003e\u003cspan\u003e    \u003c/span\u003e            \u003cspan\u003e    \u003c/span\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e                The URL the offscreen tab should be displaying.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e          \u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e  width (\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e              \u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e  Width of the visible window. Defaults to width of the current window.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e            height (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e\u003cspan\u003e    \u003c/span\u003e                Height of the visible window. Defaults to height of the current window.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            callback (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e function)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (OffscreenTab offscreenTab) {...};\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e                      Details of the offscreen tab\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e.\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"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,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,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\u003ch4 dir\u003d\"ltr\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-get\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003eget\u003c/span\u003e\u003c/h4\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(56,118,29)\"\u003e    get (int offscreenTabId, function callback)\u003c/span\u003e\u003cbr /\u003e        Gets details about the specified offscreen tabs.\u003cbr /\u003e    \u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003cbr /\u003e\u003c/b\u003e                ID of the offscreen tab.\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003ci\u003e            callback (function)\u003c/i\u003e\u003cbr /\u003e\u003c/b\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (OffscreenTab offscreenTab) {...};\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e \u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"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,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,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,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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e                      Details of the offscreen tab\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch4 dir\u003d\"ltr\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ca name\u003d\"TOC-getAll\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003egetAll\u003c/span\u003e\u003c/h4\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(56,118,29)\"\u003e    getAll (function callback)\u003c/span\u003e\u003cbr /\u003e        Gets an array of all offscreen tabs.\u003cbr /\u003e    \u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            callback (function)\u003c/i\u003e\u003cbr /\u003e\u003c/b\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (array of OffscreenTab offscreenTabs) {...};\u003cbr /\u003e    \u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-remove\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003eremove\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e    \u003cspan style\u003d\"color:rgb(56,118,29)\"\u003e remove (int offscreenTabId, function callback)\u003c/span\u003e\u003cbr /\u003e        Removes an offscreen tab.\u003cbr /\u003e    \u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003c/b\u003e\u003cbr /\u003e                ID of the offscreen tab.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            callback (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional \u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003efunction)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function () {...};\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-sendMouseEvent\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003esendMouseEvent\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e    \u003cspan style\u003d\"color:rgb(56,118,29)\"\u003esendMouseEvent (int offscreenTabId, int x, int y, MouseEvent mouseEvent, function callback)\u003c/span\u003e\u003cbr /\u003e        Dispatches a mouse event in the offscreen tab.\u003cbr /\u003e        \u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003c/b\u003e\u003cbr /\u003e                ID of the offscreen tab.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            mouseEvent (MouseEvent)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                A JavaScript MouseEvent object. Supported event types: \u003ci\u003emousedown\u003c/i\u003e, \u003ci\u003emouseup\u003c/i\u003e, \u003ci\u003eclick\u003c/i\u003e, \u003ci\u003emousemove\u003c/i\u003e, \u003ci\u003emousewheel\u003c/i\u003e.\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e            x (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003eint)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                X position of where the mouse event should be dispatched on the offscreen web page. Not required in the case of a \u003ci\u003emousewheel\u003c/i\u003e event.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            y (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003eint)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                Y position of where the mouse event should be dispatched on the offscreen web page.\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e \u003cspan style\u003d\"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,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,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,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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003eNot required\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"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,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,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,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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e in the case of a \u003ci\u003emousewheel\u003c/i\u003e event.\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e            callback (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e function)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (OffscreenTab offscreenTab) {...};\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"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,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,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,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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e                      Details of the offscreen tab\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e.\u003cbr /\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-sendKeyboardEvent\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003esendKeyboardEvent\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e    \u003cspan style\u003d\"color:rgb(56,118,29)\"\u003esendKeyboardEvent (int offscreenTabId, KeyboardEvent event, function callback)\u003c/span\u003e\u003cbr /\u003e        Dispatches a keyboard event in the offscreen tab.\u003cbr /\u003e        \u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003cbr /\u003e\u003c/b\u003e                ID of the offscreen tab.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            keyboardEvent (KeyboardEvent)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                A JavaScript KeyboardEvent object. Supported event types: \u003ci\u003ekeydown\u003c/i\u003e, \u003ci\u003ekeyup\u003c/i\u003e, \u003ci\u003ekeypress\u003c/i\u003e. Only \u003ci\u003ekeypress\u003c/i\u003e produces a visible result on screen.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            callback (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e function)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (OffscreenTab offscreenTab) {...};\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"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,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,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,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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e                      Details of the offscreen tab\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-toDataUrl\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003etoDataUrl\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e    \u003cspan style\u003d\"color:rgb(56,118,29)\"\u003etoDataUrl (int offscreenTabId, object options, function callback)\u003c/span\u003e\u003cbr /\u003e        Captures the visible area of an offscreen tab. \u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003c/b\u003e\u003cbr /\u003e                The ID of the offscreen tab.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            options (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e object)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                Set parameters of image capture, such as the format of the resulting image.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                format (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e enumerated string [“jpeg”, “png”])\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                    The format of the resulting image. Default is jpeg.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                quality (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                    When format is 'jpeg', controls the quality of the resulting image. This value is ignored for PNG images. As quality is decreased, the resulting image will have more visual artifacts, and the number of bytes needed to store it will decrease.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            callback (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003efunction)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (string dataUrl) {...};\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                    dataUrl (string)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                        A data URL which encodes an image of the visible area of the captured offscreen tab. May be assigned to the 'src' property of an HTML Image element for display.\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-update\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003eupdate\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e   \u003cspan style\u003d\"color:rgb(56,118,29)\"\u003e update (int offscreenTabId, object updateProperties, function callback)\u003c/span\u003e\u003cbr /\u003e        Modifies the properties of an offscreen tab. Properties that are not specified in updateProperties are not modified.\u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003cbr /\u003e\u003c/b\u003e                The ID of the offscreen tab.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            updateProperties (object)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                url (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e string)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                    The URL the offscreen tab is displaying.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                width (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                    Width of the window.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                height (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e int)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                    Height of the window.\u003cbr /\u003e\u003c/font\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e            callback (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e function)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                The callback parameter should specify a function that looks like this:\u003cbr /\u003e                function (OffscreenTab offscreenTab) {...};\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"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,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,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,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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e                      Details of the offscreen tab\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e.\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch3 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-Events\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003eEvents\u003c/span\u003e\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-family:verdana,sans-serif;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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch4 dir\u003d\"ltr\"\u003e\u003ca name\u003d\"TOC-onUpdated\" /\u003e\u003cspan style\u003d\"font-size:12pt;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\"\u003eonUpdated\u003c/span\u003e\u003c/h4\u003e\u003c/div\u003e\u003c/span\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e    \u003cspan style\u003d\"color:rgb(56,118,29)\"\u003eonUpdated.addListener (function (int offscreenTabId, object chnageInfo, OffscreenTab offscreenTab) {...})\u003c/span\u003e\u003cbr /\u003e        Fires when an offscreen tab is updated.    \u003cbr /\u003e\u003cbr /\u003e\u003cb\u003e        Parameters\u003cbr /\u003e\u003ci\u003e            offscreenTabId (int)\u003c/i\u003e\u003cbr /\u003e\u003c/b\u003e                ID of the updated offscreen tab\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            changeInfo (object)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                Lists the changes to the state of the offscreen tab that was updated.\u003c/font\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cbr /\u003e\u003ci\u003e\u003cb\u003e                url (\u003c/b\u003e\u003c/i\u003e\u003c/font\u003e\u003ci\u003e\u003cspan style\u003d\"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,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,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\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"color:rgb(153,153,153)\"\u003eoptional\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cfont size\u003d\"2\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003ci\u003e\u003cb\u003e string)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                    The offscreen tab’s URL if it has changed.\u003cbr /\u003e\u003ci\u003e\u003cb\u003e            offscreenTab (OffscreenTab)\u003c/b\u003e\u003c/i\u003e\u003cbr /\u003e                Details of the offscreen tab\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/span\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/offscreen-tabs"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1132406879825112878"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132406879825112878"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1132406879825112878"}],"author":[{}],"sites$pageName":{"$t":"offscreen-tabs"},"sites$revision":{"$t":"113"}},{"gd$etag":"\"Xyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8099635062905964968"},"published":{"$t":"2010-07-02T02:39:24.938Z"},"updated":{"$t":"2011-12-20T00:50:31.874Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:15:48.924Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Notifications of Web Request and Navigation"},"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\" /\u003eOverview\u003c/h2\u003e\r\n\u003cdiv\u003eThis document describes the following API:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/trunk/experimental.webRequest.html\"\u003echrome.webRequest\u003c/a\u003e: Monitors events of HTTP requests.\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/trunk/experimental.webNavigation.html\"\u003echrome.webNavigation\u003c/a\u003e: Monitors events of navigations happening in tab content windows as well as subframes (iframe / frame elements).\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Use-cases\" /\u003eUse cases\u003c/h2\u003e\r\n\u003cdiv\u003eAn API of detailed Web progress notifications can be used to log traffic data, measure browser performance, etc. Please note that this requirement has been listed in the \u003ca href\u003d\"http://dev.chromium.org/developers/design-documents/extensions/apiwishlist\"\u003eAPI Wish List\u003c/a\u003e (the Network item).\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eConfigure proxy for each request.\u003c/li\u003e\u003cli\u003eModify headers (e.g. change User-Agent:).\u003c/li\u003e\u003cli\u003eBlock requests to certain servers.\u003c/li\u003e\u003cli\u003eLog traffic data and measure performance.\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Could-this-API-be-part-of-the-web-p\" /\u003eCould this API be part of the web platform?\u003c/h2\u003e\r\n\u003cdiv\u003eTo the best of my knowledge, it could not.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Do-you-expect-this-API-to-be-fairly\" /\u003eDo you expect this API to be fairly stable?\u003c/h2\u003e\r\n\u003cdiv\u003eI think the API will be fairly stable, since the way how HTTP works, as well as how the browser handles Web page navigations, is mature and stable. However, as described in the Open questions section, there may be some improvements in the future.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-What-UI-does-this-API-expose-\" /\u003eWhat UI does this API expose?\u003c/h2\u003e\r\n\u003cdiv\u003eThe API doesn’t expose any UI.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-could-this-API-be-abused-\" /\u003eHow could this API be abused?\u003c/h2\u003e\r\n\u003cdiv\u003eThere may be privacy issues since extensions can collect detailed information about network traffic via this API.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-How-would-you-implement-your-desire\" /\u003eHow would you implement your desired features if this API didn't exist?\u003c/h2\u003e\r\n\u003cdiv\u003eWithout this API,\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eI probably cannot monitor HTTP requests.\u003c/li\u003e\r\n\u003cli\u003eTo monitor Web navigation events, I would use chrome.tabs.onUpdated, chrome.{tabs,windows}.onCreated and inject content scripts to monitor subframe navigations. But there are still things I cannot know about, e.g., when a navigation is about to occur, accurate timestamp of events, transition type of a navigation, etc.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Draft-API-spec\" /\u003eDraft API spec\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Manifest\" /\u003eManifest\u003c/h3\u003e\r\n\u003cdiv\u003eIn order to use chrome.webRequest or chrome.webNavigation, the \"web_progress\" permission has to be declared in the permissions section of the extension manifest.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\nMoreover, if you would like to receive extra information along with chrome.webRequest.* (please see the description of extraInfoSpec), you need to add hosts (or host match patterns) to the permissions section as well. You can only request extra information for URLs whose hosts are specified in the permissions section. For example:\u003cbr /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e{\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e\"name\": \"My extension\",\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e...\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e\"permissions\": [\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e\u003cspan\u003e    \u003c/span\u003e    \u003c/span\u003e\"web_progress\",\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e\u003cspan\u003e    \u003c/span\u003e    \u003c/span\u003e\"http://www.google.com/\"\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e],\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e...\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e}\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e// This isn’t allowed since it requests extra information for any URL.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003echrome.webRequest.onBeforeRequest.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, null, [\"requestHeaders\"]);\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e// This is allowed.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003echrome.webRequest.onBeforeRequest.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, {urls: [\"http://www.google.com/foo*bar\"]},\u003c/code\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e[\"requestHeaders\"]);\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e// This is allowed too, since it doesn’t request any extra information.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003echrome.webRequest.onBeforeRequest.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, {urls: [\"http://www.youtube.com/*\"]});\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.webRequest\" /\u003echrome.webRequest\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Events\" /\u003e\u003cb\u003eEvents\u003c/b\u003e\u003c/h4\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onBeforeRequest\" /\u003eonBeforeRequest\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003echrome.webRequest.onBeforeRequest.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, RequestFilter filter,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003earray of string extraInfoSpec); \u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when a request is about to occur. This is sent before any TCP connection is made. \u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003eThe ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003emethod (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eStandard HTTP method.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the request takes place. Set to null if the request isn’t related to a tab.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etype (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to the request types below for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the browser was about to make the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eextraInfoSpec (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eExtra information that needs to be passed into the callback function. Each element of extraInfoSpec requires a corresponding string property being added to the details object. Array elements can be:\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003e\"blocking\"\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cdiv\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-onBeforeSendHeaders\" /\u003eonBeforeSendHeaders\u003c/h4\u003e\u003c/div\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\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003echrome.webRequest.onBeforeSendHeaders.addListener(\u003c/code\u003e\u003cbr /\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, RequestFilter filter,\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e\u003cspan\u003e    \u003c/span\u003earray of string extraInfoSpec); \u003c/code\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cbr /\u003eFires when an HTTP request is about to occur. This may occur after a TCP connection is made to the server, but before any HTTP data is sent. The HTTP request headers are available at this point.\u003cbr /\u003e\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003eThe ID of the request. Request IDs are unique within a browser session. As a result, they could be used to relate different events of the same request.\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv /\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv /\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003eThe time when the browser was about to make the request.\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv /\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003eextraInfoSpec (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003eExtra information that needs to be passed into the callback function. Each element of extraInfoSpec requires a corresponding string property being added to the details object. Array elements can be:\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cul\u003e\u003cul\u003e\u003cli\u003e\u003cb\u003e\"requestLine\"\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003e\"requestHeaders\"\u003c/b\u003e\u003c/li\u003e\u003cli\u003e\u003cb\u003e\"blocking\"\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onRequestSent\" /\u003eonSendHeaders\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webRequest.onSendHeaders.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, RequestFilter filter,\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003earray of string extraInfoSpec);\u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires just before the headers are sent to the server (after all users of the webrequest api had a chance to modify the request in onBeforeSendHeaders).\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\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\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the browser finished sending the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eextraInfoSpec (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eExtra information that needs to be passed into the callback function. Each element of extraInfoSpec requires a corresponding string property being added to the details object. Array elements can be:\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003e\"requestLine\"\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"requestHeaders\"\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onHeadersReceived\" /\u003eonResponseStarted\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003echrome.webRequest.onResponseStarted.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, RequestFilter filter,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003earray of string extraInfoSpec);\u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\nFires when the first byte of the response body is received. For HTTP requests, this means that the status line and response headers are available.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003eip (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003eThe server IP address that is actually connected to. Note that it may be a literal IPv6 address.\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv /\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003estatusCode (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eStandard HTTP status code returned by the server.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the status line and response headers were received.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eextraInfoSpec (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eExtra information that needs to be passed into the callback function. Each element of extraInfoSpec requires a corresponding string property being added to the details object. Array elements can be:\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003e\"statusLine\"\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"responseHeaders\"\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onBeforeRedirect\" /\u003eonBeforeRedirect\u003c/h4\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webRequest.onBeforeRedirect.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, RequestFilter filter,\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003earray of string extraInfoSpec); \u003c/code\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\nFires when a server initiated redirect is about to occur.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe URL of the current request.\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003eip (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003eThe server IP address that is actually connected to. Note that it may be a literal IPv6 address.\u003c/div\u003e\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003estatusCode (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eStandard HTTP status code returned by the server.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eredirectUrl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe new URL.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the browser was about to make the redirect.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eextraInfoSpec (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eExtra information that needs to be passed into the callback function. Each element of extraInfoSpec requires a corresponding string property being added to the details object. Array elements can be:\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003e\"statusLine\"\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"responseHeaders\"\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onCompleted\" /\u003eonCompleted\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003echrome.webRequest.onCompleted.addListener(\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003efunction(object details) { ... }, RequestFilter filter,\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003earray of string extraInfoSpec); \u003c/code\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when a request is completed.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003eip (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003eThe server IP address that is actually connected to. Note that it may be a literal IPv6 address.\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003estatusCode (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eStandard HTTP status code returned by the server.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the response was received completely.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eextraInfoSpec (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eExtra information that needs to be passed into the callback function. Each element of extraInfoSpec requires a corresponding string property being added to the details object. Array elements can be:\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003e\"statusLine\"\u003c/b\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"responseHeaders\"\u003c/b\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onErrorOccurred\" /\u003eonErrorOccurred\u003c/h4\u003e\r\n\u003cdiv /\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\u003cdiv\u003e\u003ccode\u003echrome.webRequest.onErrorOccurred.addListener(\u003c/code\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cspan style\u003d\"border-collapse:separate\"\u003e\u003ccode\u003e    function(object details) { ... }, RequestFilter filter);\u003c/code\u003e\u003c/span\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when an error occurs.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the request.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003eip (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin-top:0pt;margin-right:0pt;margin-bottom:0pt;margin-left:40px;border-top-width:medium;border-right-width:medium;border-bottom-width:medium;border-left-width:medium;border-top-style:none;border-right-style:none;border-bottom-style:none;border-left-style:none;border-color:initial;padding-top:0px;padding-right:0px;padding-bottom:0px;padding-left:0px\"\u003e\u003cdiv\u003eThe server IP address that is actually connected to. Note that it may be a literal IPv6 address.\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eerror (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe error description.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the error occurred.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003efilter (optional RequestFilter)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003ePlease refer to RequestFilter in the Types section for detailed explanation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Event-order\" /\u003e\u003cb\u003eEvent order\u003c/b\u003e\u003c/h4\u003e\r\n\u003cdiv\u003eFor any successful request, events are fired in the following order:\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cspan style\u003d\"border-collapse:separate\"\u003e\u003ccode\u003eonBeforeRequest -\u0026gt; onBeforeSendHeaders[1] -\u0026gt; onSendHeaders -\u0026gt;\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e    \u003c/span\u003e(onBeforeRedirect -\u0026gt; onBeforeRequest -\u0026gt; \u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eonBeforeSendHeaders[1] -\u0026gt;\u003c/span\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cspan style\u003d\"border-collapse:separate\"\u003e\u003ccode\u003e \u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eonSendHeaders\u003c/span\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cspan style\u003d\"border-collapse:separate\"\u003e\u003ccode\u003e -\u0026gt;)* -\u0026gt;\u003cbr /\u003e    \u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eonResponseStarted -\u0026gt; \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,96,0);font-family:monospace\"\u003eonCompleted\u003c/span\u003e\u003c/div\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\r\n\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\u003cdiv\u003e[1] Note: onBeforeSendHeaders is only fired for HTTP requests. It will not be fired for e.g. file:/// URLs.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003eThe part enclosed in parentheses indicates that there may be zero or more server initiated redirects.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAny error that occurs during the process results in an onErrorOccurred event. For a specific request, there is no further events fired after onErrorOccurred.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-chrome.webNavigation\" /\u003echrome.webNavigation\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Events1\" /\u003e\u003cb\u003eEvents\u003c/b\u003e\u003c/h4\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onBeforeNavigate\" /\u003eonBeforeNavigate\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webNavigation.onBeforeNavigate.addListener(function(object details) { ... }); \u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when a navigation is about to occur.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the navigation is about to occur.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eframeId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe. Frame IDs are unique within a tab.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the request to retrieve the document of this navigation. Note that this event is fired prior to the corresponding chrome.webRequest.onBeforeRequest.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the browser was about to start the navigation.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onCommitted\" /\u003eonCommitted\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webNavigation.onCommitted.addListener(function(object details) { ... });\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when a navigation is committed. The document (and the resources it refers to, such as images and subframes) might still be downloading, but at least part of the document has been received from the server and the browser has decided to switch to the new document.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the navigation occurs.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003ci\u003e\u003cb\u003eurl (string)\u003c/b\u003e\u003c/i\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eframeId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etransitionType (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003e\u003cdiv\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eCause of the navigation. Use the same transition types as those defined for \u003ca href\u003d\"http://code.google.com/chrome/extensions/history.html#transition_types\"\u003echrome.history API\u003c/a\u003e.\u003cbr /\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003ci\u003etransitionQualifiers (string)\u003c/i\u003e\u003c/b\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"margin-left:40px\"\u003eZero or more transition qualifiers delimited by \"|\". Please refer to the qualifier values below for detailed explanation.\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the navigation was committed.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onDOMContentLoaded\" /\u003eonDOMContentLoaded\u003c/h4\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webNavigation.onDOMContentLoaded.addListener(function(object details) { ... });\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when the page’s DOM is fully constructed, but the referenced resources may not finish loading.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the navigation occurs.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eframeId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the page’s DOM was fully constructed.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onCompleted1\" /\u003eonCompleted\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webNavigation.onCompleted.addListener(function(object details) { ... });\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when a document, including the resources it refers to, is completely loaded and initialized.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the navigation occurs.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eframeId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the document finished loading.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onErrorOccurred1\" /\u003eonErrorOccurred\u003c/h4\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webNavigation.onErrorOccurred.addListener(function(object details) { ... });\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when an error occurs.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the navigation occurs.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eframeId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e0 indicates the navigation happens in the tab content window; positive value indicates navigation in a subframe.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eerror (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe error description.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the error occurred.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-onBeforeRetarget\" /\u003eonBeforeRetarget\u003c/h4\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003echrome.webNavigation.onBeforeRetarget.addListener(function(object details) { ... });\u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nFires when a new window, or a new tab in an existing window, is about to be created to host a navigation.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003edetails (object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003esourceTabId (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which the navigation is triggered.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003esourceUrl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe URL of the document that is opening the new window.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etargetUrl (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe URL to be opened in the new window.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etimeStamp (Date)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe time when the browser was about to create a new view.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Event-order1\" /\u003e\u003cb\u003eEvent order\u003c/b\u003e\u003c/h4\u003e\r\n\u003cdiv\u003eFor a navigation that is successfully completed, events are fired in the following order:\u003c/div\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003eonBeforeNavigate -\u0026gt; onCommitted -\u0026gt; onDOMContentLoaded -\u0026gt; onCompleted \u003c/code\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\nAny error that occurs during the process results in an onErrorOccurred event. For a specific navigation, there is no further events fired after onErrorOccurred.\u003cbr /\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eNote that it is possible that a new navigation occurs in the same frame before the former navigation completes. As a result, even if a navigation proceeds successfully, the event sequence doesn’t necessarily end with an onCompleted.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf a navigating frame contains subframes, its onCommitted is fired before any of its children’s onBeforeNavigate; while its onCompleted is fired after any of its children’s onCompleted.\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Types\" /\u003eTypes\u003c/h3\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Request-types\" /\u003eRequest types\u003c/h4\u003e\r\n\u003cdiv\u003eHow the requested resource will be used.\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003e\"main_frame\"\u003c/b\u003e: The resource is the document of a tab content window.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"sub_frame\"\u003c/b\u003e: The resource is the document of a subframe (iframe or frame).\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"stylesheet\"\u003c/b\u003e: The resource is a CSS stylesheet.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"script\"\u003c/b\u003e: The resource is an external script.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"image\"\u003c/b\u003e: The resource is an image (jpg/gif/png/etc).\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"object\"\u003c/b\u003e: The resource is an object (or embed) tag for a plugin, or a resource that a plugin requested.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"other\"\u003c/b\u003e: Other kinds of resource.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Transition-qualifier-values\" /\u003eTransition qualifier values\u003c/h4\u003e\r\n\u003cdiv\u003eAny transition type can be augmented by qualifiers, which further define the navigation.\u003cbr /\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003e\"client_redirect\"\u003c/b\u003e: Redirects caused by JavaScript or a meta refresh tag on the page.\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\"server_redirect\"\u003c/b\u003e: Redirects sent from the server by HTTP headers.\u003c/li\u003e\r\n\r\n\u003cli\u003e\u003cb\u003e\"forward_back\"\u003c/b\u003e: Users use Forward or Back button to navigate among browsing history.\u003c/li\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-RequestFilter\" /\u003eRequestFilter\u003c/h4\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003e(object)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003eurls (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eEach element is a URL or URL pattern. Please refer to \u003ca href\u003d\"http://code.google.com/chrome/extensions/dev/match_patterns.html\"\u003econtent script match patterns\u003c/a\u003e for URL pattern definition. Requests that cannot match any of the URLs will be filtered out.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etypes (optional array of string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eEach element is a request type described above. Requests that cannot match any of the types will be filtered out.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003etabId (optional integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the tab in which requests takes place.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003ewindowId (optional integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe ID of the window in which requests takes place.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Open-questions\" /\u003eOpen questions\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Accessing-request-and-response-bodi\" /\u003eAccessing request and response bodies from extensions?\u003c/h3\u003e\r\n\u003cdiv\u003eWe could support extensions to specify \"requestBody\" element in the extraInfoSpec array of chrome.webRequest.onBeforeRequest (or onRequestSent), so that an extra property, requestBody, will be added to the details object passed into the event handler. Similarly, we could support extensions to ask for responseBody, too.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eBoth requestBody and responseBody are EntityBody objects.\u003c/div\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-EntityBody\" /\u003eEntityBody\u003c/h4\u003e\r\n\u003ch4\u003e\u003ca name\u003d\"TOC-Methods\" /\u003e\u003cb\u003eMethods\u003c/b\u003e\u003c/h4\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003ereadBytes(integer length, boolean wait, function callback) \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\u003cb\u003eParameters\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003elength (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eHow many bytes to read.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003ewait (boolean)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eIf wait is set to false, the browser will respond as soon as possible, returning the bytes it has got currently; otherwise, it won’t invoke the callback function until it collects enough bytes or reaches the end of the entity body.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003ecallback (function)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eCallback function\u003c/b\u003e\u003c/div\u003e\r\n\u003cdiv\u003eIt should specify a function that looks like this:\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003efunction (integer actualLength, string base64EncodedData)\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\u003cb\u003e\u003ci\u003eactualLength (integer)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eThe actual number of bytes that are returned. -1 indicates the end of the entity body has been reached or error occurred. Please note that 0 doesn’t indicate the end of the entity body, if the wait parameter of readBytes() is set to false.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003ebase64EncodedData (string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eBase64 encoded bytes. Please note that normally the string length of base64EncodedData is different from actualLength.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eSome issues need to be considered:\u003c/div\u003e\r\n\u003cul\u003e\u003cli\u003eAn important issue is how to manage the lifetime of request bodies and response bodies properly.\u003c/li\u003e\u003c/ul\u003e\r\nPlease consider the following scenario: an extension requests responseBody to be passed into the handler of chrome.webRequest.onCompleted. In the handler, it calls responseBody.readBytes() to read the content. However, since events are asynchronous, the browser fires onCompleted and proceeds immediately. If it finishes using the response body and discards it, the call of responseBody.readBytes() at the extension side may fail, depending on the timing. This is undesired.\u003cbr /\u003e\r\n\u003cbr /\u003e\r\nAs a result, the browser has to properly manage the lifetime of request bodies and response bodies. One possible approach is to keep track of references to each EntityBody object (either requestBody or responseBody). An entity body maybe be accessed by several EntityBody objects, which are passed to different extensions. If all these EntityBody objects are no longer referenced, the browser knows that the entity body is no long needed by any extension, and it is safe to remove it.\u003cbr /\u003e\r\n\u003cul\u003e\u003cli\u003eIt may be inconvenient to use an EntityBody object directly. We could also provide helper classes. For example, define TextEntityBody class to convert entity body to a text stream:\u003c/li\u003e\u003c/ul\u003e\r\n\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e// entityBody is an EntityBody object, which deals with bytes.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003evar textEntityBody \u003d new TextEntityBody(entityBody, ‘UTF-8’);\u003c/code\u003e\u003cbr /\u003e\r\n\u003cbr /\u003e\r\n\u003ccode\u003e// textEntityBody calls entityBody.readBytes() and converts the result to text.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003etextEntityBody.readText(10, true, function (text, reachEnd) {\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e\u003cspan\u003e  \u003c/span\u003e// Handle text directly.\u003c/code\u003e\u003cbr /\u003e\r\n\u003ccode\u003e});\u003c/code\u003e\r\n\u003cdiv /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Synchronous-blocking-notifications-\" /\u003eSynchronous (blocking) notifications?\u003c/h3\u003e\r\n\u003cdiv\u003eThe API proposed above is supposed to be asynchronous (non-blocking) notifications. This is consistent with other chrome.* APIs. More importantly, notification publishers / consumers live in different processes. If we block the publisher side for sending each notifications, it may hurt browser performance.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eHowever, in some cases we would like to affect the control flow in event handlers. (Please note that this has been listed as a requirement on the \u003ca href\u003d\"http://dev.chromium.org/developers/design-documents/extensions/apiwishlist\"\u003eAPI Wish List\u003c/a\u003e, the Navigation Interception item.)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eConsider the following use case: in the callback function of chrome.webRequest.onBeforeRequest we may want to cancel the request or modify the request headers. If the notification is asynchronous, the browser fires the notification and immediately makes the request. There is no way for extensions to make a change.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eOne possible solution is to design some functions like \"installSyncOnXyzHandler\" that installs a short snippet of JavaScript to run synchronously within the browser process for the notifications that may need synchronous responses. However, this may not fit with the overall Chrome architecture where we want to avoid running javascript in the browser process; and the JavaScript snippet in the browser process might need to communicate back to the extension for some of its decisions as well.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eAnother feasible solution is to add support for browser to wait for a response from an extension. Take chrome.webRequest.onBeforeRequest as an example, we could reform it the extraInfoSpec parameter to accept an optional string \u003cb\u003e\"blocking\".\u003c/b\u003e If present, then the browser needs to be blocked and wait for a response from the callback function.\u003c/div\u003e\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eIf blocking is present, the callback function could optionally return an object to cancel or modify the request:\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eresult (optional object)\u003c/b\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003erequestLine (optional string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eModified request line.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003ereqeustHeaders (optional string)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eModified request headers.\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003e\u003cb\u003e\u003ci\u003ecancel (optional boolean)\u003c/i\u003e\u003c/b\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003cdiv\u003eSet to true to cancel the request.\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cb\u003e\u003ci\u003eredirectUrl (optional string)\u003c/i\u003e\u003c/b\u003e\u003cbr /\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\u003cdiv\u003eRedirects the request to a different URL (only available in onBeforeRequest and onBeforeRedirect).\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0pt 0pt 0pt 40px;border:medium none;padding:0px\"\u003e\r\n\u003c/blockquote\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003eThe biggest concern is the impact on browser performance. We have to measure the performance impact very carefully if we really want to make the move.\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-References\" /\u003eReferences\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/aa768283%28VS.85%29.aspx\" rel\u003d\"nofollow\"\u003eDWebBrowserEvents2 Interface of IE\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"http://msdn.microsoft.com/en-us/library/aa385121%28v\u003dVS.85%29.aspx\" rel\u003d\"nofollow\"\u003eWinINet Status Callback\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003ca href\u003d\"https://developer.mozilla.org/en/nsIWebProgressListener\" rel\u003d\"nofollow\"\u003ensIWebProgressListener Interface of Firefox\u003c/a\u003e\u003c/li\u003e\u003c/ul\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/notifications-of-web-request-and-navigation"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8099635062905964968"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8099635062905964968"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8099635062905964968"}],"author":[{"name":{"$t":"Marc-André Decoste"},"email":{"$t":"mad@chromium.org"}}],"sites$pageName":{"$t":"notifications-of-web-request-and-navigation"},"sites$revision":{"$t":"16"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/850066461431838139"},"published":{"$t":"2011-04-22T07:28:40.384Z"},"updated":{"$t":"2011-12-20T00:50:31.873Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:12:42.493Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Input Method Editor"},"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-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:11pt;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\"\u003eOverview\u003c/span\u003e\u003cbr /\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\"\u003eThe purpose of this API is to allow third parties to develop IMEs for Chrome OS via extensions.\u003c/span\u003e\u003cbr /\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\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\"\u003eThis API would be used to create IMEs that aren’t included in Chrome OS.  This could include Cloud IME solutions, alternate CJK IMEs, or English IMEs and writing assistants.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eThere are three basic types of input we should support:\u003c/span\u003e\u003cul\u003e\u003cli style\u003d\"list-style-type:disc;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\"\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\"\u003eText Generators:  Generates a block of text to input into a text window.  Voice Input is an example of this.\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eKeystroke Generators:  Generates distinct keystroke, which are passed to the active IME.  Virtual Keyboard and Handwriting inputs are examples of this.\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIMEs:  Manages the candidate window, composition, and processes key events.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eAn input method extension can behave as any or all of these, but only a single extension can be active as an IME at a time.\u003c/span\u003e\u003cbr /\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\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\"\u003eThis is a client side feature, and doesn’t make much sense to add\u003cspan style\u003d\"white-space:pre\"\u003e\t\u003c/span\u003eto HTML5\u003c/span\u003e\u003cbr /\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?\u003c/span\u003e\u003cbr /\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\"\u003eOnce finalized, I don’t expect this API to change in any way that would break backwards compatibility.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-size:medium\"\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\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;white-space:normal;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:11pt;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\"\u003eWhat UI does this API expose?\u003c/span\u003e\u003cbr /\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\"\u003eOn ChromeOS, the user interacts with this API through the IME selection button, and the candidate window.  As such, no new UI would need to be added.  To implement this API on Windows, Mac and Linux, an IME selection method would need to be added, and the candidate window would need to be exposed.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eCandidate Window\u003c/span\u003e\u003cimg height\u003d\"273px;\" src\u003d\"https://lh6.googleusercontent.com/GPuIhveTIycZtycoRX-UpMyjUtTbRagxaFBSumy_lXMm_Jk5XrwNC2c7MDZMY_dsVhIu8yqUXC62eTajN4evCvBJqAbeBa9inZc0EHPEDrEdh7AQzRbIGjlF4p5Q4bM\" width\u003d\"372px;\" /\u003e\u003cbr /\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\"\u003eLanguage Selection\u003c/span\u003e\u003cimg height\u003d\"305px;\" src\u003d\"https://lh4.googleusercontent.com/mI9f05co5OXWt9epa7Q7dXh0jAqPwaySZ94CI_PlzahEQvMHt0uHupj_gXhIfoMK0DPd0LKqEDie3zEz_EwFbVPAYmKCMKDHsu_x4Vp5oDlGXOufP6iC1sJMF3YGomY\" width\u003d\"337px;\" /\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\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\"\u003eThe biggest danger of this API is that it could easily be used to create key loggers.  Android deals with this issue by adding additional security dialogs to enable third party IMEs.  The danger is mitigated slightly by the fact that password dialogs do not send their keystrokes to IME.  Extensions that generate keystrokes such as virtual keyboards will still be able to send keystrokes to password fields and could record this data, however.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eThis should be protected by both the standard security warning during installation, and an additional warning/confirmation dialog when enabled for the first time.\u003c/span\u003e\u003cbr /\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn’t exist?\u003c/span\u003e\u003cbr /\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\"\u003eThere is currently no way for third parties to add IMEs to Chrome OS.  Allowing IMEs executing in any other context than sandboxed Javascript seems much more dangerous from a security standpoint.\u003c/span\u003e\u003cbr /\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAre you willing and able to develop and maintain this API?\u003c/span\u003e\u003cbr /\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\"\u003eYes.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;white-space:normal;font-size:medium\"\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\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;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\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\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\"\u003eTo prevent abuse of IMEs, the API will be guarded by the “ime” permission in manifest.json.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"3\"\u003eManifest Entries:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eTo use the ime.engine APIs, you need to specify an \u003cfont face\u003d\"'courier new', monospace\"\u003einput_components\u003c/font\u003e entry in the manifest.  It will contain an array describing any input components in the extension.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003eIt should look like:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\"input_components\" \u003d [\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  {\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"name\": \"My IME\",  // A user visible name.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"type\": \"ime\",  // The type of input component.\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"id\": \"my_ime\",    // The id that will be passed to callbacks\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"description\": \"My Input method for Japanese\",  // A user visible description\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"language\": \"ja\",  // The primary language this IME is used for\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    \"layouts\": {\"jp::jpn\", \"us:dvorak:eng\"}  // The supported keyboard layouts for this IME\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;background-color:transparent\"\u003e  }\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e]\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\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\"\u003eTypes:\u003c/span\u003e\u003cul style\u003d\"font-family:Times New Roman;font-size:medium;font-weight:normal\"\u003e\u003cli style\u003d\"list-style-type:disc;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\"\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\"\u003eMenuItem (Object)\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eid (String)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003elabel (optional String) (default: “”)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003estyle (optional Integer) - Enum representing if this item is: None, Check, Radio, or a Separator.  Radio buttons between separators are considered grouped.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003evisible (optional Boolean) (default: true)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003eenabled (optional Boolean) (default: true)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003echecked (optional Boolean) (default: false)\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:11pt;white-space:pre-wrap\"\u003echildren (optional Array of MenuItem)\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eKeyboardEvent (Object) - See \u003c/span\u003e\u003ca href\u003d\"http://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;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\"\u003ehttp://www.w3.org/TR/DOM-Level-3-Events/#events-KeyboardEvent\u003c/span\u003e\u003c/a\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003etype (String) - One of 'keyup' or 'keydown'.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003ekey (String) - Value of the key being pressed\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003e\u003cspan style\u003d\"background-color:transparent;font-size:11pt;white-space:pre-wrap\"\u003ealtKey (optional Boolean) - Whether or not the ALT key is pressed.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003ectrlKey (optional Boolean) - Whether or not the CTRL key is pressed.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eshiftKey (optional Boolean) - Whether or not the SHIFT key is pressed.\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eInputContext (Object)\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-weight:normal;font-style: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-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003etextID (Integer) - This is used to specify targets of text field operations.  This ID becomes invalid as soon as onBlur is called.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:circle;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\"\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\"\u003etype (String) - Type of value this text field edits, (Text, Number, Password, etc)\u003c/span\u003e\u003c/li\u003e\u003c/ul\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:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eMethods:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.setComposition\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eSet the current composition. If this extension does not own the active IME, this fails.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003econtextID (Integer) - ID of the context with the composition text. This is the value provided in the InputContext from onFocus.\u003c/li\u003e\u003cli\u003etext (String)\u003c/li\u003e\u003cli\u003eselectionStart (optional Integer) - Position in the text that the selection starts at.\u003c/li\u003e\u003cli\u003eselectionEnd (optional Integer) - Position in the text that the selection ends at.\u003c/li\u003e\u003cli\u003ecursor (Integer) - Position in the text of the cursor\u003c/li\u003e\u003cli\u003esegments (optional Array) - List of segments and their associated types.\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003estart (Integer)\u003c/li\u003e\u003cli\u003eend (Integer)\u003c/li\u003e\u003cli\u003estyle (String) - [underline, doubleUnderline] This is an enum that indicates what type this segment is.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function(Boolean success) {} ) - Called when the operation completes. success indicates whether the operation succeeded,  on failure, chrome.extension.lastError is set.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.clearComposition\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eClear the current composition. If this extension does not own the active IME, this fails.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003econtextID (Integer) - ID of the context with the composition text. This is the value provided in the InputContext from onFocus.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function(Boolean success) {} ) - Called when the operation completes. success indicates whether the operation succeeded,  on failure, chrome.extension.lastError is set.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.commitText\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eCommits the provided text to the current input.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003econtextID (Integer) - ID of the context where the text will be committed.\u003c/li\u003e\u003cli\u003etext (String)\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function(Boolean success) {}) - Called when the operation completes with a boolean indicating if the text was accepted or not. on failure, chrome.extension.lastError is set.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.setCandidateWindowProperties\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eSets the properties of the candidate window. This fails if the extension doesn’t own the active IME\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String)\u003c/li\u003e\u003cli\u003eproperties (Object)\u003c/li\u003e\u003cul\u003e\u003cli\u003evisible (optional Boolean) - True to show the Candidate window, false to hide it.\u003c/li\u003e\u003cli\u003ecursorVisible (optional Boolean) - True to show the cursor, false to hide it.\u003c/li\u003e\u003cli\u003evertical (optional Boolean) - True if the candidate window should be rendered vertical, false to make it horizontal.\u003c/li\u003e\u003cli\u003epageSize (optional Integer) - The number of candidates to display per page.\u003c/li\u003e\u003cli\u003eauxiliaryText (optional String) - Text that is shown at the bottom of the candidate window.\u003c/li\u003e\u003cli\u003eauxiliaryTextVisible (optional Boolean) - True to display the auxiliary text, false to hide it.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function(Boolean success) {}) - Called when the operation completes.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"white-space:pre-wrap;font-size:11pt\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.setCandidates\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eDescription\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eSets the current candidate list. This fails if this extension doesn’t own the active IME\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eParameters\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eObject\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003econtextID (Integer)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ecandidates (Array)\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eitem (Object)\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ecandidate (String)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eid (Integer) - User defined id that will be used to identify this candidate.  It must be unique in the current list of candidates.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003elabel (optional String)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003eannotation (optional String)\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ecandidates (Array of items) - Sub-candidates\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cli\u003e\u003cfont size\u003d\"2\"\u003ecallback (optional Function(Boolean success) {}) - Called when the operation completes.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.setCursorPosition\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eSet the position of the cursor in the candidate window. This is a no-op if this extension does not own the active IME.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003econtextID (Integer)\u003c/li\u003e\u003cli\u003ecandidateID (Integer) - ID of the candidate to select.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function) - Called when the operation completes\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.setMenuItems\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eAdds the provided menu items to the language menu when this IME is active.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine to use\u003c/li\u003e\u003cli\u003eitems (array of MenuItem) - MenuItems to add. They will be added in the order they exist in the array.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function) - Called when the operation completes\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.updateMenuItems\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eUpdates the state of the MenuItems specified\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine to use\u003c/li\u003e\u003cli\u003eitem (MenuItem or array of MenuItem) - One or more MenuItems to update.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function) - Called when the operation completes\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.sendKeyEvent\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eSends a keystroke to the system\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eObject\u003c/li\u003e\u003cul\u003e\u003cli\u003econtextID (Integer) - ID of the context with the composition text.\u003c/li\u003e\u003cli\u003ekey (KeyEvent) - Key data to send\u003c/li\u003e\u003c/ul\u003e\u003cli\u003ecallback (optional Function) - Called when the operation completes\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\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\"\u003eEvents\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onActivate\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis event is sent when an IME is activated. It signals that the IME will be receiving onKeyPress events.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine receiving the event\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onDeactivated\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis event is sent when an IME is deactivated. It signals that the IME will no longer be receiving onKeyPress events.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine receiving the event\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onFocus\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis event is sent when focus enters a text box. It is sent to all extensions that are listening to this event, and enabled by the user.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003econtext (InputContext) - an InputContext object describing the text field that has acquired focus.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onBlur\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis event is sent when focus leaves a text box. It is sent to all extensions that are listening to this event, and enabled by the user.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003econtextID (Integer) - the ID of the text field that has lost focus. The ID is invalid after this call\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onInputContextUpdate\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis event is sent when the properties of the current InputContext change, such as the the type. It is sent to all extensions that are listening to this event, and enabled by the user.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003econtext (InputContext) - an InputContext object describing the text field that has changed.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onKeyEvent\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eDescription\u003c/li\u003e\u003cul\u003e\u003cli\u003eThis event is sent if this extension owns the active IME.\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine receiving the event\u003c/li\u003e\u003cli\u003ekeyData (KeyEvent) - Data on the key event\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eReturn value\u003c/li\u003e\u003cul\u003e\u003cli\u003ehandled (Boolean) - True if the keystroke was handled, or false if it should be \u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"'Courier New'\"\u003e\u003cspan style\u003d\"font-size:11pt;white-space:pre-wrap\"\u003echrome.\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,0);font-style:normal;font-weight:normal;text-decoration:none;font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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.onCandidateClicked\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine receiving the event\u003c/li\u003e\u003cli\u003ecandidateID (Integer) - ID of the candidate that was clicked.\u003c/li\u003e\u003cli\u003ebutton (String) -[left, right, middle]  Which mouse buttons was clicked.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003c/span\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003echrome.\u003cspan style\u003d\"font-family:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;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:Verdana,sans-serif;font-size:13px;white-space:normal\"\u003e\u003cb\u003e\u003cdiv style\u003d\"background-color:transparent;font-family:Times New Roman;font-weight:normal;font-size:medium;display:inline!important\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-weight:normal;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003einput\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/b\u003e\u003c/span\u003e.ime.onMenuItemActivated\u003c/span\u003e\u003c/b\u003e\u003cbr /\u003e\u003cul\u003e\u003cli\u003eParameters\u003c/li\u003e\u003cul\u003e\u003cli\u003eengineID (String) - ID of the engine receiving the event\u003c/li\u003e\u003cli\u003ename (String) - Name of the MenuItem which was activated\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cb\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;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003c/b\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/input-method-editor"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/850066461431838139"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/850066461431838139"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/850066461431838139"}],"author":[{"name":{"$t":"Zachary Kuznia"},"email":{"$t":"zork@chromium.org"}}],"sites$pageName":{"$t":"input-method-editor"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3496918295758347136"},"published":{"$t":"2009-09-01T19:23:17.494Z"},"updated":{"$t":"2011-12-20T00:50:31.873Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:12:02.635Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"i18n-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\u003cspan style\u003d\"font-family:Verdana\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eThe i18n API allows you to manipulate the i18n related browser settings, such as the accept languages. (Note: since the first version will only implement the access of accept languages, this document will focus on accept languages below.)\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Use-cases\" /\u003eUse cases\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eIt allows extensions to read and write the browser's i18n related settings. Given accept languages as an example, page translation extension and dictionary extension will need to get the accept languages from the browser and use them as the targeted languages for page or word translation. \u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Could-this-API-be-part-of-the-web-platform-\" /\u003eCould this API be part of the web platform?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eGiven accept languages as an example, read accept languages could be part of the web platform, it could be exposed by window.navigator.acceptLanguages while UI language is exposed through widow.navigator.language. But we would also like to be able to modify accept languages preferences as well by extension, for example, \u003c/font\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eit'd be nice if we could \"learn\" the \u003c/font\u003e\u003cspan style\u003d\"background-repeat:initial\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eaccept\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e-languages through translate, such as if you decline to translate a French page, that would be a good signal that you want it added to the \u003c/font\u003e\u003cspan style\u003d\"background-repeat:initial\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003eaccept\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e-languages.\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Do-you-expect-this-API-to-be-fairly-stable-\" /\u003eDo you expect this API to be fairly stable?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eYes\u003ci\u003e.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-What-UI-does-this-API-expose-\" /\u003eWhat UI does this API expose?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eNone\u003ci\u003e.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-could-this-API-be-abused-\" /\u003eHow could this API be abused?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eRead accept languages should be OK.\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Are-you-willing-and-able-to-develop-and-maintain-this-API-\" /\u003eAre you willing and able to develop and maintain this API?\u003c/h3\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003eYes\u003ci\u003e.\u003c/i\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Draft-API-spec\" /\u003eDraft API spec\u003c/h3\u003e\u003c/div\u003e\u003c/span\u003e\u003ch2 style\u003d\"background-color:transparent;color:rgb(0,0,0);font-family:Arial,Verdana,sans-serif;font-size:22px;margin-top:10px;margin-right:10px;margin-bottom:10px;margin-left:0px\"\u003e\u003ca name\u003d\"TOC-chrome.i18n.-void-getAcceptLanguages-void-callback-String-acceptLanguages-void-setAcceptLanguages-Value-newAcceptLanguages-void-appendAcceptLanguage-Value-acceptLanguage-\" /\u003e\u003cspan style\u003d\"font-size:13px;font-weight:normal\"\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.i18n.\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    void getAcceptLanguages(void callback(String acceptLanguages))\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    void setAcceptLanguages(Value newAcceptLanguages)\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    void appendAcceptLanguage(Value acceptLanguage)\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Verdana\"\u003e\u003ci\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/i\u003e\u003c/font\u003e\u003c/div\u003e\u003c/span\u003e\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Notes\" /\u003eNotes\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eThe first version will only implement the access of accept languages.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Issues\" /\u003eIssues\u003c/h3\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Verdana\"\u003eAny issues with modifying the browser's accept languages through extension API?\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/i18n-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3496918295758347136"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3496918295758347136"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3496918295758347136"}],"author":[{}],"sites$pageName":{"$t":"i18n-api"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"Xyl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9054993081040911112"},"published":{"$t":"2009-04-09T01:47:59.351Z"},"updated":{"$t":"2011-12-20T00:50:31.872Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:11:42.752Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"History 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\u003cspan style\u003d\"font-family:courier new\"\u003ehistory.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    void search(HistoryQuery query, void callback(HistoryItem[] results))\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    void clear(HistoryQuery query) // defaults to clearing all. Should we prompt?\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    // NOTE: these could be done in a v2 -- I don't see huge use cases for them, except perhaps for synchronization.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e    void create({int date, string url, string title, [string favIconUrl], [int fromId]}, [void callback(HistoryItem result)])\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    event onHistoryItemCreated(HistoryItem new)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    event onHistoryItemRemoved(HistoryItem removed)\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    struct HistoryItem {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        int id\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        int date\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        string url\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        string title\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        string favIconUrl\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e        int fromId\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e        int totalVisitCount\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new\"\u003e        int totalTypedCount\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    }\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    struct HistoryQuery {\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        // limited to 100, defaults to current day.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        optional int[] ids\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        optional string search\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        optional Date startDate\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e        optional Date endDate\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e    }\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new'\"\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/history-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9054993081040911112"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9054993081040911112"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9054993081040911112"}],"author":[{}],"sites$pageName":{"$t":"history-api"},"sites$revision":{"$t":"16"}},{"gd$etag":"\"XCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3072891181913815661"},"published":{"$t":"2009-07-15T17:51:12.677Z"},"updated":{"$t":"2011-12-20T00:50:31.866Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:20:28.360Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"executeScript() and executeCSS()"},"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-Problem\" /\u003eProblem\u003c/h3\u003e\u003cdiv\u003eSometimes, extension developers don't need to execute content script in a page until some event happens in the extension. It is wasteful to execute content script in every web page on the off chance that this event will happen.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor example, consider an extension that wants to translate web pages. There will be a button in the UI that enables translation. When this button is pressed, the DOM needs to be crawled, collecting text nodes, and concatenating them for translation. However, it would be nice to avoid running content scripts until this button is pressed.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Proposal\" /\u003eProposal\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.tabs\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Executes JavaScript in the root frame of a tab. The script is executed in the same type of\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // sandbox that content scripts are.\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  // Each time this method is called a new sandbox is created to run the script and the sandbox\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // persists following the usual rules of GC. This isn't particularly heavyweight, but it also\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // isn't something you'd want to do in a loop.\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  // If you need lots of small communication with a tab, consider executing script once and\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // then using content script messaging to communicate between that script and the extension.\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  // tabId: Optional, defaults to selected tab of the current window (as determined by\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // chrome.windows.getCurrent()).\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // js: Optional, string of JavaScript to execute.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // js_files: Optional, array of JavaScript files to execute, in order.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // callback: Optional, callback to invoke with result of execution (result of last statement).\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  // If the extension does not have access to interact with the URL in the specified tab, or if a\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // js file is specified that does not exist, an error is reported to the console associated with the\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // view that called the API. Execution errors in the script are reported to the console associated\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // with the tab.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  void \u003cb\u003eexecuteScript\u003c/b\u003e([int tabId], {[string js], [string[] js_files]}, [callback onSuccess(Object result)]);\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  // Applies CSS to the root frame of a tab.\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  // tabId: Optional, defaults to selected tab of the current window (as determined by\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // chrome.windows.getCurrent()).\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  // css: Optional, string of CSS to execute.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // css_files: Optional, array of CSS files to execute, in order.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  void \u003cb\u003einsertCSS\u003c/b\u003e([int tabId], {[string css], [string[] css_files]});\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\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:16px;font-weight:bold\"\u003eExample\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.tabs.executeScript(null, {js_files: [\"jquery/min.js\", \"woo.js\"]});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Details\" /\u003eDetails\u003c/h3\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eWhen we implement permissions, this API should fail if the extension doesn't have access to the page loaded into the tab.\u003c/li\u003e\u003cli\u003eNo attempt is made to dedupe these. Each time you call the API, the script gets executed again. Callers need to maintain state if they don't want to execute duplicate scripts.\u003c/li\u003e\u003cli\u003eExecuting script in subframes is not supported.\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/executecontentscript-proposal"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3072891181913815661"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3072891181913815661"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3072891181913815661"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"executecontentscript-proposal"},"sites$revision":{"$t":"15"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3333497264121754600"},"published":{"$t":"2009-05-26T01:27:22.174Z"},"updated":{"$t":"2011-12-20T00:50:31.866Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:11:00.996Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Gleam 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-Overview\" /\u003eOverview\u003c/h2\u003e\u003cdiv\u003eExtension developers often want a way to offer contextual actions with different parts of a web page. For example:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eThe Skype extension would like to offer to make calls to phone numbers in the text of a page\u003c/li\u003e\u003cli\u003eMany extensions would like to offer to download or edit embedded images and video\u003c/li\u003e\u003cli\u003eAnnotation extensions would like to offer to act on the current selection, and to highlight passages of text in a web page\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eThe Gleam API would allow extension developers to do these things, in a way that:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eCannot slow down page load\u003c/li\u003e\u003cli\u003eCannot break the rendering of web pages\u003c/li\u003e\u003cli\u003eSimplifies handling all the tricky edge cases in dynamic pages that add, edit, and remove nodes at runtime\u003c/li\u003e\u003cli\u003eOffers a nice, consistent UI that users will understand and that allows multiple extensions to interact nicely without conflict\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Status\" /\u003eStatus\u003c/h2\u003e\u003cdiv\u003eProposal\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Details\" /\u003eDetails\u003c/h2\u003e\u003cdiv\u003eExtensions can register interest in several different types of objects:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eImages\u003c/li\u003e\u003cli\u003ePlugins\u003c/li\u003e\u003cli\u003eVideo (the \u0026lt;video\u0026gt; tag)\u003c/li\u003e\u003cli\u003eLinks\u003c/li\u003e\u003cli\u003eText\u003c/li\u003e\u003cli\u003eSelection\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eGleams are registered in the manifest, and multiple gleams can be registered per-extension. If an extension is only interested in a subset of objects of a given type on the page, they can be filtered with optional filter declarations in the manifest or a filter function.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce an object has been selected by at least one extension, it is visually highlighted by Chrome. For most types, the available actions wouldn't be visible on an object by default, only a highlight indicating that some actions are available. When the user hovers over the object, buttons for the available actions are rendered. When a Gleam is invoked, a callback is fired in the extension with details of the invoked Gleam and the relevant object.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u0026lt;todo: need mocks!\u0026gt;\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Manifest\" /\u003eManifest\u003c/h2\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  ...\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  \"gleam\": [\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      \"type\": \"image\" | \"plugin\" | \"video\" | \"link\" | \"text\" | \"selection\",\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"id\": \u0026lt;string\u0026gt;,  /* a unique ID (within this extension) for the gleam */\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"name\": \u0026lt;string\u0026gt;,  /* the name to display in the UI */\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"icon\": \u0026lt;path\u0026gt;,  /* A path to an icon to display in the UI */\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"regexp\": \u0026lt;string\u0026gt;,  /* optional, only valid for type \"text\". a regexp that filters text objects before invoking the filter function */\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"content-types\": \u0026lt;string[]\u0026gt;  /* optional, only valid for types \"image\", \"plugin\", and \"video\". an array of content-types to filter to */\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"filter\": \u0026lt;string\u0026gt;,  /* optional, an expression that evaluates to a function to use to filter objects to select */\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"callback\": \u0026lt;string\u0026gt;  /* an expression that evaluates to a function to call when the gleam is invoked */\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  ]\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}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Filters\" /\u003eFilters\u003c/h2\u003e\u003cdiv\u003eEach page action can specify an optional filter. The filter is a string that should evaluate to a JavaScript function. The function is called for each object found that matches the specified type and any applicable declarative filters.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe filter callback receives an object with the following properties:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eString id  // The ID of the gleam that a matching object was found for.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eString documentUrl  // The URL of the document the object was found on.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eint tabId  // The ID of the tab the object was found on.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eString contentType  // The content type of the matching object. Only valid for image, video, and plugin.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eString url  // The URL of the object. Only valid for image, video, and link\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eString text  // The text of the object. Only valid for text and link.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eint width  // The width of the object, if known. Only valid for image, video, and plugin\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eint height  // The height of the object, if known. Only valid for image, video, and plugin\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor all types except text, the filter callback should return a boolean indicating whether the object should be selected. For type text, the filter callback should return an array of begin/end pairs indicating the ranges inside the text that should be selected.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eNote that extension developers may choose to never select any objects if they are only interested in knowing about certain types of objects on the page, not performing actions on them.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Callbacks\" /\u003eCallbacks\u003c/h2\u003e\u003cdiv\u003eEach action must specify a callback. The callback is a string that should evaluate to a JavaScript function. The function is called when the gleam is invoked by the user. The parameters to the callback are the same as the parameters to the filter (see above), and there is no return value.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Extra-Details\" /\u003eExtra Details\u003c/h2\u003e\u003cdiv\u003eOne of the neat things about this API is that we describe \"objects\" at a higher level than DOM nodes. So Chrome gets to decide how to translate the DOM into these \"objects\". We have an opportunity to really reduce complexity for developers by doing these translations smartly.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eFor type \"image\", we shouldn't send images that are very small, or off screen. These are layout-related, most likely, and not useful to users.\u003c/li\u003e\u003cli\u003eFor type \"text\", we should construct a text string for entire paragraphs at a time, removing all inline formatting tags, links, etc. This is very difficult to do correctly and we can save developer lots of work and bugginess by doing it for them. When the extension returns ranges, we translate these back into the DOM tree. This is hard, but we have all the data necessary to do it. Extension developers don't because it isn't surfaced through DOM APIs. This also means that we need to track tree changes so that we can invalidate filters requests that are outstanding.\u003cbr /\u003e\u003c/li\u003e\u003cli\u003eWe could add other high-level objects in the future, like \"phone-number\" and \"address\". (thanks erikkay for the idea!)\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cbr /\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/gleam-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3333497264121754600"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3333497264121754600"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3333497264121754600"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"gleam-api"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"Xil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6318396998156211520"},"published":{"$t":"2009-04-09T01:38:31.723Z"},"updated":{"$t":"2011-12-20T00:50:31.866Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:05:07.439Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Downloads 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\u003cfont face\u003d\"'courier new', monospace\"\u003eThe downloads extension API draft proposal is available at \u003ca href\u003d\"http://goo.gl/6hO1n\"\u003ehttp://goo.gl/6hO1n\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/downloads-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6318396998156211520"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6318396998156211520"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6318396998156211520"}],"author":[{}],"sites$pageName":{"$t":"downloads-api"},"sites$revision":{"$t":"17"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7430996783435950902"},"published":{"$t":"2009-07-15T18:29:58.407Z"},"updated":{"$t":"2011-12-20T00:50:31.866Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:21:06.332Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Get Views by Type"},"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-Problem\" /\u003eProblem\u003c/h3\u003e\u003cdiv\u003eRight now we have chrome.extension.getViews() which returns a list of all active views (toolstrips, tab contents, the background page) in the extension. This is cool, but you also frequently need to get all views of a certain type. For example, all toolstrips, or just the background page. Also, people frequently want to get the toolstrips associated with a particular window.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Proposal\" /\u003eProposal\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.extension\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Returns an array of DOMWindows for the toolstrips running in the current extension.\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  // windowId: optional. If specified only returns toolstrips from that window. If\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // omitted, defaults to the current window as defined by chrome.windows.getCurrent().\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Can also be the string \"all\", in which case all toolstrips in all windows will be\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // returned.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:courier new,monospace\"\u003e  DOMWindow[] \u003cb\u003egetToolstrips\u003c/b\u003e([int-or-string windowId]);\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\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Returns an array of DOMWindows for any tabs running in the current extension.\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  // windowId: optional. If specified only returns toolstrips from that window. If\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // omitted, defaults to the current window as defined by chrome.windows.getCurrent().\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // Can also be the string \"all\", in which case all toolstrips in all windows will be\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // returned.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  DOMWindow[] \u003cb\u003egetTabs\u003c/b\u003e([int-or-string windowId]);\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  // Returns the DOMWindow for the extension's background page, or null if the extension\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  // doesn't have a background page.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  DOMWindow \u003cb\u003egetBackgroundPage\u003c/b\u003e();\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Example\" /\u003eExample\u003c/h3\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e// Assuming the extension has a background page and has a global function called \"foobar\".\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.extension.getBackgroundPage().foobar();\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/get-extension-views-by-type-proposal"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7430996783435950902"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7430996783435950902"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7430996783435950902"}],"author":[{"name":{"$t":"Aaron Boodman"},"email":{"$t":"aa@chromium.org"}}],"sites$pageName":{"$t":"get-extension-views-by-type-proposal"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4544456025489034678"},"published":{"$t":"2010-03-24T17:37:59.754Z"},"updated":{"$t":"2011-12-20T00:50:31.865Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-03-24T17:37:59.754Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"context_menu_api_4.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4544456025489034678"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api/context_menu_api_4.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4544456025489034678"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4544456025489034678"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4544456025489034678"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4544456025489034678"}],"author":[{"name":{"$t":"Antony Sargent"},"email":{"$t":"asargent@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4806824421639151947"},"published":{"$t":"2010-03-24T16:55:17.023Z"},"updated":{"$t":"2011-12-20T00:50:31.865Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-03-24T16:55:17.023Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"context_menu_api_2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4806824421639151947"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api/context_menu_api_2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4806824421639151947"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4806824421639151947"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4806824421639151947"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4806824421639151947"}],"author":[{"name":{"$t":"Antony Sargent"},"email":{"$t":"asargent@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4837901461111367150"},"published":{"$t":"2010-03-24T17:25:38.828Z"},"updated":{"$t":"2011-12-20T00:50:31.865Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-03-24T17:25:38.828Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"context_menu_api_3.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4837901461111367150"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api/context_menu_api_3.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4837901461111367150"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4837901461111367150"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4837901461111367150"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4837901461111367150"}],"author":[{"name":{"$t":"Antony Sargent"},"email":{"$t":"asargent@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7752684877274820343"},"published":{"$t":"2010-03-24T16:53:13.488Z"},"updated":{"$t":"2011-12-20T00:50:31.865Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-03-24T16:53:13.488Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"context_menu_api.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7752684877274820343"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api/context_menu_api.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7752684877274820343"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7752684877274820343"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7752684877274820343"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7752684877274820343"}],"author":[{"name":{"$t":"Antony Sargent"},"email":{"$t":"asargent@chromium.org"}}],"sites$revision":{"$t":"6"}},{"gd$etag":"\"Wil7JmA-\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"},"published":{"$t":"2010-03-06T00:29:31.406Z"},"updated":{"$t":"2011-12-20T00:50:31.864Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:43:05.901Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Context Menu API 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\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"background-color:rgb(255,0,0)\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"background-color:rgb(255,255,0)\"\u003eNOTE: This document is now out of date.\u003c/span\u003e The API evolved some while behind the experimental flag, and is becoming fully supported in chrome 6. For details on the current implementation you can see \u003c/font\u003e\u003c/b\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003ca href\u003d\"http://code.google.com/chrome/extensions/trunk/contextMenus.html\"\u003ehttp://code.google.com/chrome/extensions/trunk/contextMenus.html\u003c/a\u003e\u003c/div\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cdiv style\u003d\"display:inline!important\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003chr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eStatus\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"font-weight:normal\"\u003eBeing implemented behind the --enable-experimental-extension-apis flag so we can collect developer feedback. Should be landing in the tree relatively soon.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003eOverview\u003c/font\u003e\u003c/b\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eProvide a way for extensions to add items to the context (aka \"right click\") menu for web pages. \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\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUse cases\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eMany features that extensions want to expose are only applicable to certain kinds of content. Some examples include saving selected text or link urls to a extension-local or web based notepad, removing particular images from a page, filling in form fields, and looking up words in an online dictionary.\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\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eCould this API be part of the web platform?\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eProbably not, since many actions people would like to add are logically \"browser-level\" functionality.\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\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDo you expect this API to be fairly stable?\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYes, once we get some experience with an experimental version.\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\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eWhat UI does this API expose?\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eNew menu items \u0026amp; submenus in context menus.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cspan style\u003d\"font-weight:normal\"\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHow could this API be abused?\u003c/font\u003e\u003c/b\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eSomeone could create menu items with innocuous-sounding or misleading names (or even duplicates of built-in menu items) to trick users to click on them.\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\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eYou could (and perhaps some extensions do?) inject script into all pages to intercept onmousedown and create your own custom html menu implementation. But that is a terrible user experience since it prevents the browser-native menu from appearing.\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\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eDraft API spec\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eInitially these functions will only be callable from an extension's background page. This will likely not be sufficient, since a frequent use case for context menus is to operate on the specific link/image/etc. that the menu was activated on. See the \"Future Improvements\" section below for ideas about this.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cfont color\u003d\"#FF0000\"\u003eNote\u003c/font\u003e:\u003cspan style\u003d\"font-weight:normal\"\u003e because this will be initially available as an experiment, the API methods will at first be chrome.experimental.contextMenu.methodname\u003c/span\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003echrome.contextMenu.create\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(object properties, function onCreatedCallback);\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 face\u003d\"arial, sans-serif\"\u003eCreates a new context menu item. The onCreatedCallback function should have a signature like function(id) {}, and will be passed the integer id of the newly created menu item.\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\"\u003eThe properties parameter can contain:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003etitle \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - Text for this menu item. This is required for all types except 'SEPARATOR'. The special string %s in a title will be replaced with the currently selected text, if any.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003etype \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - One of the strings 'NORMAL', 'CHECKBOX', 'RADIO', or 'SEPARATOR'. Defaults to 'NORMAL' if not specified.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003cb\u003echecked \u003c/b\u003e(optional boolean) - For items of type CHECKBOX or RADIO, should this be selected (RADIO) or checked (CHECKBOX)? Only one RADIO item can be selected at a time in a given group of RADIO items, with the last one to have checked \u003d\u003d true winning.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003econtexts \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(string) - Which contexts should this menu item appear for? An array of one or more of the following strings: \u003c/font\u003e\u003c/div\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\"\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e'ALL', 'PAGE', 'SELECTION', 'LINK', 'EDITABLE', 'IMAGE', 'VIDEO', 'AUDIO'. \u003c/font\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\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\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eDefaults to PAGE, which means \"none of the rest\" are selected (no link, no image, etc.). If 'ALL' is in the array, the item will appear in all contexts regardless of the rest of the items in the array.\u003c/span\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eenabledContexts \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(string) - An array of strings similar to the contexts property. This serves to limit the contexts where this item will be enabled (ie not greyed out). If omitted, it defaults to the same set as the contexts property.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eparentId \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(integer) - If this should be a child item of another item, this is the id\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eonclick \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(function(object info, Tab tab)) - A function that will be called when this menu item is clicked on. The info parameter is an object containing the following properties:\u003c/font\u003e\u003c/div\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\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003emenuItemId \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(integer) - The id of the menu item that was clicked.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eparentMenuItemId \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional integer) - The parent id, if any, for the item clicked.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003emediaType \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - One of 'IMAGE', 'AUDIO', or 'VIDEO' if the context item was brought up on one of these types of elements.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003elinkUrl \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - If the element is a link, the url it points to.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003esrcUrl \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - Will be present for elements with a 'src' url.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003epageUrl \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - The url of the page where the context menu was clicked.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eframeUrl \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - The url of the frame of the element where the context menu was clicked.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eselectionText \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(optional string) - The text for the context selection, if any.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e* \u003c/font\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eeditable \u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(boolean) - A flag indicating whether the element is editable (text input, textarea, etc.)\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\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\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eThe tab parameter is the tab where the click happened, of the same form as that returned by chrome.tabs.get.\u003cbr /\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003echrome.contextMenu.remove\u003c/font\u003e\u003c/b\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e(id);\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 face\u003d\"arial, sans-serif\"\u003eRemoves an extension menu item with the given id.\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\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv /\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eExamples\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u200b\u003cu\u003eDefine the currently selected word(s)\u003c/u\u003e\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\"\u003e\u200bThe following code would live in your background page, and you would need to have \"tabs\" specified in the permissions section of your manifest.\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\"Verdana, sans-serif\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u200bfunction getDefinition(info, tab) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e if (!info.selectionText || info.selectionText.length \u003d\u003d 0) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e   return;\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 var maxLength \u003d 1024;\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e var searchText \u003d (info.selectionText.length \u0026lt;\u003d maxLength) ?\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e                  info.selectionText : info.selectionText.substr(0, maxLength);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e var url \u003d \"http://www.google.com/search?q\u003ddefine:\" + escape(searchText);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e chrome.tabs.create({\"url\": url});\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\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.contextMenu.create({\"title\": \"Define '%s'\", \"onclick\": getDefinition,\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e                          \"contexts\":[\"SELECTION\"]});\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\"\u003e\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\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u200b\u003cu\u003eRemove an image from a page\u003c/u\u003e\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\"\u003eThe following code would live in your background page, and you would need to have an entry in the permissions section of your manifest which allowed you to run chrome.tabs.executeScript on the page where the image had its context menu activated. This example highlights one of the limitations of the initial proposal, which is that you don't have any way to determine the actual unique node that was clicked on, so it removes any instances of the image from the page.\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\"\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.contextMenu.create({\"title\": \"Remove This Image\", \"contexts\": [\"IMAGE\"],\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e                           \"onclick\": function(info, tab) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  var frameUrl \u003d info.frameUrl ? info.frameUrl : \"\";\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  var code \u003d \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"var imgs \u003d document.getElementsByTagName('img');\" +\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"var srcUrl \u003d unescape('\" + escape(info.srcUrl) + \"');\" +\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"for (var i in imgs) {\" + \u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"  var img \u003d imgs[i];\" +\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"  if (img.src \u003d\u003d srcUrl) {\" +\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e      \"    img.parentNode.removeChild(img);\" +\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      \"}\";\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  chrome.tabs.executeScript(tab.id, {\"allFrames\": true, \"code\": code});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e}});\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-weight:normal\"\u003e\u003cdiv\u003e\u003cb\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eUI Design\u003c/font\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e-Extension items appear towards the bottom of the context menu, above \"Inspect element\", sorted by extension name.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e-We will show at most one top-level menu item per extension. If an extension adds more than 1 item, we automatically push the items into a submenu, with the extension name as the top-level item.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e-The extension's icon will appear to the left of the top-level item to help the user understand which extension added what items, and help to mitigate the spoofing concerns raised above.\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\u003c/span\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api/context_menu_api_4.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" height\u003d\"200\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1324342231865/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api/context_menu_api_4.png\" width\u003d\"151\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cb\u003eFuture Improvements\u003c/b\u003e\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\"\u003e- Provide a mechanism for getting a handle to the precise node in the DOM where the menu was activated. This could mean one of the following ideas:\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eAllow registration of context menus from content scripts, with a callback function that receives a handle to the node.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ePass the id of the node in the callback to the background page, and if the node didn't have an id we synthesize one.\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eProvide something like chrome.tabs.executeScript, where you can pass a file or string of code to execute but also specify a function that will be called with the node\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e- Add an update(int id, object properties) method so you can change your menu items in place.\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\"\u003e- Add a removeAll() method so you don't have to keep track of id's if you don't want to.\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\"\u003e-Add a way to limit your menu items to specific tabs or frame urls (by a given match pattern, or perhaps automatically limit to only sites you have content script permissions for)\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\"\u003e-Some people have asked for a onBeforeShow() event to fire before the menu items are displayed, but this may be infeasible given chrome's multiprocess architecture and desire to keep the UI very responsive.\u003c/font\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"Verdana, sans-serif\"\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\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Verdana,sans-serif\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/context-menu-api"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1480209252943809526"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1480209252943809526"}],"author":[{"name":{"$t":"Antony Sargent"},"email":{"$t":"asargent@chromium.org"}}],"sites$pageName":{"$t":"context-menu-api"},"sites$revision":{"$t":"23"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3335785761165107748"},"published":{"$t":"2011-08-24T10:43:44.587Z"},"updated":{"$t":"2011-12-20T00:50:31.864Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-20T00:00:24.542Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Clear Browsing Data 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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cp dir\u003d\"ltr\" style\u003d\"text-align:left;margin-top:0pt;margin-bottom:0pt\"\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-align:-webkit-auto;white-space:pre-wrap\"\u003e\u003cfont size\u003d\"2\"\u003eOverview\u003c/font\u003e\u003c/span\u003e\u003c/p\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eChromium includes a mechanism for removing browsing data from a user’s profile, exposed via the “Under the Hood” preferences at \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,153);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://settings/clearBrowsingData\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e. Extensions should have programmatic access to this interface to offer the service to users in other forms and fashions.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUse cases\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eClearing browsing data is prima facie relevant to extensions that want to offer privacy protections for users above and beyond what is reasonable to offer as a default. Extensions like Tor and NoScript have both expressed interest.  Use-cases also exist in the developer community, specifically around clearing the browser’s cache (see\u003c/span\u003e\u003ca href\u003d\"http://crbug.com/54853\" style\u003d\"font-family:verdana,sans-serif\"\u003e\u003cspan style\u003d\"color:rgb(0,0,0);text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"color:rgb(0,0,153);vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://crbug.com/54853\u003c/span\u003e\u003c/a\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e for example, which HttpWatch is interested in).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eCould this API be part of the web platform?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThis specifically relates to data stored by the browser above and beyond the web platform’s storage options. It \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eincludes\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e those storage options (cookies, \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003elocalStorage\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e, etc. are browsing data), but also includes things like stored passwords, the browser’s cache, and other browser-specific forms of data that are not part of the web platform in general, but of Chromium’s particular implementation. More to the point, this API allows removal of \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003elocal\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e data for \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eall\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e origins, which is neither something we’d like to offer individual origins, nor something origins that wish to track users would appreciate. The API pretty clearly lands in the browser’s natural area of influence, giving users more direct control over client-side behavior.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eDo you expect this API to be fairly stable?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThis API would only change when the browser changes the types of information it stores. As it is by necessity browser-specific, that seems reasonable in terms of stability.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat UI does this API expose?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eNone. The mechanism is already exposed via \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;color:rgb(0,0,153);text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003echrome://settings/clearBrowsingData\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e, this proposal simply adds a programmatic interface.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eHow could this API be abused?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eMalicious extensions could clear browsing data continuously, which would have the impacts of both DoSsing the browser on the one hand, and breaking the web experience for users on the other (no cookies \u003d\u0026gt; no web).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThis can be mitigated by throttling access such that only one call can be in flight at once.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eHow would you implement your desired features if this API didn't exist?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIndividual users would be pointed to the form, and asked to clear their browsing data manually.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAre you willing and able to develop and maintain this API?\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eYes.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eDraft API spec\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eUsage of this API would require additional messaging to the user, and therefore a new permission message (perhaps something along the lines of “It can access: … \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-style:italic;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eWhat can it access? Nothing. It can remove things. Removing things isn’t really access. Bleh.\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e”).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eFirst, and most simply, requesting \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eclear\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e permissions would grant access to a \u003c/span\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.clear.browsingData\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e method that might look like the following:\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"namespace\": \"experimental.clear\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"functions\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"name\": \"browsingData\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"description\": \"Clears data generated by browsing within a particular timeframe.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"timePeriod\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"string\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"enum\": [\"last_hour\", \"last_day\", \"last_week\", \"last_month\", \"everything\"],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"description\": \"The timeframe inside of which to delete browsing data.”\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"dataToRemove\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"object\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"properties\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           \"cache\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Should the browser cache be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           \"cookies\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Should the browser's cookies/LSO/site data be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           \"downloads\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Should the browser's download list be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           \"form_data\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Should stored form data be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           \"history\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Should the browser's history be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           \"passwords\": {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"optional\": true,\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Should the stored passwords be cleared?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"callback\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"description\": \"Called when deletion has completed.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"true\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e               \"name\": \"result\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e               \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e               \"description\": \"Was the data deletion successful?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       }                                                                                                                                        \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003eAlong with the general \u003c/font\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.clear.browsingData()\u003c/font\u003e, type-specific methods (\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.clear.xxx()\u003c/font\u003e) could be provided for clearing specific types of data:\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"namespace\": \"experimental.clear\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"functions\": [\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e    {\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e      \"name\": \"cookies\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e      \"description\": \"Clears cookies/LSO/site data touched within a particular timeframe.\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e      \"type\": \"function\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e      \"parameters\": [\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e        {\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"name\": \"timePeriod\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"type\": \"string\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"enum\": [\"last_hour\", \"last_day\", \"last_week\", \"last_month\", \"everything\"],\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"optional\": \"false\",\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e          \"description\": \"The timeframe inside of which to delete browsing data.”\u003c/span\u003e\u003cbr style\u003d\"font-family:courier new,monospace;font-size:small\" /\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e        },\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e        {\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e          \"name\": \"callback\",\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e          \"type\": \"function\",\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e          \"description\": \"Called when deletion has completed.\",\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e          \"optional\": \"true\",\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e          \"parameters\": [\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e              {\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e                \"name\": \"result\",\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e                \"type\": \"boolean\",\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e                \"description\": \"Was the data deletion successful?\"\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e              }\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e          ]\u003c/span\u003e\u003cbr style\u003d\"white-space:normal\" /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline\"\u003e        } \u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e ]\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e }\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e ]\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:courier new,monospace;font-size:small;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eAdditionally, Chromium already provides \u003c/span\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.cookies\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.history\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e APIs, which give access to subsets of the “Clear Browsing Data” form’s functionality. These seem like excellent candidates for \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eBrowsingDataRemover\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e methods; adding \u003c/span\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e.clear()\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e methods to each of those seems like a reasonable way of addressing the request. The history namespace could additionally be overloaded to include \u003c/span\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e.clearXXX()\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e methods to clear the browser cache, downloaded files, stored passwords, and Autofill data (since all that data is arguably historical in nature).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eThese methods might look like the following:\u003c/span\u003e\u003cbr /\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"namespace\": \"cookies\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"functions\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"name\": \"clear\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"description\": \"Clears cookies and other site data modified within a time period.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"timePeriod\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"string\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"enum\": [\"last_hour\", \"last_day\", \"last_week\", \"last_month\", \"everything\"],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"description\": \"The time period inside which to delete cookies and site data.\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"callback\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"description\": \"Called when deletion has completed.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"true\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"name\": \"result\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Was the data deletion successful?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e ],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e},\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e{\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"namespace\": \"history\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \"functions\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"name\": \"clear\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"description\": \"Clears browsing history created within a time period.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"timePeriod\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"string\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"enum\": [\"last_hour\", \"last_day\", \"last_week\", \"last_month\", \"everything\"],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"false\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"description\": \"The time period inside which to delete browsing history.\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"name\": \"callback\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"type\": \"function\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"description\": \"Called when deletion has completed.\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"optional\": \"true\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         \"parameters\": [\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           {\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"name\": \"result\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"type\": \"boolean\",\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e             \"description\": \"Was the data deletion successful?\"\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e           }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e         ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e       }\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e     ]\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   },\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e   \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e ],\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003cspan style\u003d\"font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e…\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e}\u003c/span\u003e\u003c/font\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eIt would be valuable to distinguish the namespace from the permission required to execute the methods. Extensions focused on removing data (see the use-cases above) shouldn’t be required to request read access to cookies on a variety of hosts in order to clear them. Using the explicit \u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eclear\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e permission should grant access to the relevant methods regardless of namespace, as it would enable us to give the user a clear warning (\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ecookies\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e should grant the same access, for example, but only to the cookies-specific \u003c/span\u003e\u003cspan style\u003d\"text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003echrome.cookies.clear\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-weight:bold;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eOpen questions\u003c/span\u003e\u003c/font\u003e\u003col\u003e\u003cli style\u003d\"list-style-type:decimal;background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"verdana, sans-serif\" size\u003d\"2\"\u003e\u003cspan style\u003d\"vertical-align:baseline\"\u003eBrowsingDataRemover offers the option of clearing browsing history, download history, clearing the cache, deleting cookies + site + plug-in data, clearing saved passwords, and clearing Autofill data. Homes should be found for programmatic methods that clear each type of data. \u003cspan style\u003d\"white-space:pre-wrap\"\u003echrome.history\u003c/span\u003e\u003c/span\u003e mostly makes sense, but it’s a stretch.\u003c/font\u003e\u003c/li\u003e\u003c/ol\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/333592083211368911"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/proposed-changes/apis-under-development/clear"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3335785761165107748"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4921463921044203350/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3335785761165107748"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3335785761165107748"}],"author":[{"name":{"$t":"Mike West"},"email":{"$t":"mkwst@chromium.org"}}],"sites$pageName":{"$t":"clear"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDopeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7066829589948926651"},"published":{"$t":"2011-08-26T18:41:42.958Z"},"updated":{"$t":"2011-12-20T00:47:56.526Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-26T21:17:25.932Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"extension-doc-server.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7066829589948926651"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1838605870018848436"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/docs/how-docs-are-served/extension-doc-server.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7066829589948926651"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7066829589948926651"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7066829589948926651"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7066829589948926651"}],"author":[{}],"sites$revision":{"$t":"6"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4292260080504643566"},"published":{"$t":"2011-08-26T18:22:34.666Z"},"updated":{"$t":"2011-12-20T00:47:56.525Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-26T18:22:34.666Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ExtSourceServer.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4292260080504643566"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1838605870018848436"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/extensions/how-the-extension-system-works/docs/how-docs-are-served/ExtSourceServer.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4292260080504643566"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4292260080504643566"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4292260080504643566"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4292260080504643566"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3409510889952822012"},"published":{"$t":"2011-12-13T06:54:10.063Z"},"updated":{"$t":"2011-12-13T06:54:10.077Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-13T06:54:10.063Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"trace.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3409510889952822012"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/trace.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3409510889952822012"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3409510889952822012"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3409510889952822012"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3409510889952822012"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"},"published":{"$t":"2011-12-07T04:56:29.187Z"},"updated":{"$t":"2011-12-09T21:42:48.803Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T21:42:48.803Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Aura 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\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/aura/aura-overview/Aura.png?attredirects\u003d0\" imageanchor\u003d\"1\" /\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview/Aura.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1323233797493/developers/design-documents/aura/aura-overview/Aura.png\" /\u003e\u003c/a\u003e\u003c/div\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\"\u003eFrom the perspective of the user, Aura provides Window and Event types, as well as a set of interfaces to customize their behavior.\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\"\u003eThe root of a Window hierarchy is the RootWindow. This type is responsible for event dispatch.\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\"\u003eAn Aura window hierarchy is embedded within a native window provided by the underlying platform (XWindow, HWND). This native window is encapsulated in a RootWindowHost implementation for that specific platform. This host receives native events from the underlying system, cracks them into aura::Event subclasses and sends them to the RootWindow for dispatch.\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\"\u003eIn many ways the Aura architecture mimics that of Views, though it is a little simpler.\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Event-Flow\" /\u003eEvent Flow\u003c/h3\u003e\u003cdiv style\u003d\"display:block;margin-right:auto;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview/EventFlow.png?attredirects\u003d0\" imageanchor\u003d\"1\" style\u003d\"color:rgb(85,26,139);background-color:rgb(255,255,255);text-align:left\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1323234084990/developers/design-documents/aura/aura-overview/EventFlow.png\" style\u003d\"border-style:initial;border-color:initial\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv\u003eThis diagram shows the flow of events through each stage of the Aura system.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eThe RootWindowHost receives a base::NativeEvent (MSG/XEvent*) from the underlying platform.\u003c/li\u003e\u003cli\u003eThe RootWindowHost cracks this message to an aura::Event* type and forwards it to the RootWindow for further processing and dispatch.\u003c/li\u003e\u003cli\u003eDepending on the event type, a target window for event dispatch is determined for the event. See notes on dispatch below.\u003c/li\u003e\u003cli\u003eEvery registered aura::EventFilter* from the target window up to and including the RootWindow is given an opportunity to pre-handle the event. An EventFilter implementation will return true if it wants to consume the event and stop further processing. EventFilter is a powerful API to intercept events before the target Window gets a chance to handle them. It can be used by a client to implement features like window movement, modality, and so on.\u003c/li\u003e\u003cli\u003eFinally if no EventFilter intercepts the event, it is passed directly to the target window's delegate. The Window itself never sees the event directly, since window customization in Aura is done entirely through delegate interfaces like EventFilter, WindowDelegate, etc.\u003c/li\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2929219493196903588"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"aura-overview"},"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7272918815486597555"},"published":{"$t":"2011-12-09T21:19:55.687Z"},"updated":{"$t":"2011-12-09T21:19:55.694Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T21:19:55.687Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chromium-24.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7272918815486597555"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2628944143453249512"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos/release-process/chromium-24.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7272918815486597555"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7272918815486597555"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7272918815486597555"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7272918815486597555"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4978153667474196254"},"published":{"$t":"2011-12-09T21:13:28.916Z"},"updated":{"$t":"2011-12-09T21:13:28.929Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T21:13:28.916Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"death_metal_rooster3.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4978153667474196254"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2628944143453249512"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos/release-process/death_metal_rooster3.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4978153667474196254"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4978153667474196254"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4978153667474196254"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4978153667474196254"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4443371330505401150"},"published":{"$t":"2011-12-09T21:07:22.962Z"},"updated":{"$t":"2011-12-09T21:07:22.970Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T21:07:22.962Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"starwars-disturbance2.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4443371330505401150"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2628944143453249512"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos/release-process/starwars-disturbance2.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4443371330505401150"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4443371330505401150"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4443371330505401150"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4443371330505401150"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2700945913966929475"},"published":{"$t":"2011-12-09T20:52:49.705Z"},"updated":{"$t":"2011-12-09T20:52:49.713Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T20:52:49.705Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"update_software_popup.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2700945913966929475"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2628944143453249512"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos/release-process/update_software_popup.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2700945913966929475"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2700945913966929475"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2700945913966929475"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2700945913966929475"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6105580439047387610"},"published":{"$t":"2011-12-09T20:51:05.936Z"},"updated":{"$t":"2011-12-09T20:51:05.942Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T20:51:05.936Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"release process version 2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6105580439047387610"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2628944143453249512"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos/release-process/release%20process%20version%202.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6105580439047387610"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6105580439047387610"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6105580439047387610"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6105580439047387610"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7414243756171173952"},"published":{"$t":"2011-12-09T20:48:42.054Z"},"updated":{"$t":"2011-12-09T20:48:42.061Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-09T20:48:42.054Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"buildbot_screenshot.PNG"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7414243756171173952"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2628944143453249512"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/tech-talk-videos/release-process/buildbot_screenshot.PNG"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7414243756171173952"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7414243756171173952"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7414243756171173952"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7414243756171173952"}],"author":[{"name":{"$t":"Marc-Antoine Ruel"},"email":{"$t":"maruel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1089359577050883495"},"published":{"$t":"2011-12-07T05:25:37.600Z"},"updated":{"$t":"2011-12-07T05:25:37.604Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:25:37.600Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Client API.graffle"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1089359577050883495"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8929764337107639732"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/client-api/ClientAPI.graffle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1089359577050883495"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1089359577050883495"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1089359577050883495"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1089359577050883495"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/569835830843477320"},"published":{"$t":"2011-12-07T05:25:29.331Z"},"updated":{"$t":"2011-12-07T05:25:29.337Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:25:29.331Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Client API.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/569835830843477320"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8929764337107639732"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/client-api/ClientAPI.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/569835830843477320"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/569835830843477320"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/569835830843477320"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/569835830843477320"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4905609678788152803"},"published":{"$t":"2011-12-07T05:20:54.143Z"},"updated":{"$t":"2011-12-07T05:20:54.148Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:20:54.143Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Event Flow.graffle"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4905609678788152803"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview/EventFlow.graffle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4905609678788152803"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4905609678788152803"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4905609678788152803"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4905609678788152803"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8230706785459120315"},"published":{"$t":"2011-12-07T05:20:48.238Z"},"updated":{"$t":"2011-12-07T05:20:48.243Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:20:48.238Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Aura.graffle"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8230706785459120315"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview/Aura.graffle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8230706785459120315"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8230706785459120315"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8230706785459120315"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8230706785459120315"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4856822986864392704"},"published":{"$t":"2011-12-07T05:20:29.507Z"},"updated":{"$t":"2011-12-07T05:20:29.512Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:20:29.507Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Chrome Graphics Architecture.graffle"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4856822986864392704"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/814936007237467454"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/graphics-architecture/ChromeGraphicsArchitecture.graffle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4856822986864392704"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4856822986864392704"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4856822986864392704"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4856822986864392704"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8705505743505148826"},"published":{"$t":"2011-12-07T05:07:55.652Z"},"updated":{"$t":"2011-12-07T05:20:10.532Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:20:10.530Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Views"},"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\"\u003eViews is a user interface framework built on a type called, confusingly, View. \u003cspan style\u003d\"text-align:left\"\u003eResponsible for providing the content of our Aura windows, most of this code is also used by Desktop Chrome on Windows. Only the NativeWidget implementation differs (for now). Views also provides a set of useful reusable controls like Buttons, Menus, etc.\u003c/span\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cbr /\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/aura/views/Views.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1323234484952/developers/design-documents/aura/views/Views.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eViews is somewhat analogous to Aura, with a native host (NativeWidget implementations), a View hierarchy within a RootView that handles event dispatch.\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\"\u003eThe primary difference is that this system was designed and built before beng developed a healthy skepticism of is-a relationships, and so you accomplish rendering, event handling and layout here by subclassing View, rather than implementing a delegate interface as in Aura.\u003c/div\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/views"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8705505743505148826"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8705505743505148826"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8705505743505148826"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"views"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7110262659857108701"},"published":{"$t":"2011-12-07T05:20:06.643Z"},"updated":{"$t":"2011-12-07T05:20:06.648Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:20:06.643Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Views.graffle"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7110262659857108701"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8705505743505148826"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/views/Views.graffle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7110262659857108701"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7110262659857108701"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7110262659857108701"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7110262659857108701"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/751729769431270852"},"published":{"$t":"2011-12-07T05:14:35.902Z"},"updated":{"$t":"2011-12-07T05:19:47.721Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:19:47.720Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Layout Managers"},"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\"\u003eLayoutManager is a convenient abstraction that separates messy layout heuristics from the other particulars of a Window.\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/layout-managers/LayoutManager.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1323234913465/developers/design-documents/aura/layout-managers/LayoutManager.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"display:block;text-align:left\"\u003eA LayoutManager implementation attached to an Aura Window can control the layout (bounds, transform, and even other properties) of that Window's children.\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\"\u003eA LayoutManager is typically attached to a window at creation/initialization time. It is notified when:\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\u003cul\u003e\u003cli\u003ea child window added or removed, or the visibility of a child changes. This type of event may cause other child windows to be re-laid out.\u003c/li\u003e\u003cli\u003ethe size of the bound Window changes, which may cause the children to be re-laid out to accommodate the new viewport size.\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003eA LayoutManager implementation can be used for everything from simple behavior like keeping the application launcher docked to the bottom of the screen to complex layout heuristics for multiple windows across several virtual workspaces.\u003c/div\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/2680325264819182270"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/layout-managers"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/751729769431270852"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/751729769431270852"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/751729769431270852"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$pageName":{"$t":"layout-managers"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7619949869242296755"},"published":{"$t":"2011-12-07T05:18:48.274Z"},"updated":{"$t":"2011-12-07T05:18:48.279Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:18:48.274Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Layout Manager.graffle"},"summary":{},"content":{"type":"application/octet-stream","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7619949869242296755"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/751729769431270852"},{"rel":"alternate","type":"application/octet-stream","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/layout-managers/LayoutManager.graffle"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7619949869242296755"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7619949869242296755"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7619949869242296755"},{"rel":"edit-media","type":"application/octet-stream","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7619949869242296755"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6041670648501435247"},"published":{"$t":"2011-12-07T05:15:13.457Z"},"updated":{"$t":"2011-12-07T05:15:13.465Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:15:13.457Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Layout Manager.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6041670648501435247"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/751729769431270852"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/layout-managers/LayoutManager.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6041670648501435247"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6041670648501435247"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6041670648501435247"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6041670648501435247"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1633136979682639026"},"published":{"$t":"2011-12-07T05:08:04.948Z"},"updated":{"$t":"2011-12-07T05:08:04.952Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:08:04.948Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Views.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1633136979682639026"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8705505743505148826"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/views/Views.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1633136979682639026"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1633136979682639026"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1633136979682639026"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1633136979682639026"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6208571158564351415"},"published":{"$t":"2011-12-07T05:01:24.985Z"},"updated":{"$t":"2011-12-07T05:01:24.990Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T05:01:24.985Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Event Flow.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6208571158564351415"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview/EventFlow.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6208571158564351415"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6208571158564351415"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6208571158564351415"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6208571158564351415"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/58255082142999189"},"published":{"$t":"2011-12-07T04:56:37.488Z"},"updated":{"$t":"2011-12-07T04:56:37.493Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T04:56:37.488Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Aura.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/58255082142999189"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2929219493196903588"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/aura-overview/Aura.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/58255082142999189"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/58255082142999189"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/58255082142999189"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/58255082142999189"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7997531559471288511"},"published":{"$t":"2011-12-07T04:29:42.913Z"},"updated":{"$t":"2011-12-07T04:29:42.918Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-07T04:29:42.913Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Chrome Graphics Architecture.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7997531559471288511"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/814936007237467454"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura/graphics-architecture/ChromeGraphicsArchitecture.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7997531559471288511"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7997531559471288511"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7997531559471288511"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7997531559471288511"}],"author":[{"name":{"$t":"Ben Goodger"},"email":{"$t":"ben@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2754262732442979847"},"published":{"$t":"2011-12-05T18:03:58.267Z"},"updated":{"$t":"2011-12-05T18:03:58.277Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-12-05T18:03:58.267Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"configure providers.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2754262732442979847"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/785617412873134855"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/for-testers/enable-logging/configure%20providers.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2754262732442979847"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2754262732442979847"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2754262732442979847"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2754262732442979847"}],"author":[{"name":{"$t":"Sigurður Ásgeirsson"},"email":{"$t":"siggi@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7322186191642925018"},"published":{"$t":"2011-11-30T23:48:06.956Z"},"updated":{"$t":"2011-11-30T23:48:06.966Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-30T23:48:06.956Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"crash-example.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7322186191642925018"},"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/crash-example.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7322186191642925018"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7322186191642925018"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7322186191642925018"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7322186191642925018"}],"author":[{"name":{"$t":"David James"},"email":{"$t":"davidjames@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2350391606302897291"},"published":{"$t":"2011-11-30T23:36:50.631Z"},"updated":{"$t":"2011-11-30T23:36:50.640Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-30T23:36:50.631Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"cloud-storage.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2350391606302897291"},"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/cloud-storage.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2350391606302897291"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2350391606302897291"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2350391606302897291"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2350391606302897291"}],"author":[{"name":{"$t":"David James"},"email":{"$t":"davidjames@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5738102679948022432"},"published":{"$t":"2011-11-11T18:10:06.728Z"},"updated":{"$t":"2011-11-11T18:10:06.733Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-11T18:10:06.728Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Chrome Graphics Infrastructure.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5738102679948022432"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1940599759583609667"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/aura-desktop-window-manager/Chrome%20Graphics%20Infrastructure.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5738102679948022432"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5738102679948022432"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5738102679948022432"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5738102679948022432"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4896309272701794012"},"published":{"$t":"2011-11-11T17:10:39.517Z"},"updated":{"$t":"2011-11-11T17:10:39.524Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-11T17:10:39.517Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4896309272701794012"},"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/Screenshot.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4896309272701794012"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4896309272701794012"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4896309272701794012"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4896309272701794012"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"XSl7JmA_\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3857984174676674106"},"published":{"$t":"2010-08-02T22:49:18.919Z"},"updated":{"$t":"2011-11-04T18:37:57.413Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-04T18:37:57.413Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cros - How Chromium talks to 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-Abstract\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eAbstract\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-Detailed-Description\"\u003e\u003cstrong\u003e3 \u003c/strong\u003eDetailed Description\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cros-Files\"\u003e\u003cstrong\u003e3.1 \u003c/strong\u003eCros Files\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Workflow\"\u003e\u003cstrong\u003e3.2 \u003c/strong\u003eWorkflow\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Cros-DEPS\"\u003e\u003cstrong\u003e3.3 \u003c/strong\u003eCros DEPS\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Version-Checking\"\u003e\u003cstrong\u003e3.4 \u003c/strong\u003eVersion Checking\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Binding-libcros.so\"\u003e\u003cstrong\u003e3.5 \u003c/strong\u003eBinding libcros.so\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Modifying-method-implementation\"\u003e\u003cstrong\u003e3.6 \u003c/strong\u003eModifying method implementation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Adding-methods-to-Cros-API\"\u003e\u003cstrong\u003e3.7 \u003c/strong\u003eAdding methods to Cros API\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Deleting-methods-from-Cros-API\"\u003e\u003cstrong\u003e3.8 \u003c/strong\u003eDeleting methods from Cros API\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Modifying-method-signatures\"\u003e\u003cstrong\u003e3.9 \u003c/strong\u003eModifying method signatures\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-FAQ\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eFAQ\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-How-do-I-locally-test-a-Cros-and-corresponding-Chromium-change-before-I-check-anything-in-\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003eHow do I locally test a Cros and corresponding Chromium change before I check anything in?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Why-does-Cros-fail-to-load-with-message-Incompatible-libcros-version.-Client:x-Min:y-Max:-z-where-x-z-\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eWhy does Cros fail to load with message \"Incompatible libcros version. Client:x Min:y Max: z\" where x \u0026gt; z?\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Why-does-Cros-fail-to-load-with-message-Incompatible-libcros-version.-Client:x-Min:y-Max:-z-where-x-y-\"\u003e\u003cstrong\u003e4.3 \u003c/strong\u003eWhy does Cros fail to load with message \"Incompatible libcros version. Client:x Min:y Max: z\" where x \u0026lt; y?\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\u003cfont color\u003d\"#ff0000\" size\u003d\"4\"\u003e\u003cb\u003eDEPRECATED\u003c/b\u003e\u003c/font\u003e\u003cdiv\u003e\u003cfont color\u003d\"#ff0000\"\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/font\u003eAs of October 2011, the Cros library (libcros.so) is now in the process of phasing out. The chromium browser talks to the background servers of Chromium OS via IPC mechanism called D-Bus. The browser has ability to issue D-Bus method calls and handle D-Bus signals hence no longer needs the Cros library layer.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Abstract\" /\u003eAbstract\u003c/h2\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eCros came about because we needed a way for Chromium UI code to talk to Chromium OS code. For example, the Chromium networking UI needs to talk to Chromium OS flimflam to get network status and to make connections to wifi/cellular networks. Cros is set of APIs that is implemented on the Chromium OS side and exposed to Chromium via a dynamically linked \u003ci\u003elibcros.so\u003c/i\u003e file. We designed a versioning system to make sure that Chromium OS will only boot up if we have the correct version of \u003ci\u003elibcros.so\u003c/i\u003e. If either the \u003ci\u003elibcros.so \u003c/i\u003eversion or the Chromium version is too old, we catch that and disable login.\u003c/span\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Objective\" style\u003d\"color:rgb(0,102,204);outline-style:none\" /\u003eObjective\u003c/h2\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-size:small\"\u003eThe design behind Cros is based on these requirements:\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eChromium OS code and Chromium code are in 2 different source trees. When we do release builds, we may use different snapshots of these 2 trees depending on how stable they are. From past experience, we would release Chromium OS with a slightly older but stable version of Chromium. So Chromium should be able to talk to Chromium OS even if the \u003ci\u003elibcros.so\u003c/i\u003e file in Chromium OS is slightly newer.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eWe should be able to modify Cros implementation without having to recompile Chromium.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eWe should be able to add new Cros API methods without having to recompile Chromium.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhen new Cros API methods are needed by Chromium, we should be able to tell Chromium to bind to these new methods and use them in Chromium.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eThe LKGR build of Chromium OS should always work with the LKGR build of Chromium.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhen Cros in Chromium OS is incompatible with that of Chromium, we need fail fast and let the user know why.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Detailed-Description\" /\u003eDetailed Description\u003c/h2\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Cros-Files\" /\u003eCros Files\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:medium\"\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" cellspacing\u003d\"0\" style\u003d\"margin:0px;border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:191px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003c/span\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003eFile\u003c/span\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:562px;height:14px\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003eDescription\u003c/span\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:159px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003c/span\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003eUsed by Chromium OS\u003c/span\u003e\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:180px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003c/span\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:small\"\u003eUsed by Chromium\u003c/span\u003e\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:191px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003ci\u003eplatform/cros/chromeos_cros_api.h\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:562px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Defines version number of Cros: \u003cspan style\u003d\"border-collapse:separate\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ekCrosAPIMinVersion\u003c/code\u003e and \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/code\u003e\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:159px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:180px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes (only \u003cspan style\u003d\"border-collapse:separate;font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e)\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:191px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003ci\u003eplatform/cros/load.cc\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:562px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e This is the code that Chromium uses to bind methods to \u003ci\u003elibcros.so\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:159px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:180px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:191px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003ci\u003eplatform/cros/version_check.cc\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:562px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Version checking code to make sure that version of \u003ci\u003elibcros.so\u003c/i\u003e is compatible with Chromium\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:159px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:180px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:191px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003ci\u003eplatform/cros/chromeos_*.h\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:562px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Defines the Cros API\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:159px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:180px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:191px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e \u003ci\u003eplatform/cros/chromeos_*.cc\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:562px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Cros Implementation\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:159px;height:14px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e Yes\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:180px;height:14px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:separate\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Workflow\" /\u003eWorkflow\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eThis is the workflow of how \u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eCros\u003c/span\u003e is used in Chromium OS:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eChromium OS is built and the Cros files listed above are built into the \u003ci\u003elibcros.so\u003c/i\u003e file.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eChromium build uses a DEPS file to fetch a specific version of Cros to build against.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eChromium is built against this specific version of Cros API.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eWhen Chromium OS starts up Chromium, we make sure that the version of Cros that Chromium is built against is compatible with the version of \u003ci\u003elibcros.so\u003c/i\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eIf it's compatible, we binds the method calls from Chromium to the implementation in \u003ci\u003elibcros.so\u003c/i\u003e.\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-size:small\"\u003eAll Cros method calls from Chromium will now execute the corresponding method in Chromium OS's \u003ci\u003elibcros.so\u003c/i\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Cros-DEPS\" /\u003eCros DEPS\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:arial,sans-serif;font-size:small\"\u003eIn order to have Chromium build against a specific version of Cros, we use this DEPS file: \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/tools/cros.DEPS/DEPS?view\u003dmarkup\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/tools/cros.DEPS/DEPS?view\u003dmarkup\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\" /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\" style\u003d\"background-color:rgb(239,239,239);border:1px solid rgb(211,211,211);display:block;padding:0.5em 0px 0.5em 1em;line-height:16px\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003evars \u003d {\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e  \"chromium_git\": \"http://src.chromium.org/git\",\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e}\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003edeps \u003d {\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e  \"src/third_party/cros\":\u003c/code\u003e\u003c/div\u003e\u003cdiv\u003e\u003ccode\u003e    Var(\"chromium_git\") + \"/cros.git@\u003cspan style\u003d\"line-height:normal;font-size:medium;white-space:pre\"\u003e\u003cfont color\u003d\"#38761d\"\u003ee9730f8a\u003c/font\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/code\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003e\",\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003e}\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003eThe 7 characters after the @ is the first 7 characters of the git commit hash for the last Cros change that we want to build Chromium against.\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003eFor this example in this specific case, this is the change: \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dcros.git;a\u003dcommit;h\u003de9730f8a8a689ae3e506d1e400c4799190d302d0\"\u003ehttp://git.chromium.org/gitweb/?p\u003dcros.git;a\u003dcommit;h\u003de9730f8a8a689ae3e506d1e400c4799190d302d0\u003c/a\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003eThis DEPS file will need to be updated when there are new Cros APIs that are needed by Chromium.\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Version-Checking\" /\u003eVersion Checking\u003c/h3\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003eThe version checking code is in \u003ci\u003eversion_check.cc\u003c/i\u003e, and it gets run by Chromium when it is started by Chromium OS.\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003eIn chromeos-api.h, we define 2 version numbers: \u003ccode\u003ekCrosAPIMinVersion\u003c/code\u003e and \u003ccode\u003ekCrosAPIVersion\u003c/code\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e. We use these version numbers to decide if the version of Cros in Chromium is compatible with the version of Cros in Chromium OS. \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eSince both Chromium and Chromium OS have their own copy of chromeos-api.h, we have 2 sets of these 2 \u003cspan style\u003d\"font-family:arial,sans-serif\"\u003eversion numbers\u003c/span\u003e. \u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eChromium OS's \u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ekCrosAPIMinVersion\u003c/code\u003e and \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/code\u003e\u003c/span\u003e specify the min and max version of the Cros API that the \u003ci\u003elibcros.so\u003c/i\u003e supports. In other words, it is only compatible if \u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e in Chromium is within the range [\u003c/span\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ekCrosAPIMinVersion,\u003c/code\u003e \u003ccode style\u003d\"color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/code\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e] of Chromium OS.\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eThis means that the version of Cros in Chromium OS can be newer than the version of Cros in Chromium. In other words, \u003ci\u003elibcros.so\u003c/i\u003e can have new methods that are not used by an older version of Cros in Chromium, but not the other way around. If Chromium's \u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e is greater than Chromium OS's \u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e, then Chromium is likely depending on a new Cros API that's not implemented in \u003ci\u003elibcros.so\u003c/i\u003e. In this case, the version check fails, and we prevent user from logging in and display an error like: \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003eIncompatible libcros version. Client: 51 Min: 29 Max: 50\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003eThe \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIMinVersion\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e version in \u003ci\u003elibcros.so\u003c/i\u003e is used to specify the minimum version of the Cros API that's supported. This number gets increased when we remove methods from the Cros API. So if Chromium's \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e is less than Chromium OS's \u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIMinVersion\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e, then that means Chromium is likely using a Cros API method that's no longer there. In this case, the version check fails, and we prevent user from logging in\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif\"\u003e and display an error like: \u003ccode\u003eIncompatible libcros version. Client: 28 Min: 29 Max: 50\u003c/code\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Binding-libcros.so\" /\u003eBinding \u003ci\u003elibcros.so\u003c/i\u003e\u003c/h3\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003eAfter version check passes, the code in \u003ci\u003eload.cc\u003c/i\u003e runs to bind the Chromium method calls to the implementation in \u003ci\u003elibcros.so\u003c/i\u003e. If binding fails for any reason, we prevent the user from logging and display an error like: \u003ccode\u003eCouldn't load: MethodName\u003c/code\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"color:rgb(0,0,0)\"\u003e\u003cspan style\u003d\"font-family:Arial,Verdana,sans-serif;font-size:20px;font-weight:bold\"\u003eCommon Developer Workflows\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Modifying-method-implementation\" /\u003eModifying method implementation\u003c/h3\u003eTo change a Cros method implementation, you just need to change the code on the Chromium OS side and you don't need to do anything on the Chromium side. Chromium will bind with the unchanged Cros API on the new libcros.so and exercise your new code without any problems.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Adding-methods-to-Cros-API\" /\u003eAdding methods to Cros API\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eThis is best described by a table showing what you need to do on the Chromium OS side and on Chromium side:\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\"\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" 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:516px;height:14px\"\u003e \u003cb\u003eChromium OS\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:508px;height:14px\"\u003e \u003cb\u003eChromium\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:516px;height:14px\"\u003e Check in new code:\u003cbr /\u003e\u003cspan\u003e    - \u003c/span\u003eAdd new API to \u003ci\u003echromeos_*.h\u003cbr /\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan\u003e    - \u003c/span\u003eAdd implementation to \u003ci\u003echromeos_*.cc\u003cbr /\u003e\u003c/i\u003e\u003c/span\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan\u003e    - \u003c/span\u003eAdd code to \u003ci\u003eload.cc\u003c/i\u003e to declare and initialize new API\u003cbr /\u003e\u003cspan\u003e    \u003c/span\u003e- \u003c/span\u003e\u003cspan style\u003d\"font-style:normal\"\u003eIncrement \u003cspan style\u003d\"border-collapse:separate;font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e in \u003ci\u003echromeos_cros_api.h\u003c/i\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/td\u003e\u003ctd style\u003d\"width:508px;height:14px\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:516px;height:14px\"\u003e Get your change's commit hash from:\u003cbr /\u003e\u003cspan\u003e    \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/platform/cros.git;a\u003dcommit;h\u003dHEAD\"\u003ehttp://git.chromium.org/gitweb/?p\u003dchromiumos/platform/cros.git;a\u003dcommit;h\u003dHEAD\u003c/a\u003e\u003c/span\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:508px;height:14px\"\u003e \u003cspan style\u003d\"border-collapse:separate\"\u003e \u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e \u003c/td\u003e\u003ctd\u003e Update DEPS:\u003cbr /\u003e\u003cspan\u003e    - \u003c/span\u003ePut your commit hash in cros_deps/DEPS\u003cbr /\u003e\u003cspan\u003e    - Run \"gclient sync\"\u003cbr /\u003e\u003cspan\u003e    - Confirm third-party/cros includes your change\u003c/span\u003e\u003cbr /\u003e\u003cspan\u003e    - Make sure build compiles\u003cbr /\u003e    - Copy cros_DEPS/DEPS to tools/cros.DEPS/DEPS \u003cbr /\u003e\u003c/span\u003e    - Check in tools/cros.DEPS/DEPS\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd\u003e \u003c/td\u003e\u003ctd\u003e Check in new code that utilizes the new API\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Deleting-methods-from-Cros-API\" /\u003eDeleting methods from Cros API\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eDeleting a method from the API is a complicated process that's prone to error. \u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003eSo make sure you know what you are doing.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eIt is recommended that you wait at least a week after removing the usage and binding of the method before you actually remove the implementation. This is because deleting a method will make things backwards incompatible. So we need to make sure that all possible versions of Chromium that was use with Chromium OS will have this new Cros that does not bind with the deprecated method.\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\"\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" cellspacing\u003d\"0\" style\u003d\"margin:0px;border-collapse:collapse;border-color:rgb(136,136,136);border-width:1px\"\u003e\u003ctbody\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e \u003cb\u003eChromium OS\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e \u003cb\u003eChromium\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e \u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e Remove calls to deprecated API\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e Deprecate method:\u003cbr /\u003e\u003cspan\u003e    -\u003c/span\u003e Keep the method implementation\u003cbr /\u003e\u003cspan\u003e    - \u003c/span\u003eRemove binding of method in \u003ci\u003eload.cc\u003c/i\u003e\u003cbr /\u003e\u003cspan\u003e    - Increment \u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"border-collapse:separate;font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e in \u003ci\u003echromeos-api.h\u003c/i\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e Get your change's commit hash from:\u003cbr /\u003e\u003cspan\u003e  \u003c/span\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dcros.git;a\u003dcommit;h\u003dHEAD\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan\u003e \u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/a\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/platform/cros.git;a\u003dcommit;h\u003dHEAD\"\u003ehttp://git.chromium.org/gitweb/?p\u003dchromiumos/platform/cros.git;a\u003dcommit;h\u003dHEAD\u003c/a\u003e \u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e \u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e Update DEPS:\u003cbr /\u003e\u003cspan\u003e    - \u003c/span\u003ePut your commit hash in cros_deps/DEPS\u003cbr /\u003e\u003cspan\u003e    - Run \"gclient sync\"\u003cbr /\u003e\u003cspan\u003e    - Confirm third-party/cros includes your change\u003c/span\u003e\u003cbr /\u003e\u003cspan\u003e    - Make sure build compiles\u003cbr /\u003e    - Copy cros_DEPS/DEPS to tools/cros.DEPS/DEPS\u003cbr /\u003e    - Check in tools/cros.DEPS/DEPS\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e Delete method:\u003cbr /\u003e\u003cspan\u003e    - Delete implementation\u003cbr /\u003e\u003cspan\u003e    - Set \u003cspan style\u003d\"border-collapse:separate;font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIMinVersion\u003c/span\u003e to \u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"border-collapse:separate;font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003cspan\u003e    - Increment \u003ci\u003e\u003cspan style\u003d\"font-style:normal\"\u003e\u003cspan style\u003d\"border-collapse:separate;font-family:monospace;color:rgb(0,96,0)\"\u003ekCrosAPIVersion\u003c/span\u003e\u003c/span\u003e\u003c/i\u003e in \u003ci\u003echromeos-api.h\u003c/i\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e Get your change's commit hash from:\u003cbr /\u003e  \u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan\u003e \u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dchromiumos/platform/cros.git;a\u003dcommit;h\u003dHEAD\"\u003ehttp://git.chromium.org/gitweb/?p\u003dchromiumos/platform/cros.git;a\u003dcommit;h\u003dHEAD\u003c/a\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003ca href\u003d\"http://git.chromium.org/gitweb/?p\u003dcros.git;a\u003dcommit;h\u003dHEAD\" /\u003e\u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"vertical-align:top;width:516px;height:14px\"\u003e \u003c/td\u003e\u003ctd style\u003d\"vertical-align:top;width:508px;height:14px\"\u003e Update DEPS:\u003cbr /\u003e\u003cspan\u003e    - \u003c/span\u003ePut your commit hash in cros_deps/DEPS\u003cbr /\u003e\u003cspan\u003e    - Run \"gclient sync\"\u003cbr /\u003e\u003cspan\u003e    - Confirm third-party/cros includes your change\u003c/span\u003e\u003cbr /\u003e\u003cspan\u003e    - Make sure build compiles\u003cbr /\u003e    - Copy cros_DEPS/DEPS to tools/cros.DEPS/DEPS\u003cbr /\u003e    - Check in tools/cros.DEPS/DEPS\u003c/span\u003e\u003c/span\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Modifying-method-signatures\" /\u003eModifying method signatures\u003c/h3\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003eIt is highly recommend against modifying method signatures. This is because if you modify a method signature, you would need to check in a backwards incompatible change. In other words, in order for Chromium to talk to Chromium OS, it would need this exact version of Cros. So you would have to check in code to both Chromium OS and Chromium at the same time. And i\u003c/span\u003e\u003cspan style\u003d\"font-size:small\"\u003ef anyone tries to use Chromium OS with a slightly older version of Chromium, they will be blocked from logging in.\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\"\u003eInstead of modifying a method signature, it is better to just add a new method in Cros, change it so that Chromium calls this new method. And after a while, delete the old deprecated method.\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-size:13px\"\u003e\u003cdiv\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-FAQ\" /\u003eFAQ\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-How-do-I-locally-test-a-Cros-and-corresponding-Chromium-change-before-I-check-anything-in-\" /\u003eHow do I locally test a Cros and corresponding Chromium change before I check anything in?\u003c/h3\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eAfter you have \"git commit\" the Cros code, you can use \"git pull\" to pull that code to Chromium:\u003c/font\u003e\u003c/span\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:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003ecd ~/chrome/src/third_party/cros\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003egit pull ~/chromeos/src/platform/cros\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv /\u003e\u003c/div\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003eAnd if you want to test Chromium with the new \u003ci\u003elibcros.so\u003c/i\u003e, you need to copy it to the chromeos directory:\u003c/font\u003e\u003c/span\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:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003eemerge-x86-generic libcros \u003ci\u003e(in Chromium OS chroot)\u003c/i\u003e\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003emkdir ~/chrome/src/out/Debug/chromeos\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cspan style\u003d\"font-family:Arial;font-size:13px\"\u003e\u003cfont face\u003d\"Arial, Verdana, sans-serif\"\u003e\u003ccode\u003ecp ~/chromeos/chroot/build/x86-generic/opt/google/chrome/chromeos/* ~/chrome/src/out/Debug/chromeos\u003c/code\u003e\u003c/font\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Why-does-Cros-fail-to-load-with-message-Incompatible-libcros-version.-Client:x-Min:y-Max:-z-where-x-z-\" /\u003eWhy does Cros fail to load with message \"Incompatible libcros version. Client:x Min:y Max: z\" where x \u0026gt; z?\u003c/h3\u003e\u003cdiv\u003eThis happens when the version of Cros in Chromium is newer than the version of Cros in Chromium OS. To fix this, make sure you fetch the latest code from \u003ci\u003eplatform/cros\u003c/i\u003e and then emerge libcros.\u003c/div\u003e\u003cdiv\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Why-does-Cros-fail-to-load-with-message-Incompatible-libcros-version.-Client:x-Min:y-Max:-z-where-x-y-\" /\u003eWhy does Cros fail to load with message \"Incompatible libcros version. Client:x Min:y Max: z\" where x \u0026lt; y?\u003c/h3\u003eThis happens when the version of Cros in Chromium is too old for the version of Cros in Chromium OS. To fix this, make sure you build the latest Chromium.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\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/3366051319303255070"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/chromium-os-libcros"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3857984174676674106"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3857984174676674106"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3857984174676674106"}],"author":[{}],"sites$pageName":{"$t":"chromium-os-libcros"},"sites$revision":{"$t":"34"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6433205477858136172"},"published":{"$t":"2011-11-03T15:40:32.104Z"},"updated":{"$t":"2011-11-03T15:40:32.114Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-03T15:40:32.104Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"tdev.bmp"},"summary":{},"content":{"type":"image/bmp","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6433205477858136172"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9017008956811641725"},{"rel":"alternate","type":"image/bmp","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/poking-around-your-chrome-os-device/tdev.bmp"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6433205477858136172"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6433205477858136172"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6433205477858136172"},{"rel":"edit-media","type":"image/bmp","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6433205477858136172"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9170791578880237813"},"published":{"$t":"2011-11-03T15:39:49.908Z"},"updated":{"$t":"2011-11-03T15:39:49.921Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-03T15:39:49.908Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"dev.bmp"},"summary":{},"content":{"type":"image/bmp","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9170791578880237813"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9017008956811641725"},{"rel":"alternate","type":"image/bmp","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/poking-around-your-chrome-os-device/dev.bmp"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9170791578880237813"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9170791578880237813"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9170791578880237813"},{"rel":"edit-media","type":"image/bmp","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9170791578880237813"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1630774671005618191"},"published":{"$t":"2011-11-01T21:23:27.960Z"},"updated":{"$t":"2011-11-01T21:23:27.973Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-01T21:23:27.960Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"profile_menu3.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1630774671005618191"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/profile_menu3.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1630774671005618191"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1630774671005618191"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1630774671005618191"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1630774671005618191"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5100099362624611126"},"published":{"$t":"2011-11-01T16:25:24.648Z"},"updated":{"$t":"2011-11-01T16:25:50.126Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-01T16:25:50.112Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"cupcake_2.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5100099362624611126"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/cupcake_2.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5100099362624611126"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5100099362624611126"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5100099362624611126"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5100099362624611126"}],"author":[{}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6553111965990778714"},"published":{"$t":"2011-11-01T16:17:29.949Z"},"updated":{"$t":"2011-11-01T16:17:29.955Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-01T16:17:29.949Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"signin_1.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6553111965990778714"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/signin_1.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6553111965990778714"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6553111965990778714"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6553111965990778714"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6553111965990778714"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2712715976878724972"},"published":{"$t":"2011-11-01T15:25:38.379Z"},"updated":{"$t":"2011-11-01T15:25:38.390Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-11-01T15:25:38.379Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2011-11-01 at 11.21.45 AM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/2712715976878724972"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3372033770379792144"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/user-experience/multi-profiles/Screen%20shot%202011-11-01%20at%2011.21.45%20AM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2712715976878724972"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2712715976878724972"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2712715976878724972"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/2712715976878724972"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WSl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/593080421323669707"},"published":{"$t":"2010-12-15T22:46:10.219Z"},"updated":{"$t":"2011-10-27T17:58:24.187Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-10-27T17:58:24.187Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Target Serial 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\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-USB-Serial-Dongle\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eUSB Serial Dongle\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-ser2net\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eser2net\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-screen\"\u003e\u003cstrong\u003e3 \u003c/strong\u003escreen\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-minicom\"\u003e\u003cstrong\u003e4 \u003c/strong\u003eminicom\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Minicom-Installation\"\u003e\u003cstrong\u003e4.1 \u003c/strong\u003eMinicom Installation\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Minicom-Configuration\"\u003e\u003cstrong\u003e4.2 \u003c/strong\u003eMinicom Configuration\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Execution\"\u003e\u003cstrong\u003e4.3 \u003c/strong\u003eExecution\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Minicom-commands\"\u003e\u003cstrong\u003e4.3.1 \u003c/strong\u003eMinicom commands\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-ssh\"\u003e\u003cstrong\u003e5 \u003c/strong\u003essh\u003c/a\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003e\u003c/div\u003eIt is useful to be able to get a terminal on your target device. This page lists some options for this. Instructions assume Ubuntu Lucid and a 115200 serial link.  Also you should be using a serial null modem cable.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-USB-Serial-Dongle\" /\u003eUSB Serial Dongle\u003c/h2\u003eThis is a common way of getting a serial port on a computer. See \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,Verdana,sans-serif;font-size:14px\"\u003e\u003ca href\u003d\"http://www.google.com/url?q\u003dhttp%3A%2F%2Ftrendnet.com%2Fproducts%2Fproddetail.asp%3Fprod%3D150_TU-S9%26cat%3D49\u0026amp;sa\u003dD\u0026amp;sntz\u003d1\u0026amp;usg\u003dAFrqEzej3O8N15gqmTe0cLvyXkQt6wK5uQ\" style\u003d\"color:rgb(31,56,132)!important\"\u003eTRENDnet USB to Serial converter\u003c/a\u003e for example.\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-ser2net\" /\u003eser2net\u003c/h2\u003eThis is a convenient tool which allows you to 'telnet' into your board over a serial link. These instructions assume you are using a single USB serial dongle (/dev/ttyUSB0) but you can also use a real serial port (/dev/ttyS0) if you like. If you have an FTDI serial device providing serial access then it will use /dev/ttyACM0.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo apt-get install ser2net\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eEdit /etc/ser2net.conf and add this line:\u003cpre\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e4000:telnet:600:/dev/ttyUSB0:115200 8DATABITS NONE 1STOPBIT banner\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eThen restart so that ser2net sees your changes:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003esudo /etc/init.d/ser2net restart\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eYou can now connect to the board with:\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003etelnet localhost 4000\u003c/code\u003e\u003c/div\u003e\u003c/pre\u003eTo disconnect, press Ctrl-\\ then Ctrl-D.\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-screen\" /\u003escreen\u003c/h2\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,Verdana,sans-serif;font-size:14px\"\u003e\u003cdiv\u003eScreen is a useful tool for maintaining connections which you can switch between easily. It is often used to run a long-running job such that you can logout, then later login, reconnect and check progress. You can also use screen to get a serial link:\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:1px solid rgb(211,211,211);display:block;padding:0.5em 0px 0.5em 1em;line-height:14px;font-family:arial,sans-serif\"\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003escreen -t 'ttyUSB0 115200 8n1' /dev/ttyUSB0 115200,-ixoff,-\u003c/code\u003e\u003ccode style\u003d\"color:rgb(0,96,0)\"\u003eixon\u003c/code\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eReset the machine and U-Boot should start printing to your terminal.\u003cbr /\u003e\u003cbr /\u003eFor help, use Ctrl-A Ctrl-?. To disconnect, press Ctrl-A Ctrl-D and to quit the session Ctrl-A Ctrl-\\\u003cbr /\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-minicom\" /\u003eminicom\u003c/h2\u003eMinicom is a terminal program, intended for use with a modem, that\u003cbr /\u003eworks well as an intermediary to any remote system connect through a\u003cbr /\u003eserial port.\u003cbr /\u003e\u003cbr /\u003eOne big advantage of minicom is that it allows one to easily capture\u003cbr /\u003etext into a file.\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Minicom-Installation\" /\u003eMinicom Installation\u003c/h3\u003eTo install minicom, execute the following\u003cbr /\u003e \u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e  sudo apt-get install minicom\u003c/code\u003e\u003c/div\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Minicom-Configuration\" /\u003eMinicom Configuration\u003c/h3\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e  sudo minicom -s\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003eThe configuration is done through a simple menu system.  Use the options below for a basic working configuration.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e  Select 'Serial Port Setup' using the arrow keys; press \u0026lt;Enter\u0026gt;\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Select 'A': enter the name of your serial port.  (ex: /dev/ttyUSB0)\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Select 'E': select 'E' (115200), then 'Q' (8N1)\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Set 'Hardware Flow Control' to 'No.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Set 'Software Flow Control' to 'No'.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Press \u0026lt;Enter\u0026gt;; this brings you back to the main menu (titled '[configuration]')\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Select 'Save setup as dfl'; press \u0026lt;Enter\u0026gt;.\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e  Select 'Exit from Minicom'; press \u0026lt;Enter\u0026gt;.\u003c/code\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Execution\" /\u003eExecution\u003c/h3\u003e  Minicom needs access to the configured serial port.  This means you\u003cbr /\u003e  either need to change the permissions on that port to allow your\u003cbr /\u003e  normal user to access the port in read/write mode, or run using\u003cbr /\u003e  'sudo'.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003e sudo minicom\u003c/code\u003e\u003c/div\u003e\u003ch4\u003e\u003ca name\u003d\"TOC-Minicom-commands\" /\u003eMinicom commands\u003c/h4\u003e  All commands are prefixed with \u0026lt;Ctrl-A\u0026gt;, which will be abbreviated\u003cbr /\u003e  C-a.\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003cbr /\u003e\u003ctable border\u003d\"1\" bordercolor\u003d\"#888888\" 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:60px;height:16px\"\u003e\u003ccode\u003e Key\u003c/code\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:16px\"\u003e\u003ccode\u003e Result\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:45px\"\u003e\u003ccode\u003eC-a Z\u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:45px\"\u003e\u003ccode\u003eOpens interactive menu\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:29px\"\u003e\u003ccode\u003eC-a C\u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:29px\"\u003e\u003ccode\u003eClear Screen\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:45px\"\u003e\u003ccode\u003eC-a L\u003c/code\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:45px\"\u003e\u003ccode\u003ePrompt for capture log file name.\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:77px\"\u003e\u003ccode\u003eC-a L\u003c/code\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:77px\"\u003e\u003ccode\u003e(after opening log file) Pause or close log file\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:45px\"\u003e\u003ccode\u003eC-a Q\u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:45px\"\u003e\u003ccode\u003e Quit (w/o modem reset)\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:29px\"\u003e\u003ccode\u003eC-a X \u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:29px\"\u003e\u003ccode\u003e Quit immediately\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:77px\"\u003e\u003ccode\u003eC-a E\u003c/code\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:77px\"\u003e\u003ccode\u003eToggle  echo of locally typed characters\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:29px\"\u003e\u003ccode\u003eC-a W\u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:29px\"\u003e\u003ccode\u003eToggle Line Wrap\u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:60px;height:16px\"\u003e\u003ccode\u003eC-a T\u003c/code\u003e\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:286px;height:16px\"\u003e\u003ccode\u003eSelect terminal settings\u003c/code\u003e\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003c/div\u003e\u003cbr /\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-ssh\" /\u003essh\u003c/h2\u003eOnce you have network access, and assuming you are using a test build, you can use ssh to connect to your target.\u003cbr /\u003e\u003cbr /\u003e\u003cdiv class\u003d\"sites-codeblock sites-codesnippet-block\"\u003e\u003ccode\u003essh chronos@192.168.2.3\u003c/code\u003e\u003cbr /\u003e\u003ccode\u003e(password test0000)\u003c/code\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/1573047155342212031"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/debugging-tips/target-serial-access"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/593080421323669707"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593080421323669707"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/593080421323669707"}],"author":[{"name":{"$t":"Simon Glass"},"email":{"$t":"sjg@chromium.org"}}],"sites$pageName":{"$t":"target-serial-access"},"sites$revision":{"$t":"10"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9066908320192751558"},"published":{"$t":"2011-10-25T13:54:38.354Z"},"updated":{"$t":"2011-10-26T13:21:25.085Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-10-26T13:21:25.084Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Installer Error Strings"},"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\"\u003eChrome's Windows installer provides localized error strings to Google Update for presentation to the user.  The strings are written to the registry by \u003ca href\u003d\"http://codesearch.google.com/codesearch#OAMlx_jo-ck/src/chrome/installer/util/installer_state.h\u0026amp;exact_package\u003dchromium\u0026amp;q\u003dWriteInstallerResult\u0026amp;l\u003d183\u0026amp;ct\u003drc\u0026amp;cd\u003d1\"\u003eWriteInstallerResult\u003c/a\u003e. As of this writing, the set of error string message identifiers (search for them in \u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/app/google_chrome_strings.grd?view\u003dmarkup\"\u003egoogle_chrome_strings.grd\u003c/a\u003e for their corresponding text) is:\u003cdiv\u003e\u003cbr /\u003e\u003cdiv\u003e\u003cdiv\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\"width:329px;height:15px\"\u003e \u003cb\u003eMessage ID\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e \u003cb\u003eProduct(s)\u003c/b\u003e\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e \u003cb\u003eOperation\u003c/b\u003e\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_DIR_IN_USE\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e First install\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_FAILED\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All \u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_HIGHER_VERSION\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Update\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_HIGHER_VERSION_CB_CF\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome + Chrome Frame\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Update\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_HIGHER_VERSION_CF\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome Frame\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Update\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_INCONSISTENT_UPDATE_POLICY\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Update\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_INSUFFICIENT_RIGHTS\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All system-level\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_INVALID_ARCHIVE\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_MULTI_INSTALLATION_EXISTS\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Update or Repair\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:18px\"\u003e IDS_INSTALL_NON_MULTI_INSTALLATION_EXISTS\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:18px\"\u003e Chrome Frame\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:18px\"\u003e Update or Repair\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_NO_PRODUCTS_TO_UPDATE\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e First install\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_OS_ERROR\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_OS_NOT_SUPPORTED\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_READY_MODE_REQUIRES_CHROME\u003cbr /\u003e\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome Frame\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_SYSTEM_LEVEL_EXISTS\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Update or Repair\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_TEMP_DIR_FAILED\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_INSTALL_UNCOMPRESSION_FAILED\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_SAME_VERSION_REPAIR_FAILED\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Repair\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_SAME_VERSION_REPAIR_FAILED_CF\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e Chrome Frame\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e Repair\u003c/td\u003e\u003c/tr\u003e\u003ctr\u003e\u003ctd style\u003d\"width:329px;height:15px\"\u003e IDS_SETUP_PATCH_FAILED\u003c/td\u003e\u003ctd style\u003d\"width:156px;height:15px\"\u003e All\u003c/td\u003e\u003ctd style\u003d\"width:104px;height:15px\"\u003e All\u003c/td\u003e\u003c/tr\u003e\u003c/tbody\u003e\u003c/table\u003e\u003cbr /\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/8148472531619614157"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/diagnostics/installer-error-strings"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9066908320192751558"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9066908320192751558"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9066908320192751558"}],"author":[{"name":{"$t":"Greg Thompson"},"email":{"$t":"grt@chromium.org"}}],"sites$pageName":{"$t":"installer-error-strings"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2176953649030396317"},"published":{"$t":"2011-09-30T01:58:19.363Z"},"updated":{"$t":"2011-09-30T04:15:13.365Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-30T04:15:13.364Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Leak GDI Objects in Windows"},"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-Tools\" /\u003eTools\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eWindows Task Manager\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eAdd \"GDI Objects\" column by [View]-[Select Columns...]\u003c/li\u003e\r\n\u003cli\u003eYou may also want to add \"Handle\", \"Thread\" and \"USER Objects\"\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eGDIView (works Win7 32bit and 64bit)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.nirsoft.net/utils/gdi_handles.html\" rel\u003d\"nofollow\"\u003ehttp://www.nirsoft.net/utils/gdi_handles.html\u003c/a\u003e\u003c/li\u003e\r\n\u003cli\u003eNote: GdiQueryTable (undocumented GDI32.DLL Win32 API) and PEB-\u0026gt;GetSharedGdiHandleTable don't work on Win7. \u003c/li\u003e\r\n\u003cli\u003eI'm studying how to enumerate GDI handles on Win7.\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003c/div\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Anti-Patterns\" /\u003eAnti Patterns\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-DeleteObject-with-HICON\" /\u003eDeleteObject with HICON\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cb\u003eDeleteObject WIN32 API works all GDI objects except for icon \u003c/b\u003e(\u003cspan style\u003d\"font-family:monospace;font-size:12px\"\u003e\u003ca href\u003d\"http://code.google.com/p/chromium/issues/detail?id\u003d97559\" style\u003d\"color:rgb(65,130,250)\"\u003e97559\u003c/a\u003e) \u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003eWe must use DestroyIcon.\u003c/div\u003e\r\n\u003cdiv\u003e\u003cfont face\u003d\"monospace\"\u003e\u003cspan style\u003d\"font-size:12px\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\r\n\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\r\n\u003cdiv\u003eIn tabe_view.cc(237)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;font-size:12px\"\u003e\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/views/controls/table/table_view.cc?annotate\u003d101329\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/views/controls/table/table_view.cc?annotate\u003d101329\u003c/a\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;font-size:12px\"\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\r\n\u003cpre\u003e810 HICON empty_icon \u003d\r\n811 IconUtil::CreateHICONFromSkBitmap(canvas.ExtractBitmap());\r\n812 ImageList_AddIcon(image_list, empty_icon);\r\n813 ImageList_AddIcon(image_list, empty_icon);\r\n814 DeleteObject(empty_icon);\r\n\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Leak-Screen-DC-aka-GetDC-NULL-\" /\u003eLeak Screen DC aka GetDC(NULL)\u003c/h3\u003e\r\n\u003cdiv\u003eGetDC(NULL) returns newly created screen DC. So, you must release it by using ReleaseDC. You may want to use ScopedGetDC (\u003ca href\u003d\"http://codesearch.google.com/#OAMlx_jo-ck/src/base/win/scoped_hdc.h\"\u003ehttp://codesearch.google.com/#OAMlx_jo-ck/src/base/win/scoped_hdc.h\u003c/a\u003e)\u003c/div\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\u003cb\u003eI would like to draw in bitmap \u003c/b\u003e(\u003ca href\u003d\"http://crbug.com/98523\"\u003ehttp://crbug.com/98523\u003c/a\u003e)\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\u003eIn print_web_view_helper_win.cc(237)\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/print_web_view_helper_win.cc?annotate\u003d103082\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/print_web_view_helper_win.cc?annotate\u003d103082\u003c/a\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;white-space:pre;font-size:medium\"\u003e\u003cbr /\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;white-space:pre;font-size:medium\"\u003e235\u003c/span\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;white-space:pre;font-size:medium\"\u003e \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// Page used alpha blend, but printer doesn't support it. Rewrite the\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e236 \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// metafile and flatten out the transparency.\r\n\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e237 HDC bitmap_dc \u003d CreateCompatibleDC\u003cspan style\u003d\"background-color:rgb(136,255,184);font-weight:bold;background-repeat:initial initial\"\u003e(GetDC(NULL)\u003c/span\u003e);\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e238 \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eif\u003c/span\u003e (!bitmap_dc)\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\r\n\u003cdiv\u003e\u003cb\u003eEasy way to know screen DPI\u003c/b\u003e:\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\u003eIn chrome_content_utility_cline.cc(299)\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/utility/chrome_content_utility_client.cc?annotate\u003d101911\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/chrome/utility/chrome_content_utility_client.cc?annotate\u003d101911\u003c/a\u003e\u003c/div\u003e\r\n\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\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e299 \u003cspan style\u003d\"color:rgb(0,0,136)\"\u003eint\u003c/span\u003e screen_dpi \u003d GetDeviceCaps\u003cspan style\u003d\"background-color:rgb(136,255,184);font-weight:bold;background-repeat:initial initial\"\u003e(GetDC(NULL)\u003c/span\u003e, LOGPIXELSX);\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e300 xform.eM11 \u003d xform.eM22 \u003d\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e301 static_cast\u0026lt;\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003efloat\u003c/span\u003e\u0026gt;(screen_dpi) / static_cast\u0026lt;\u003cspan style\u003d\"color:rgb(0,0,136)\"\u003efloat\u003c/span\u003e\u0026gt;(render_dpi);\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\u003c/div\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Play-Enhanced-Metafile-Record-More-Than-Once\" /\u003ePlay Enhanced Metafile Record More Than Once\u003c/h3\u003e\r\n\u003cdiv\u003eOops, some devices don't support alpha blending. We should do alpha blending by ourselves by using bitmap DC (\u003ca href\u003d\"http://crbug.com/98523\"\u003ehttp://crbug.com/98523\u003c/a\u003e)\u003c/div\u003e\r\n\u003cdiv\u003eSince, metafile records having GDI object creation command and stores into \u003ci\u003elpHandleTable\u003c/i\u003e of second parameter of \u003cb\u003eEnhMetaFileProc\u003c/b\u003e.\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\u003eIn crhome/renderer/print_web_view_helper_win.cc(40-69)\u003c/div\u003e\r\n\u003cdiv\u003e\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/print_web_view_helper_win.cc?annotate\u003d103082\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/chrome/renderer/print_web_view_helper_win.cc?annotate\u003d103082\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-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e40 \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// Play this command to the bitmap DC.\r\n\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e41 \u003cspan style\u003d\"background-color:rgb(136,255,184);font-weight:bold;background-repeat:initial initial\"\u003ePlayEnhMetaFileRecord\u003c/span\u003e(*bitmap_dc, handle_table, record, num_objects);\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e ...\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e68 \u003cspan style\u003d\"color:rgb(136,0,0)\"\u003e// Play this command to the metafile DC.\r\n\u003c/span\u003e\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003cdiv\u003e\u003cspan style\u003d\"font-family:monospace;line-height:16px;font-size:medium\"\u003e\r\n\u003cpre style\u003d\"margin-top:0px;margin-right:0px;margin-bottom:0px;margin-left:0px\"\u003e\u003cspan style\u003d\"display:block\"\u003e69 \u003cspan style\u003d\"background-color:rgb(136,255,184);font-weight:bold;background-repeat:initial initial\"\u003ePlayEnhMetaFileRecord\u003c/span\u003e(dc, handle_table, record, num_objects);\u003c/span\u003e\u003c/pre\u003e\r\n\u003c/span\u003e\u003c/div\u003e\r\n\u003c/blockquote\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\u003cul\u003e\u003cli\u003eGdIQueryTable\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eExplanation of GDI handle table\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://www.fileinview.com/chms/Windows%20Graphics%20Programming%20Win32%20GDI%20and%20DirectDraw/Win32GDI/32.htm\" rel\u003d\"nofollow\"\u003ehttp://www.fileinview.com/chms/Windows%20Graphics%20Programming%20Win32%20GDI%20and%20DirectDraw/Win32GDI/32.htm\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eImplementation of GDIQueryTable in \u003ca href\u003d\"http://www.reactos.org\" rel\u003d\"nofollow\"\u003eReactOS\u003c/a\u003e\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://doxygen.reactos.org/d9/db3/dll_2win32_2gdi32_2misc_2misc_8c_a4086f8e85c3c92a3c6d518ef5bf8a690.html\" rel\u003d\"nofollow\"\u003ehttp://doxygen.reactos.org/d9/db3/dll_2win32_2gdi32_2misc_2misc_8c_a4086f8e85c3c92a3c6d518ef5bf8a690.html\u003c/a\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eWinXP/32bit returns 0x00410000.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003eProcess Environment Block (PEB)\u003c/li\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://en.wikipedia.org/wiki/Win32_Thread_Information_Block\" rel\u003d\"nofollow\"\u003ehttp://en.wikipedia.org/wiki/Win32_Thread_Information_Block\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html\" rel\u003d\"nofollow\"\u003ehttp://undocumented.ntinternals.net/UserMode/Undocumented%20Functions/NT%20Objects/Thread/TEB.html\u003c/a\u003e\u003c/li\u003e\u003cli\u003ereinterpret_cast\u0026lt;PEB*\u0026gt;(__readfsdword(0x30))-\u0026gt;GdiSharedHandleTable (PEB+0x94)\u003c/li\u003e\u003c/ul\u003e\u003cli\u003eGDI Object Handle Encoding\u003c/li\u003e\u003cul\u003e\u003cli\u003e[0:15] Index\u003c/li\u003e\u003cli\u003e[16:22] Object Type (1\u003dDC, 4\u003dRegion, 5\u003dBitmap, 8\u003dPallete, A\u003dFont, 10\u003dBrush, 21\u003dEnhMF, 30\u003dPen, 50\u003dExtPen)\u003c/li\u003e\u003cli\u003e[23:23] Stock Object\u003c/li\u003e\u003cli\u003e[24:31] Unknown\u003c/li\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/2433140667124192106"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/leak-gdi-object-in-windows"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2176953649030396317"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2176953649030396317"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2176953649030396317"}],"author":[{"name":{"$t":"Yoshifumi Inoue"},"email":{"$t":"yosin@chromium.org"}}],"sites$pageName":{"$t":"leak-gdi-object-in-windows"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/540427986363944200"},"published":{"$t":"2011-09-26T09:19:14.377Z"},"updated":{"$t":"2011-09-26T09:25:10.924Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-26T09:25:10.914Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"imeomni.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/540427986363944200"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/28438494237460916"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/omnibox-ime-coordination/imeomni.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/540427986363944200"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/540427986363944200"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/540427986363944200"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/540427986363944200"}],"author":[{"name":{"$t":"Matt Falkenhagen"},"email":{"$t":"falken@chromium.org"}}],"sites$revision":{"$t":"2"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2689624011374841933"},"published":{"$t":"2010-01-06T14:44:22.699Z"},"updated":{"$t":"2011-09-23T16:15:10.098Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-02-02T20:54:04.893Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"fullscreen-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 style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cdiv style\u003d\"margin-top:15px;margin-right:auto;margin-bottom:25px;margin-left:auto;padding-top:40px;padding-right:50px;padding-bottom:40px;padding-left:50px;font-family:Verdana;font-size:12pt;background-color:rgb(255,255,255);color:rgb(0,0,0);min-height:1100px;line-height:normal;border-top-width:1px;border-top-style:solid;border-top-color:rgb(204,204,204);border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);border-right-width:2px;border-right-style:solid;border-right-color:rgb(187,187,187);border-bottom-width:2px;border-bottom-style:solid;border-bottom-color:rgb(187,187,187);width:648px!important\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:left\"\u003e\u200b\u003cspan style\u003d\"font-style:normal;vertical-align:baseline\"\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont size\u003d\"3\"\u003e\u003cb\u003eFullscreen in Mac Chrome (draft)\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-style:normal;vertical-align:baseline\"\u003e\u003cfont color\u003d\"#000000\"\u003e\u003cfont\u003e\u003cspan style\u003d\"background-color:rgb(255,255,255)\"\u003e\u003cfont size\u003d\"3\"\u003eThe decision is to support a version of fullscreen that serves as both \"presentation mode\" and \"maximized mode\". We will support tab switching, window switching, and have a floating slide-down tab strip / toolbar / omnibox / bookmark bar to aid in navigation. Glen and Cole have tentatively approved this for the Mac. There are no current plans to build a floating bar for Windows/Linux. The rationale is that no space-efficient \"maximized mode\" is available on the Mac, since the menu bar is always visible outside of fullscreen mode; such a mode is desirable for use on computers with small screens, in particular, on notebooks.\u003c/font\u003e\u003c/span\u003e\u003c/font\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eFullscreen mode features:\u003c/font\u003e\u003c/div\u003e\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eNormally, as on other platforms, only the web contents will be displayed.\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eWhen the mouse is moved to the top of the screen and left there for longer than an instant, the menu bar and also a floating bar (with the normal set of \"bar\" controls, including a tab strip) will slide down. See DVD Player for a comparable UI but note that its implementation is slightly flawed since there's no delay in its slide down. This floating bar will remain visible while the mouse remains over it (or, alternatively, will only be hidden when the mouse leaves it for long enough).\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eSome other operations, such as Cmd-L, should also cause the floating bar to appear.\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eSwitching and re-ordering tabs will be fully supported. Tearing off tabs will be inhibited, as will dropping tabs in from other windows. (This is for simplicity, and may be reconsidered later.)\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eMost operations will be supported, including:\u003c/font\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003ecreating new tabs (including download and history tabs)\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003ecreating new windows (which will pop up in front; see below)\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003epinning tabs\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eaccessing the tab context menu\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eetc.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eWe should allow windows to pop in front, since web pages frequently use popup windows. Thus one can switch to other windows, including normal (non-fullscreen) windows. More specifically:\u003c/span\u003e\u003c/li\u003e\u003cul\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ez-order will be handled \"as usual\", so that when active a fullscreen window will usually be on top\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ethe user has the opportunity to activate other windows, which will then appear over the fullscreen window\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003epopup windows should also pop up over the fullscreen window\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eif there are other windows visible over a fullscreen window and then the user re-activates that fullscreen window, that window will move to the top of the z-order (i.e., show in front, hiding all other windows)\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eMinimize should be supported, though it will take the window out of fullscreen mode. Zoom should be disabled.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eThe download shelf will appear as normal. This is the same as on other platforms.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eApplication and popup windows may also be made fullscreen.\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eDialog-opening operations should also be supported, though there remains the question of from where sheets should hang.\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eUI elements which appear as part of the web content area, such as infobars and the NTP bookmark bar, will continue to appear as such. That is, they will be visible even when the floating bar is not visible, and the floating bar will slide down over them.\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eIn fullscreen mode, Chrome should interact with the system in the way other applications do when they are in fullscreen mode:\u003c/font\u003e\u003c/li\u003e\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eSpaces will be allowed and a fullscreen window will appear to take one space.\u003c/font\u003e\u003c/li\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eExposé will be allowed and fullscreen windows will be part of the exposed windows.\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eQuirks and limitations:\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cspan style\u003d\"font-size:16px\"\u003e\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eCmd-space for Spotlight doesn't work when the menu bar is hidden (general problem in OS X).\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cspan style\u003d\"font-size:16px\"\u003e\u003cdiv style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cfont size\u003d\"3\"\u003eOpen questions and issues:\u003c/font\u003e\u003c/div\u003e\u003cul style\u003d\"margin-top:0px;margin-bottom:0px\"\u003e\u003cli style\u003d\"margin-top:0px;margin-bottom:0px;text-align:justify\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eThis space is intentionally left nonblank.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003eImplementation notes:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:verdana,sans-serif;font-size:medium;border-collapse:collapse\"\u003eit'd be a good idea to make some sort of \"FullscreenController\" which can be tied to (and owned by) the BWC, just to make things cleaner\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003efor the stuff requiring delays, we can probably use -performSelector:afterDelay:\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ewe need to check see if anyone registers for notifications from the window\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ethe controller will also have to handle keeping the floating bar showing when things in the bar have focus\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ebe careful when changing the view hierarchy, since views often assume that they're the subview of something fixed\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003e\u003cfont face\u003d\"verdana, sans-serif\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003ehaving to change the view hierarchy significantly (at least the bookmark bar and the tabstrip have to move, even if the other things are permanently in a \"BarView\") reduces the benefit of a cleaner model.\u003c/span\u003e\u003c/font\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/span\u003e\u003c/span\u003e\u003c/div\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/fullscreen-mac"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2689624011374841933"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2689624011374841933"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2689624011374841933"}],"author":[{"name":{"$t":"Viet-Trung Luu"},"email":{"$t":"viettrungluu@chromium.org"}}],"sites$pageName":{"$t":"fullscreen-mac"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8821355452597583864"},"published":{"$t":"2011-06-27T22:52:47.385Z"},"updated":{"$t":"2011-09-21T17:43:04.552Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-27T22:52:47.385Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"screenshot-chromeframe.jpeg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8821355452597583864"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6874058806991841375"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/chrome-frame-getting-started/screenshot-chromeframe.jpeg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8821355452597583864"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8821355452597583864"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8821355452597583864"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8821355452597583864"}],"author":[{"name":{"$t":"Paul Irish"},"email":{"$t":"paulirish@chromium.org"}}],"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6318437990028315346"},"published":{"$t":"2011-09-16T21:22:33.221Z"},"updated":{"$t":"2011-09-16T21:26:13.177Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-16T21:26:13.177Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"TSC resynchronization"},"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\u003ch1 dir\u003d\"ltr\" style\u003d\"font-size:medium;text-align:justify;margin-top:0pt;margin-bottom:0pt\"\u003e\u003ca name\u003d\"TOC-Sergiu-Iordache---sergiu-chromium.org-sergiu.iordache-gmail.com\" /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;font-weight:normal;white-space:pre-wrap\"\u003eSergiu Iordache - sergiu@chromium.org / sergiu.iordache@gmail.com\u003c/span\u003e\u003c/h1\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\"\u003ewith the help of Terry Lambert - tlambert@chromium.org\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-1.-Introduction-goal\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003e1. Introduction \u0026amp; goal\u003c/span\u003e\u003c/h2\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\"\u003eThis document describes the work done in order to enable TSC as a clocksource on Intel Chromebooks (affects Mario, Alex and ZGB as they have constant TSC).\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-2.-Background\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003e2. Background\u003c/span\u003e\u003c/h2\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\"\u003eThe Linux kernel uses different time sources. The most interesting are the HPET (High Precision Event Timer) and the TSC (Time Stamp Counter).\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eThe TSC is the preferred clocksource between the two counters, as it is the fastest one, however it can only be used if it is stable. Currently there are 4 types of TSC present:\u003c/span\u003e\u003col style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eConstant. Constant TSC means that the TSC does not change with CPU frequency changes, however it does change on C state transitions.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eInvariant. As described in the Intel manual: “The invariant TSC will run at a constant rate in all ACPI P-, C- and T-states”\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eNon-stop. The Non-stop TSC has the properties of both Constant and Invariant TSC.\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eNone of the above. The TSC changes with the C, P and S state transitions.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\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\"\u003eBy looking into the flags entry in \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e/proc/cpuinfo\u003c/span\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\"\u003e we can determine what type of TSC the current processor has (possible values we check for are \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003econstant_tsc\u003c/span\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\"\u003e, \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003enonstop_tsc\u003c/span\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\"\u003e)\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eThe constant TSC is the type of TSC currently present on our Chromebooks (future Chromebooks may have non-stop TSC). Therefore the TSC stops during C-state transitions and must be resynchronized in order to track time again.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ca href\u003d\"https://lkml.org/lkml/2008/9/25/451\" style\u003d\"font-size:medium;font-family:Times New Roman\" rel\u003d\"nofollow\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,153);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003eA patch\u003c/span\u003e\u003c/a\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\"\u003e written by Michael Davidson (md@google.com) currently exists which enables TSC resynchronization for userspace uses on AMD architectures. In that patch the TSC gets synchronized only for userspace calls. \u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-3.-My-work\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003e3. My work\u003c/span\u003e\u003c/h2\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\"\u003eAlthough the patch by md@ does a lot of the heavy work, it can’t be applied cleanly on our configuration for 2 reasons:\u003c/span\u003e\u003col style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003cli style\u003d\"list-style-type:decimal;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 was built for 64 bit architectures;\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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 was built solely for user-space users of the TSC (the clock source would still be set to something else).\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eMy work to date updates the patch so that it can be used on our architecture, by modifying the code to work on 32 bit and making the necessary changes so that the TSC is used as a kernel clock source.\u003c/span\u003e\u003cbr /\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\"\u003eI’ve also managed to improve synchronize the TSCs between the CPUs within 300 cycles of each other.\u003c/span\u003e\u003cbr /\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\"\u003eThe current results and limitations are:\u003c/span\u003e\u003cul style\u003d\"font-size:medium;font-family:Times New Roman\"\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\"\u003eThe TSC on CPU 0 initially gets synchronized to the HPET.\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\"\u003eThe TSC is synchronized across CPUs as they are brought up (relative to CPU 0), resulting in a difference of less than 300 cycles between the TSC value on each of the CPUs;\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\"\u003eThe TSC is set as the main clock source; The drift requirements had to be relaxed in order for this to work from not permitting any drift to permitting a drift of a few hundred cycles.\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\"\u003eThe TSC syncs using the HPET on transitions from C0 to C3+ (The Linux kernel groups all C-state larger than C3 into C3)  ;\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\"\u003eThe TSC can be set to periodically resync (by default every 100ms) to the HPET.\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eThe current problem is that we’re the synchronization induces a warp of a few thousand cycles, which is unacceptable. I’ve been working very hard with Terry during the last week of my internship to make this go away and apparently the scaling factor is one of the causes, along with the way the TSC gets updated from the HPET. However, I am still working to find a complete solution to this problem.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-4.-Benchmarks\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003e4. Benchmarks\u003c/span\u003e\u003c/h2\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\"\u003eAlthough using the TSC as a clocksource all the time is not completely implemented, I was able to benchmark its use by ignoring C-state transitions(by keeping the power adapter plugged while testing). While benchmarking the TSC as a clock source, 2 main aspects were examined:\u003c/span\u003e\u003col style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eboot time;\u003c/span\u003e\u003c/li\u003e\u003cli style\u003d\"list-style-type:decimal;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\"\u003eimprovements to \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003egettimeofday\u003c/span\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\"\u003e and \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003eclock_gettime\u003c/span\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\"\u003e.\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-4.1.-Boot-time\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003e4.1. Boot time\u003c/span\u003e\u003c/h3\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-family:Times New Roman;font-size:medium\"\u003e\u003cimg height\u003d\"371px;\" src\u003d\"https://lh4.googleusercontent.com/goxMnnDRXuu_j_4aHBRP_B4aOPiwFUWKYF_EbCUJq4xldKLH0_ro8VRt0SeMlbYz6MOogYrk-e424V9Cvx3Md1oHS-b9y3qUYd3Wms1Xi0i5ZH27tz8\" style\u003d\"display:inline;float:right;margin-top:5px;margin-right:10px;margin-bottom:5px;margin-left:10px\" width\u003d\"600px;\" /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul style\u003d\"font-size:medium;font-family:Times New Roman\" /\u003e\u003c/div\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\"\u003eBoot time was measured using the bootperf autotests. The setup was the following:\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003ex86-alex overlay\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\"\u003eTop of the tree on Monday, 08/26/2011 for HPET\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\"\u003eThe same + TSC patch for TSC\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\"\u003e3 sets of 10 runs for each\u003c/span\u003e\u003c/li\u003e\u003c/ul\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\"\u003eThe results are presented on the right;\u003c/span\u003e\u003cbr /\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\"\u003eThe boot time with the TSC counter is just a little bit slower on these 30 runs, with an average of 5.77 for the TSC version versus 5.73 for the HPET one. This is explicable as the extra initialization (there is also an extra calibration loop for a few ms) adds time which might cancel any improvements.\u003c/span\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-4.2.-gettimeofday-benchmark\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003e4.2. \u003c/span\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Courier New;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\"\u003egettimeofday\u003c/span\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003e benchmark\u003c/span\u003e\u003c/h3\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\"\u003eThe efficiency of \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003egettimeofday\u003c/span\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\"\u003e was measured by doing a simple benchmark, calling \u003c/span\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Courier New;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003egettimeofday \u003c/span\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\"\u003efor 100.000.000 times. The benchmark was run on the same Alex using a HPET and a TSC clocksource and the results were:\u003c/span\u003e\u003cul style\u003d\"font-size:medium;font-family:Times New Roman\"\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\"\u003eHPET: 140 s\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\"\u003eTSC: 46 s\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003cbr /\u003e\u003cbr /\u003e\u003ch3 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-4.3.-Number-of-calls-to-gettimeofday\" /\u003e\u003cspan style\u003d\"font-size:14pt;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\"\u003e4.3. Number of calls to \u003c/span\u003e\u003cspan style\u003d\"font-size:14pt;font-family:Courier New;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\"\u003egettimeofday\u003c/span\u003e\u003c/h3\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(34,34,34);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003ePhilip Guo, another intern, created a strace++ tool which counts system calls. He used it to run Chrome on ChromeOS and get the number of times gettimeofday gets called. On his run of Chrome with a 90 second YouTube video playing it got called 18195 times. These calls, according to my benchmark would take 0.0254 seconds using the HPET and 0.008 seconds using the TSC (which means that 0.017 seconds were saved during a 90 second period, or just 0.01 % improvement). It would be interesting to see what happens for non-optimized flash websites. However real benchmarks would need to be run after the synchronization works completely.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-size:medium;font-family:Times New Roman\"\u003e\u003ca name\u003d\"TOC-5.-Future-work\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003e5. Future work\u003c/span\u003e\u003c/h2\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\"\u003eHere are the things that still need to be done after my internship is over:\u003c/span\u003e\u003cul style\u003d\"font-size:medium;font-family:Times New Roman\"\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\"\u003eFixing the TSC resync such that it works. Terry suggested the following steps:\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\"\u003eMaking the HPET to TSC routine that works when SMIs happen.\u003c/span\u003e\u003c/li\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\"\u003eFinding out the cost of the HPET read (keeps working when SMIs happen)\u003c/span\u003e\u003c/li\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\"\u003eWait for the HPET clock to tick before syncing\u003c/span\u003e\u003c/li\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\"\u003eSet the TSC to the corresponding value + cost of HPET\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\"\u003eFormally verify that the precision of the clock source is preserved;\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\"\u003eTerry suggested syncing the value of the TSC with the real time from the epoch so that you would only need to apply a scale to it and not an offset -\u0026gt; you could move it to user space\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/8281191106998714061"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/tsc-resynchronization"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6318437990028315346"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6318437990028315346"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6318437990028315346"}],"author":[{"name":{"$t":"Sergiu Iordache"},"email":{"$t":"sergiu@chromium.org"}}],"sites$pageName":{"$t":"tsc-resynchronization"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1676947942036234514"},"published":{"$t":"2011-09-13T15:44:10.505Z"},"updated":{"$t":"2011-09-13T15:44:10.519Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-13T15:44:10.505Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"GSM PIN code types.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1676947942036234514"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3966777660170060486"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/how-tos-and-troubleshooting/get-a-3g-modem-running/GSM%20PIN%20code%20types.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1676947942036234514"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1676947942036234514"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1676947942036234514"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1676947942036234514"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5225790895202477252"},"published":{"$t":"2011-09-08T18:11:43.872Z"},"updated":{"$t":"2011-09-08T18:11:43.882Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-08T18:11:43.872Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"comp2_200x146.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5225790895202477252"},"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":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/comp2_200x146.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5225790895202477252"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5225790895202477252"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5225790895202477252"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5225790895202477252"}],"author":[{"name":{"$t":"David Parker"},"email":{"$t":"dparker@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6337986082370344341"},"published":{"$t":"2011-09-08T16:25:02.844Z"},"updated":{"$t":"2011-09-08T16:25:02.854Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-08T16:25:02.844Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"pprof.renderer.espn.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6337986082370344341"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2587424355187235564"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/out-of-memory-handling/pprof.renderer.espn.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6337986082370344341"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6337986082370344341"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6337986082370344341"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6337986082370344341"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5443733963859904600"},"published":{"$t":"2011-09-08T16:24:53.832Z"},"updated":{"$t":"2011-09-08T16:24:53.839Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-08T16:24:53.832Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"pprof.renderer.gmail.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5443733963859904600"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2587424355187235564"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/out-of-memory-handling/pprof.renderer.gmail.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5443733963859904600"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5443733963859904600"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5443733963859904600"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5443733963859904600"}],"author":[{"name":{"$t":"James Cook"},"email":{"$t":"jamescook@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1146471680907746110"},"published":{"$t":"2011-09-07T19:47:24.598Z"},"updated":{"$t":"2011-09-07T19:47:24.612Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-07T19:47:24.598Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"VerifiedBootDataStructures (1).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1146471680907746110"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9075125316842337239"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/verified-boot-data-structures/VerifiedBootDataStructures%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/1146471680907746110"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1146471680907746110"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1146471680907746110"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1146471680907746110"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"Wil7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6504201069804389510"},"published":{"$t":"2011-04-27T16:26:32.542Z"},"updated":{"$t":"2011-09-01T21:03:35.318Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-09-01T21:03:35.317Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"External Resource Directory"},"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\u003cb\u003e\u003ci\u003e\u003cbr /\u003e\u003c/i\u003e\u003c/b\u003e\u003c/div\u003eThis page provides a directory of useful resources related or relevant to the Google Native Client project. Keeping this page up-to-date is hard! If you find bugs or would like to suggest additions please contact native-client-discuss@googlegroups.com.\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eOpen-Source Projects\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThese projects have active Native Client support or porting efforts.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eMono (\u003ca href\u003d\"http://www.mono-project.com/\" rel\u003d\"nofollow\"\u003ehttp://www.mono-project.com\u003c/a\u003e), a cross-platform, open source .NET development framework.\u003c/li\u003e\u003cli\u003enaclports (\u003ca href\u003d\"http://code.google.com/p/naclports\"\u003ehttp://code.google.com/p/naclports\u003c/a\u003e): A repository of example programs and library patches. Includes libSDL, Mesa, OpenSceneGraph, ImageMagick, cairo, boost, libvorbis and others.\u003c/li\u003e\u003cli\u003eNaTcl (\u003cspan style\u003d\"border-collapse:collapse;font-family:arial,sans-serif\"\u003e\u003ca href\u003d\"http://wiki.tcl.tk/28211\" style\u003d\"color:rgb(28,81,168);outline-style:none;outline-width:initial;outline-color:initial\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://wiki.tcl.tk/28211\u003c/a\u003e\u003c/span\u003e): A native client port of the popular TCL programming language.\u003c/li\u003e\u003cli\u003eOCaml: \u003ca href\u003d\"http://code.google.com/p/nacl-ocaml/\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\"\u003ehttp://code.google.com/p/nacl-ocaml/\u003c/a\u003e, a compiler that converts Objective Caml source code in to Native Client compliant machine code.\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse;font-family:arial,sans-serif\"\u003eOne Laptop Per Child Sugar/GTK on Native Cilent: See\u003c/span\u003e\u003cspan style\u003d\"border-collapse:collapse;font-family:arial,sans-serif\"\u003e \u003ca href\u003d\"http://cananian.livejournal.com/tag/nativeclient\" style\u003d\"color:rgb(28,81,168);outline-style:none;outline-width:initial;outline-color:initial\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://cananian.livejournal.com/tag/nativeclient\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"border-collapse:collapse;font-family:arial,sans-serif\"\u003e\u003ca href\u003d\"http://cananian.livejournal.com/tag/nativeclient\" style\u003d\"color:rgb(28,81,168);outline-style:none;outline-width:initial;outline-color:initial\" target\u003d\"_blank\" rel\u003d\"nofollow\" /\u003e\u003c/span\u003eQt (\u003ca href\u003d\"http://developer.qt.nokia.com/wiki/Qt_for_Google_Native_Client\" rel\u003d\"nofollow\"\u003ehttp://developer.qt.nokia.com/wiki/Qt_for_Google_Native_Client\u003c/a\u003e). A port of the popular application infrastructure to Native Client.\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eWesnoth on Native Client: \u003ca href\u003d\"https://github.com/eugenis/wesnoth-nacl-build\" rel\u003d\"nofollow\"\u003ehttps://github.com/eugenis/wesnoth-nacl-build\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003ehttp://nacl-quake.appspot.com\u003c/span\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eMailing Lists:\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003e\u003ca href\u003d\"http://groups.google.com/group/native-client-discuss\"\u003enative-client-discuss@googlegroups.com\u003c/a\u003e: General email discussions about Native Client.\u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://groups.google.com/group/native-client-announce\"\u003enative-client-announce@googlegroups.com\u003c/a\u003e: Announcements about Native Client from Google. \u003c/li\u003e\u003cli\u003e\u003ca href\u003d\"http://groups.google.com/group/native-client-reviews\"\u003enative-client-reviews@googlegroups.com\u003c/a\u003e: Code review traffic for the \u003ca href\u003d\"http://code.google.com/p/nativeclient\"\u003eNative Client\u003c/a\u003e and \u003ca href\u003d\"http://code.google.com/p/nativeclient-sdk\"\u003eNative Client SDK\u003c/a\u003e projects. \u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv style\u003d\"border-collapse:collapse;font-family:arial,sans-serif;font-weight:bold\"\u003eOther Products and Projects\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli style\u003d\"font-weight:normal\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eThe Unity Game Engine has been ported to Native Client: \u003ca href\u003d\"http://unity3d.com/\" style\u003d\"color:rgb(0,102,204);outline-style:none;outline-width:initial;outline-color:initial\" rel\u003d\"nofollow\"\u003ehttp://unity3d.com\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003eGoogle Excacycle uses Native Client to run scientific research computing jobs in Google datacenters.\u003c/font\u003e\u003cspan style\u003d\"font-family:arial,sans-serif\"\u003e \u003ca href\u003d\"http://googleresearch.blogspot.com/2011/04/1-billion-core-hours-of-computational.html\" rel\u003d\"nofollow\"\u003ehttp://googleresearch.blogspot.com/2011/04/1-billion-core-hours-of-computational.html\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003cli\u003eA (growing) collection of games that have been ported to Native Client: \u003ca href\u003d\"http://nacl-gallery.appspot.com/games\"\u003ehttp://nacl-gallery.appspot.com/games\u003c/a\u003e\u003c/li\u003e\u003cli\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003ehttp://www.naclbox.com\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eResearch Projects\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThis list is limited to external research projects that we know are using or working on Native Client. For a list of papers that cite Google Native Client publications see \u003ca href\u003d\"http://scholar.google.com\"\u003ehttp://scholar.google.com\u003c/a\u003e. For a list of Google publications on Native Client see \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/nativeclient/reference/research-papers\"\u003ethis page\u003c/a\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli style\u003d\"margin-left:15px;border-collapse:collapse;font-family:arial,sans-serif;font-weight:normal\"\u003eExtending Google's Native Client with Information Flow Control. \u003ca href\u003d\"http://forum.stanford.edu/events/andreabittauinfo.php\" style\u003d\"color:rgb(28,81,168)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://forum.stanford.edu/events/andreabittauinfo.php\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;border-collapse:collapse;font-family:arial,sans-serif;font-weight:normal\"\u003eGoNative: Safe Execution of Native Code. \u003ca href\u003d\"http://sos.cse.lehigh.edu/gonative/index.html\" style\u003d\"color:rgb(28,81,168)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://sos.cse.lehigh.edu/gonative/index.html\u003c/a\u003e\u003c/li\u003e\u003cli style\u003d\"margin-left:15px;border-collapse:collapse;font-family:arial,sans-serif;font-weight:normal\"\u003eFormal correctness proof for Native Client inner sandbox model. \u003ca href\u003d\"https://github.com/pilki/FPdNaCl\" style\u003d\"color:rgb(28,81,168)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttps://github.com/pilki/FPdNaCl\u003c/a\u003e (see also \u003ca href\u003d\"http://coq.inria.fr/\" style\u003d\"color:rgb(28,81,168)\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003ehttp://coq.inria.fr\u003c/a\u003e)\u003c/li\u003e\u003cli style\u003d\"margin-left:15px\"\u003e\u003cfont face\u003d\"arial, sans-serif\"\u003e\u003cspan style\u003d\"border-collapse:collapse\"\u003eLind: Secure Lightweight Cloud Computing: \u003ca href\u003d\"https://seattle.cs.washington.edu/wiki/Lind\" rel\u003d\"nofollow\"\u003ehttps://seattle.cs.washington.edu/wiki/Lind\u003c/a\u003e\u003c/span\u003e\u003c/font\u003e\u003c/li\u003e\u003c/ul\u003e\u003cdiv style\u003d\"border-collapse:collapse;font-family:arial,sans-serif;font-weight:bold\"\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/6566195967208808905"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/reference/external-resource-directory"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6504201069804389510"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6504201069804389510"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6504201069804389510"}],"author":[{}],"sites$pageName":{"$t":"external-resource-directory"},"sites$revision":{"$t":"13"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7585833746764352064"},"published":{"$t":"2010-01-25T22:38:08.804Z"},"updated":{"$t":"2011-08-30T18:02:56.791Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-30T18:02:56.791Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Multitouch"},"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-on sites-embed sites-embed-full-width\" style\u003d\"width:100%;\"\u003e\u003cdiv class\u003d\"sites-embed-content sites-embed-type-text\"\u003e\u003cdiv class\u003d\"sites-embed-content-textbox\"\u003e\u003chtml xmlns:jot\u003d\"http://www.google.com/ns/jotspot/srvtmpl/\"\u003e\u003cdiv dir\u003d\"ltr\"\u003e\u003cdiv style\u003d\"text-align:center;background-color:rgb(255,204,51)\"\u003e\u003cb\u003e\u003cspan style\u003d\"font-size:x-small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:center;background-color:rgb(255,204,51)\"\u003e\u003cb\u003eUI under development. Designs are subject to change.\u003c/b\u003e\u003c/div\u003e\u003cdiv style\u003d\"text-align:center;background-color:rgb(255,204,51)\"\u003e\u003cspan style\u003d\"font-size:x-small\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e \u003c/div\u003e\u003c/html\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\u003cdiv class\u003d\"sites-embed-align-right-wrapping-on\"\u003e\u003cdiv class\u003d\"sites-embed-border-off sites-embed\" style\u003d\"width:160px;\"\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-Trackpad-Multitouch-Indirect-manipulation-\"\u003e\u003cstrong\u003e1 \u003c/strong\u003eTrackpad Multitouch (Indirect manipulation)\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Gesture-Types\"\u003e\u003cstrong\u003e1.1 \u003c/strong\u003eGesture Types\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Proposed-behaviors\"\u003e\u003cstrong\u003e1.2 \u003c/strong\u003eProposed behaviors\u003c/a\u003e\u003col class\u003d\"goog-toc\"\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Main-view\"\u003e\u003cstrong\u003e1.2.1 \u003c/strong\u003eMain view\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Overview\"\u003e\u003cstrong\u003e1.2.2 \u003c/strong\u003eOverview\u003c/a\u003e\u003c/li\u003e\u003cli class\u003d\"goog-toc\"\u003e\u003ca href\u003d\"#TOC-Panels\"\u003e\u003cstrong\u003e1.2.3 \u003c/strong\u003ePanels\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-Full-Multitouch-Direct-manipulation-\"\u003e\u003cstrong\u003e2 \u003c/strong\u003eFull Multitouch (Direct manipulation)\u003c/a\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-Trackpad-Multitouch-Indirect-manipulation-\" /\u003eTrackpad Multitouch (Indirect manipulation)\u003c/h2\u003e\r\n\u003ch3\u003e\u003ca name\u003d\"TOC-Gesture-Types\" /\u003eGesture Types\u003c/h3\u003e\r\n\u003cdiv\u003e\u003cbr /\u003e\r\n\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 style\u003d\"display:block;text-align:left\"\u003e\r\n\u003cdiv style\u003d\"text-align:left;display:block\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\r\n\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/user-experience/multitouch/GesturesImages.png?attredirects\u003d0\" imageanchor\u003d\"1\"\u003e\u003cimg border\u003d\"0\" src\u003d\"https://sites.google.com/a/chromium.org/dev/_/rsrc/1264460290892/user-experience/multitouch/GesturesImages.png\" /\u003e\u003c/a\u003e\u003c/div\u003e\u003cbr /\u003e\u003c/div\u003e\r\n\u003cbr /\u003e\r\n\u003c/div\u003e\r\n\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/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\r\n\u003cdiv style\u003d\"display:block;text-align:left\"\u003e\r\n\u003cul\u003e\u003cli\u003e1 finger: traditional pointing\u003c/li\u003e\r\n\u003cli\u003e2 finger: traditional scrolling\u003c/li\u003e\r\n\u003cli\u003e3 finger horiz.: three fingers in a row (usually ring/middle/index)\u003c/li\u003e\r\n\u003cli\u003e4 finger horiz.: four fingers in a row (usually pinky/ring/middle/index) - may be hard to disambiguate horizontal swipes on small trackpads, so we will overlap many gestures with the three finger variants\u003c/li\u003e\r\n\u003cli\u003e1 finger edge: one finger moving in and out of the trackpad bounds\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eMay require hardware support.\u003c/li\u003e\r\n\u003cli\u003eVertical gestures may be problematic because of limited space.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e3 finger group: three fingers in a circle (usually thumb/middle/index [or ring])\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eDue to people resting their thumb on the trackpad, many of these gestures are problematic, particularly pinch and rotate gestures. Swipe gestures are generally pretty usable.\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e4 finger group: four fingers in a circle (usually thumb + ring/middle/index)\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eProblematic as above. Swipe gestures are acceptable.\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\u003ch3\u003e\u003ca name\u003d\"TOC-Proposed-behaviors\" /\u003eProposed behaviors\u003c/h3\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\u003ch4\u003e\u003ca name\u003d\"TOC-Main-view\" /\u003eMain view\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003eone finger \u003c/b\u003e— cursor\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003etwo\u003c/b\u003e fingers — content manipulation\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003eSites can override all two finger gestures passed to the content area\u003c/li\u003e\r\n\u003cli\u003ePinch - defaults to page zoom\u003c/li\u003e\r\n\u003cli\u003eRotate - defaults to nothing\u003c/li\u003e\r\n\u003cli\u003eTranslate - defaults to scroll\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers horizontal\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003etab switch\u003c/li\u003e\u003c/ul\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers up — into overview\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers down — focus panels\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\u003cfont color\u003d\"#999999\"\u003efour\u003c/font\u003e\u003c/b\u003e\u003cfont color\u003d\"#999999\"\u003e fingers up — into overview\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\u003cfont color\u003d\"#999999\"\u003efour\u003c/font\u003e\u003c/b\u003e\u003cfont color\u003d\"#999999\"\u003e fingers down — focus panels\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003efour\u003c/b\u003e fingers horizontal — window switching\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e finger group translate — back/forward or tab switch (reverse of horizontal's behavior)\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003e\u003cfont color\u003d\"#999999\"\u003ethree\u003c/font\u003e\u003c/b\u003e\u003cfont color\u003d\"#999999\"\u003e finger group rotate — problematic because of two finger with anchored thumb\u003c/font\u003e\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eone\u003c/b\u003e finger left/right edge in — back/forward\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eone\u003c/b\u003e finger left/right edge out — forward/back, or sidebar reveal\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eone\u003c/b\u003e finger top edge in — overview\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003eone\u003c/b\u003e finger bottom edge in — panels\u003c/li\u003e\u003c/ul\u003e\u003c/ul\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\u003ch4\u003e\u003ca name\u003d\"TOC-Overview\" /\u003eOverview\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003etwo\u003c/b\u003e fingers horizontal — switch tabs\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003etwo\u003c/b\u003e fingers up/down? — close tab\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers — switch windows\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003efour\u003c/b\u003e fingers — window switching\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers down — out of overview\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003efour\u003c/b\u003e fingers down — out of overview\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e or \u003cb\u003efour\u003c/b\u003e fingers up — logout\u003c/li\u003e\u003c/ul\u003e\u003c/ul\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\u003ch4\u003e\u003ca name\u003d\"TOC-Panels\" /\u003ePanels\u003c/h4\u003e\r\n\u003c/div\u003e\r\n\u003c/blockquote\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\r\n\u003cul\u003e\u003cli\u003e\u003cb\u003etwo\u003c/b\u003e fingers \u003d scroll current panel\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers horizontal \u003d switch panels\u003c/li\u003e\r\n\u003cli\u003e\u003cb\u003ethree\u003c/b\u003e fingers up \u003d back to main view\u003c/li\u003e\u003c/ul\u003e\u003c/ul\u003e\r\n\u003cdiv\u003e\r\n\u003ch2\u003e\u003ca name\u003d\"TOC-Full-Multitouch-Direct-manipulation-\" /\u003eFull Multitouch (Direct manipulation)\u003c/h2\u003e\r\n\u003cdiv\u003e\r\n\u003cul\u003e\u003cli\u003eAll content area gestures (two and one finger) passed directly to web pages\u003c/li\u003e\r\n\u003cli\u003eDefault behaviors for one and two finger gestures as above\u003c/li\u003e\r\n\u003cli\u003eWe may reserve the above 3/4 finger gestures for os needs:\u003c/li\u003e\r\n\u003cul\u003e\u003cli\u003ethree fingers — window movement/resizing\u003c/li\u003e\r\n\u003cli\u003efour fingers — overview\u003c/li\u003e\u003c/ul\u003e\u003c/ul\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/1708653132560092830"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/user-experience/multitouch"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7585833746764352064"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7585833746764352064"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7585833746764352064"}],"author":[{"email":{"$t":"alcor@google.com"}}],"sites$pageName":{"$t":"multitouch"},"sites$revision":{"$t":"4"}},{"gd$etag":"\"YDUpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4059072205302334882"},"published":{"$t":"2011-08-12T07:06:06.768Z"},"updated":{"$t":"2011-08-26T06:35:31.093Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-26T06:35:31.093Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"3D Tips and Best Practices"},"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\u003ch1 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Pepper-3D-on-Chrome-provides-a-secure-implementation-of-OpenGL-ES-2.0.-Here-are-some-tips-for-getting-maximum-performance.\" /\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;font-weight:normal;white-space:pre-wrap\"\u003ePepper 3D on Chrome provides a secure implementation of OpenGL ES 2.0. Here are some tips for getting maximum performance.\u003c/span\u003e\u003c/h1\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Don-t-update-indices\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eDon’t update indices\u003c/span\u003e\u003c/h2\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\"\u003eFor security all indices must be validated. If you change them we have to validate them again. Therefore structure your code so indices are not updated often.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Don-t-use-client-side-buffers\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eDon’t use client side buffers\u003c/span\u003e\u003c/h2\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\"\u003eIn OpenGL ES 2.0 you can use client side data with glVertexAttribPointer and glDrawElements. It’s REALLY SLOW! Don’t use them. Instead, whenever possible use VBOs (Vertex Buffer Objects). Side-note: Client side buffers have been removed from OpenGL 4.0.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Don-t-mix-vertex-data-with-index-data.\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eDon’t mix vertex data with index data.\u003c/span\u003e\u003c/h2\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\"\u003eActually this is off by default. In real OpenGL ES 2.0 you can create a single buffer and bind it to both GL_ARRAY_BUFFER and GL_ELEMENT_ARRAY_BUFFER. In Pepper 3D, by default, you can only bind buffers to 1 bind point.  There is the option to enable binding buffers to both points. Doing so requires expensive work so don’t do it.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-For-dynamic-textures-ie-video-or-dynamic-vertex-data-skinning-particles-consider-using-CHROMIUM_map_sub\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eFor dynamic textures (ie, video) or dynamic vertex data (skinning / particles) consider using CHROMIUM_map_sub\u003c/span\u003e\u003c/h2\u003e\u003ca href\u003d\"http://src.chromium.org/viewvc/chrome/trunk/src/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_map_sub.txt\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003cspan style\u003d\"font-size:11pt;font-family:Arial;color:rgb(0,0,153);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:underline;vertical-align:baseline;white-space:pre-wrap\"\u003ehttp://src.chromium.org/viewvc/chrome/trunk/src/gpu/GLES2/extensions/CHROMIUM/CHROMIUM_map_sub.txt\u003c/span\u003e\u003c/a\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Don-t-call-glGetXXX-or-glCheckXXX-during-rendering.\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eDon’t call glGetXXX or glCheckXXX during rendering. \u003c/span\u003e\u003c/h2\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\"\u003eCalling either of those stalls our multi-process pipeline. This is normal advice for OpenGL programs but is particularly important for 3D on Chrome. This includes glGetError – avoid calling it in release builds.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Make-sure-to-enable-Attrib-0.\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eMake sure to enable Attrib 0.\u003c/span\u003e\u003c/h2\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\"\u003eIn OpenGL you MUST enable Attrib 0. In OpenGL ES 2.0 you don’t have to enable Attrib 0. What that means is that in order to emulate OpenGL ES 2.0 on top of OpenGL we have to do some expensive work. \u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eIn practice most programs don’t have an issue here but just in case, the most obvious way this might bite you is if you bind your own locations and don’t start with 0.  Example: Imagine you have a vertex shader with 2 attributes “positions” and “normals”\u003c/span\u003e\u003cbr /\u003e\u003cbr /\u003e\u003c/div\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cspan style\u003d\"font-size:medium\"\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eglBindAttribLocation(program, “positions”, 1);\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/span\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cspan style\u003d\"font-size:11pt;color:rgb(0,0,0);background-color:transparent;font-style:normal;font-variant:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eglBindAttribLocation(program, “normals”, 2);\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cbr /\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\"\u003eThose 2 functions would make make your shader NOT use attrib 0 in which case we’d have to do some expensive work internally\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Minimize-the-use-of-glFlush-and-avoid-using-glFinish\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eMinimize the use of glFlush and avoid using glFinish\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cfont face\u003d\"Arial\" size\u003d\"3\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003eIt is generally good practice to minimize explicit calls to glFlush and avoid using glFinish. Particularly so on Native Client where they incur additional overhead.\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Avoid-reading-back-output-from-the-GPU-to-the-client\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eAvoid reading back output from the GPU to the client\u003c/span\u003e\u003c/h2\u003e\u003cdiv\u003e\u003cspan style\u003d\"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\"\u003e\u003cfont size\u003d\"3\"\u003eIn other words, don't call glReadPixels. This is slow.\r\n\r\n\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"background-color:transparent;vertical-align:baseline\"\u003e\u003cfont face\u003d\"Arial\" size\u003d\"5\" style\u003d\"white-space:pre-wrap\"\u003e\u003cb\u003eWhen benchmarking, avoid comparing results where one system is limited by vsync and another is not.\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Don-t-use-GL_FIXED\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eDon’t use GL_FIXED\u003c/span\u003e\u003c/h2\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’s not supported in OpenGL and so emulation for OpenGL ES 2.0 is slow. By default GL_FIXED support is turned off Pepper 3D. There is the option to turn it on. Don’t do it.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Use-a-smaller-plugin-and-let-CSS-scale-it.\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eUse a smaller plugin and let CSS scale it.\u003c/span\u003e\u003c/h2\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\"\u003eThe size your plugin renders and the size it displays in the page are set separately. CSS controls the size your plugin displays where as the width and height attribute of your \u0026lt;embed\u0026gt; element control the size your plugin renders.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Use-HTML-where-approriate\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eUse HTML where approriate\u003c/span\u003e\u003c/h2\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’re used to making native games you’re probably used to rendering everything yourself. The browser though can already render text and UI very well and it will composite that HTML with your plugin using all the standard HTML5 and CSS methods available. \u003c/span\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cfont size\u003d\"5\"\u003e\u003cb\u003eAvoid updating a small portion of a large buffer\u003c/b\u003e\u003c/font\u003e\u003c/span\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e \u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003eThis is especially an issue in Windows where we emulate OpenGL ES 2.0 on top of DirectX. In the current implementation, updating a portion of a buffer requires re-processing the entire buffer. In other words if you make a buffer (glBufferData) of 10000 bytes and then later call glSubBufferData to update just 3 of those bytes, all 10000 bytes will have to be re-converted. (Yea, I know, lame)\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\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\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003cfont face\u003d\"Arial\"\u003e\u003cspan style\u003d\"font-size:15px;white-space:pre-wrap\"\u003e2 suggestions:\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003col\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003eSeparate static vertex data from dynamic.\r\n\u003c/span\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003e\r\nIn other words, put your static data in 1 buffer and dynamic data in a different buffer. That way your static data won't have to be re-converted.\r\n\r\n\u003c/span\u003e\u003c/li\u003e\u003cli\u003e\u003cspan style\u003d\"font-family:Arial;font-size:15px;white-space:pre-wrap\"\u003eVolunteer to fix the perf issues \r\n\r\n\u003ca href\u003d\"http://angleproject.googlecode.com\"\u003ehttp://angleproject.googlecode.com\u003c/a\u003e\u003c/span\u003e\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv style\u003d\"background-color:transparent\"\u003e\u003ch1 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-General-OpenGL-advice\" /\u003e\u003cspan style\u003d\"font-size:24pt;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\"\u003eGeneral OpenGL advice\u003c/span\u003e\u003c/h1\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Interleaved-data-is-faster-to-render-than-non-interleaved\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eInterleaved data is faster to render than non-interleaved\u003c/span\u003e\u003c/h2\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\"\u003e3 buffers of [position,position,position], [normal,normal,normal], [texcoord,texcoord,texcoord] is slower than 1 buffer of [position,normal,texcoord,position,normal,texcoord,position,normal,texcoord].\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Separate-dynamic-data-from-static\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eSeparate dynamic data from static\u003c/span\u003e\u003c/h2\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\"\u003eAssume you have positions, normals and texcoords. Further assume you update positions every frame. It would be best to put positions in 1 buffer and normals + texcoords in a separate buffer. That way, you can call glBufferData or glBufferSubData on a smaller range of data.\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-glBindBuffer-is-expensive\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eglBindBuffer is expensive\u003c/span\u003e\u003c/h2\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\"\u003eConsider putting multiple meshes in a single buffer and using offsets (as long as the buffers are static, see above)\u003c/span\u003e\u003cbr /\u003e\u003ch2 dir\u003d\"ltr\" style\u003d\"font-family:Times;font-size:medium\"\u003e\u003ca name\u003d\"TOC-Check-your-extensions-and-max-GL-features\" /\u003e\u003cspan style\u003d\"font-size:18pt;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\"\u003eCheck your extensions and max GL features\u003c/span\u003e\u003c/h2\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\"\u003eNot every GPU supports every extension nor has the same amount of textures units, vertex attributes, etc. Make sure you check for the features you need.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eFor example, if you are using non power of 2 texture with mips make sure GL_OES_texture_npot exists. If you are using floating point textures make sure GL_OES_texture_float exists. If you are using DXT1, DXT3 or DXT5 texture make sure GL_ETC_texture_compression_dxt1, GL_CHROMIUM_texture_compression_dxt3 and GL_CHROMIUM_texture_compression_dxt5 exist.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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 are using textures in vertex shaders make sure glGetIntegerv(GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS, …) returns a value greater than 0.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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 are using more than 8 textures in a single shader make sure glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, …) returns a value greater than or equal to the number of simulatious textures you need.\u003c/span\u003e\u003cbr /\u003e\u003cbr /\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\"\u003eetc...\u003c/span\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/5548930097806777862"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/3d-tips-and-best-practices"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4059072205302334882"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4059072205302334882"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4059072205302334882"}],"author":[{"name":{"$t":"Gregg Tavares"},"email":{"$t":"gman@chromium.org"}}],"sites$pageName":{"$t":"3d-tips-and-best-practices"},"sites$revision":{"$t":"9"}},{"gd$etag":"\"YDspeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8495972604509497099"},"published":{"$t":"2011-08-22T19:29:37.719Z"},"updated":{"$t":"2011-08-24T21:15:03.579Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-24T21:15:03.579Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Service Processes"},"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 style\u003d\"font-size:20px;font-weight:bold\"\u003eOverview\u003c/span\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cp\u003eService processes (processes with --type\u003dservice) are child processes that are intended to possibly outlive the browser process that spawned them. They are currently used by the \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/developers/design-documents/google-cloud-print-proxy-design\"\u003ecloud print feature\u003c/a\u003e. Service processes can be set to start at login. They communicate with a browser via standard chromium IPC channels, but the way these channels is set up varies by platform.\u003c/p\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Start-At-Login\" /\u003eStart At Login\u003c/h2\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Windows\" /\u003eWindows\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\"\u003e\u003cdiv\u003eService processes are launched at login by adding them to the current users auto run key path in the registry.\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Linux\" /\u003eLinux\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\"\u003e\u003cdiv\u003eService processes are launched at login by adding an entry to the autostart file in \u003cfont face\u003d\"'courier new', monospace\"\u003e$\u003cspan style\u003d\"font-size:medium\"\u003eXDG_CONFIG_HOME\u003c/span\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:monospace;font-size:medium\"\u003e.\u003c/span\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-MacOS-X\" /\u003eMacOS X\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\"\u003e\u003cdiv\u003eService processes are launched at login by adding a property list (.plist) to \u003cfont face\u003d\"'courier new', monospace\"\u003e~/Library/LaunchAgents\u003c/font\u003e. This means that service processes on MacOS X are controlled by \u003ca href\u003d\"http://www.afp548.com/article.php?story\u003d20050620071558293\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003elaunchd\u003c/a\u003e. This has some interesting ramifications that are discussed below.\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-Process-Lifetime\" /\u003eProcess Lifetime\u003c/h2\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cdiv\u003eService processes continue to run as long as the service that they are providing is enabled and/or there is a browser process attached to them. Service processes are identified on the system by a unique identifier based on a service name, the user-data directory and the version of the service process supplying the service. If the user enables something that requires a service process (eg CloudPrint) the browser will launch the service process immediately, and set it up so that the service process will be started at login. On Windows and Linux, the service process is simply launched, while on Mac OS X the service process is started as a launchd job. Browser processes can force a service process to quit. On Windows and Linux this is performed by sending the equivalent of a SIGTERM to the service process. On MacOS X this is performed by telling launchd to remove the service process which in turn causes launchd to send the service process a SIGTERM. The relevant code is in ForceServiceProcessShutdown(...).\u003c/div\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003cp\u003e\u003cb\u003eMacOS X note: \u003c/b\u003eSince service processes are launched by launchd on MacOS X they will automatically be relaunched if they ever crash. The proper way to stop the service processes manually on MacOS X is to manipulate them using \u003ca href\u003d\"http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man1/launchctl.1.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003elaunchctl\u003c/a\u003e. Sending a SIGTERM directly to the child process without using launchctl will result in a job still being registered with launchd. Launching a service process manually on MacOS X is difficult as it requires a properly configured property list containing several entries.\u003c/p\u003e\u003c/blockquote\u003e\u003ch2\u003e\u003ca name\u003d\"TOC-IPC\" /\u003eIPC\u003c/h2\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Windows1\" /\u003eWindows\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\"\u003e\u003cdiv\u003eIPC is performed using a named pipe. The pipe name is based on the path to the user-data directory and the version of the browser/service creating the pipe.\u003c/div\u003e\u003c/blockquote\u003e\u003c/blockquote\u003e\u003cblockquote style\u003d\"margin:0 0 0 40px;border:none;padding:0px\"\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-Linux1\" /\u003eLinux\u003c/h3\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\u003eIPC is performed using unix domain sockets. The name of the socket is based on the path to the user-data directory and the version of the browser/service creating the sockets.\u003c/div\u003e\u003c/blockquote\u003e\u003ch3\u003e\u003ca name\u003d\"TOC-MacOS-X1\" /\u003eMacOS X\u003c/h3\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\u003eIPC is performed using unix domain sockets. The name of the socket is assigned to the browser by looking up an environment variable that is set by launchd. On the service process side, the IPC channel is created using the file descriptor that is passed to the service process when it checks in with launchd. More information on this can be found on the \u003ca href\u003d\"http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man5/launchd.plist.5.html\" target\u003d\"_blank\" rel\u003d\"nofollow\"\u003elaunchd man page\u003c/a\u003e. The name of the environment variable is based on the path to the user-data directory and the version of the browser/service creating the sockets.\u003c/div\u003e\u003c/blockquote\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/service-processes"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8495972604509497099"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7762381182101003415/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8495972604509497099"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8495972604509497099"}],"author":[{"email":{"$t":"dmaclach@chromium.org"}}],"sites$pageName":{"$t":"service-processes"},"sites$revision":{"$t":"7"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/9078363676681619967"},"published":{"$t":"2011-08-16T15:26:16.852Z"},"updated":{"$t":"2011-08-16T15:26:16.852Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-16T15:26:16.852Z"},"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/9078363676681619967"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9078363676681619967"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9078363676681619967"}],"author":[{"name":{"$t":"Sean Paul"},"email":{"$t":"seanpaul@chromium.org"}}],"sites$revision":{"$t":"1"},"gs$field":[{"index":"A","name":"Brand \u0026 Model Number","$t":"MSI Megabook VR201 (\"Model Nr. MS-1217\")"},{"index":"B","name":"Wifi","$t":"OK"},{"index":"C","name":"Ethernet","$t":"on"},{"index":"D","name":"Trackpad","$t":"on"},{"index":"E","name":"Suspend/Resume","$t":""},{"index":"F","name":"Comments \u0026 Caveats","$t":"Suspends but does not wake up anymore. It shuts down after trying to wake it up by pressing the power button. Sound is fine."},{"index":"G","name":"Contact","$t":""},{"index":"H","name":"Buy Link","$t":""}]},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6153760964853897537"},"published":{"$t":"2011-08-02T17:43:12.089Z"},"updated":{"$t":"2011-08-02T17:43:12.102Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-02T17:43:12.089Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chromium-request-anim-frame.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6153760964853897537"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-request-anim-frame.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6153760964853897537"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6153760964853897537"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6153760964853897537"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6153760964853897537"}],"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/4319161724746861534"},"published":{"$t":"2011-08-02T17:41:49.328Z"},"updated":{"$t":"2011-08-02T17:41:49.343Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-02T17:41:49.328Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chromium-composited-hw-rendering.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4319161724746861534"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-composited-hw-rendering.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4319161724746861534"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4319161724746861534"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4319161724746861534"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4319161724746861534"}],"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/7779628192301218042"},"published":{"$t":"2011-08-02T17:41:13.541Z"},"updated":{"$t":"2011-08-02T17:41:13.551Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-02T17:41:13.541Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chromium-composited-sw-rendering.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7779628192301218042"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-composited-sw-rendering.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7779628192301218042"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7779628192301218042"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7779628192301218042"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7779628192301218042"}],"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/8397847722032085472"},"published":{"$t":"2011-08-02T17:40:38.881Z"},"updated":{"$t":"2011-08-02T17:40:38.886Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-08-02T17:40:38.881Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chromium-non-composited-sw-rendering.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8397847722032085472"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1572149545117752769"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/rendering-architecture-diagrams/chromium-non-composited-sw-rendering.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8397847722032085472"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8397847722032085472"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8397847722032085472"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8397847722032085472"}],"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/9118326532672355334"},"published":{"$t":"2011-07-29T23:05:16.750Z"},"updated":{"$t":"2011-07-29T23:05:16.766Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-29T23:05:16.750Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromeOSFilesystemAutoupdate.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/9118326532672355334"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5062187655050566100"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/chromiumos-design-docs/filesystem-autoupdate/ChromeOSFilesystemAutoupdate.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/9118326532672355334"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9118326532672355334"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/9118326532672355334"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/9118326532672355334"}],"author":[{"name":{"$t":"Andrew de los Reyes"},"email":{"$t":"adlr@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8394018277321169007"},"published":{"$t":"2011-07-27T22:16:30.453Z"},"updated":{"$t":"2011-07-27T22:16:30.465Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-27T22:16:30.453Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"alex_reset.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8394018277321169007"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/alex_reset.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8394018277321169007"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8394018277321169007"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8394018277321169007"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8394018277321169007"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/39962618958524957"},"published":{"$t":"2010-12-08T19:36:01.400Z"},"updated":{"$t":"2011-07-12T22:20:50.773Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-12T22:20:50.773Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"DOMUI 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\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003eThis document contains a mini design doc for one way to approach testing of DOMUI pages.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont color\u003d\"#990000\" size\u003d\"4\"\u003ePLEASE See \u003ca href\u003d\"https://sites.google.com/a/chromium.org/dev/Home/domui-testing/webui-browser_tests\"\u003eWebUI browser_tests\u003c/a\u003e for details on current implementation.\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eObjective\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eImprove quality of DOMUI and find regressions early.\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eAllow unit testing of JS used for DOM UI.\u003c/li\u003e\u003cli\u003eAllow unit testing of HTML widgets used for DOM UI.\u003c/li\u003e\u003cli\u003eAllow testing end to end DOMUI\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003eProblem\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMore and more of the UI in Chrome and ChromeOS is built using DOMUI. DOMUI is the name of Chrome UI built using HTML, JS and CSS with the ability to comunicate to with the browser process using chrome.send calls. Example of UIs implemented using DOMUI consists of the New Tab Page, History, Downloads, Extensions, about:versions and many others. ChromeOS is also in the process of using DOMUI for menus.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTesting these UIs is \u003ca href\u003d\"http://www.google.com/codesearch/p?hl\u003den#OAMlx_jo-ck/src/chrome/browser/dom_ui/new_tab_ui_uitest.cc\u0026amp;q\u003dNewTabUITest%20NTPHasLoginName\u0026amp;exact_package\u003dchromium\u0026amp;sa\u003dN\u0026amp;cd\u003d1\u0026amp;ct\u003drc\u0026amp;l\u003d55\"\u003epossible today\u003c/a\u003e using \u003ca href\u003d\"http://www.google.com/codesearch/p?hl\u003den#OAMlx_jo-ck/src/chrome/test/ui/ui_test.h\u0026amp;q\u003d%22class%20UITest%22\u0026amp;exact_package\u003dchromium\u0026amp;sa\u003dN\u0026amp;cd\u003d1\u0026amp;ct\u003drc\u0026amp;l\u003d458\"\u003eUITest\u003c/a\u003e with DOM automation enabled. However, writing these test require generating strings of JavaScript code that is (using the automation provider) asynchronously evaluated in the browser tab and the result of that is asynchronously returned.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThere are 3 problems with this approach:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eSetting up the browser tab requires some C++ and a lot of waiting for the document to be ready.\u003c/li\u003e\u003cli\u003eA string representing the JavaScript needs to be generated.\u003c/li\u003e\u003cli\u003eThe evaluation is async making test harder to write and more flaky.\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003eRequirements\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eMake it easier to write tests by\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eAllowing writing the test in JavaScript. After all, we need to use JavaScript to interact with the UI so it is only natural to do the test with it. Also dynamic languages are very good for writing unit tests.\u003c/li\u003e\u003cli\u003eProvide a new test class that is specialized for writing tests for DOMUI. It would wrap up all of the boiler plate code and it should...\u003c/li\u003e\u003cli\u003eAllow any DOM UI to be tested by simply providing the URL of the page and...\u003c/li\u003e\u003cli\u003eProvide the URL or path to the test file and...\u003c/li\u003e\u003cli\u003eallow other utility js files to be injected\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003eIt might also be interesting to allow a blank page to be used and just inject all the js and css we care about. This could be useful for testing widgets in isolation.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eSolution\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eCreate a new test class similar to ExtensionBrowserTest but optimized for DOMUI. This class would have a RunDOMUITest (similar to RunExtensionTest) which would:\u003c/div\u003e\u003cdiv\u003e\u003col\u003e\u003cli\u003eOpen a tab and navigate to a URL.\u003c/li\u003e\u003cli\u003eInject one or more javascript files.\u003c/li\u003e\u003cli\u003eRun tests provided by the JavaScript files (ExtensionBrowerTest uses a global array of functions to run called test)\u003c/li\u003e\u003c/ol\u003e\u003c/div\u003e\u003cdiv\u003eThis is better than what we have now for a few reasons:\u003c/div\u003e\u003cdiv\u003e\u003cul\u003e\u003cli\u003eWe do not have to open a new browser for every single test. We can run multiple tests in the same web page.\u003c/li\u003e\u003cli\u003eWe can write the test in JS, reducing the work needed to write tests.\u003c/li\u003e\u003cli\u003eWe do not have to generate js code and evaluate it using the automation provider for every single test (these are async)\u003c/li\u003e\u003c/ul\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:large\"\u003eExample Use-cases\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe following is based on the same model as the ExtensionApiTest.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e.cc file\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eIN_PROC_BROWSER_TEST_F(DOMUITest, NewTabPage) {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  ASSERT_TRUE(RunDOMUITest(\"chrome://newtabpage\", path_to_js_test_file);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e}\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e.js file\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003evar assertEq \u003d chrome.test.assertEq;\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\"\u003evar tests \u003d [\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e  function testLogin() {\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    var loginSpan \u003d $(‘login-username’);\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003e    assertEq(loginSpan.textContent, ‘test@gmail.com’);\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];\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eTradeoffs\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis solution requires 2 (or more files) for every test. One for the C++ test function that bootstraps the javascript tests.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"4\"\u003eAlternatives\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe could probably do incremental improvements over UITest...\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe most similar thing today is Extension API tests. These are test end to end of the extension APIs and these use extension pages and\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eAnother option is to make all DOMUI extensions and just use \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/4852676552341181359"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/Home/domui-testing"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/39962618958524957"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/39962618958524957"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/39962618958524957"}],"author":[{"name":{"$t":"Erik Arvidsson"},"email":{"$t":"arv@chromium.org"}}],"sites$pageName":{"$t":"domui-testing"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3138853833154910738"},"published":{"$t":"2011-07-12T17:10:03.852Z"},"updated":{"$t":"2011-07-12T17:10:03.857Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-12T17:10:03.852Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"back.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3138853833154910738"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798767683952072355"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-ac700-chromebook/back.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3138853833154910738"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3138853833154910738"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3138853833154910738"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3138853833154910738"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8792235564652777987"},"published":{"$t":"2011-07-12T17:07:40.687Z"},"updated":{"$t":"2011-07-12T17:07:40.693Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-12T17:07:40.687Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"newback.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/8792235564652777987"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/798767683952072355"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/acer-ac700-chromebook/newback.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8792235564652777987"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792235564652777987"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8792235564652777987"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/8792235564652777987"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1882134489636645078"},"published":{"$t":"2011-07-05T22:09:38.063Z"},"updated":{"$t":"2011-07-05T22:09:38.073Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-07-05T22:09:38.063Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screenshot-about:gpu.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1882134489636645078"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/trace-event-profiling-tool/Screenshot-about:gpu.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1882134489636645078"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1882134489636645078"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1882134489636645078"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1882134489636645078"}],"author":[{"name":{"$t":"Vincent Scheib"},"email":{"$t":"scheib@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"WCl7JmA9\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7766900761436030193"},"published":{"$t":"2010-08-04T04:39:16.886Z"},"updated":{"$t":"2011-06-29T17:16:49.754Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-29T17:16:49.754Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"clang 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\u003cdiv\u003eRead the \u003ca href\u003d\"http://code.google.com/p/chromium/wiki/Clang\"\u003eGeneral Chromium/Clang wiki page\u003c/a\u003e first.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWe want to keep chromium buildable with clang. Clang warns about more things than gcc, so here are some things that need to be done even gcc doesn't complain about them:\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eNo const NSString*s\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eAll of Cocoa takes non-const NSObjects, and passing a \u003ccode\u003econst NSString *\u003c/code\u003e to a function that takes \u003ccode\u003eNSString *\u003c/code\u003e is a const violation. gcc doesn't complain about this, but clang intentionally does. constness is usually done via immutable base classes and mutable subclasses in Cocoa anyway, so getting rid of const isn't that bad. Also, we don't really have a choice. There is a good chance what you are actually after is \u003ccode\u003eNSString * const\u003c/code\u003e.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003e\u003cbr /\u003e\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eConverting between CFTypes and NSTypes\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eThe proper way to convert a CFType to a corresponding NSType is to use CFToNSCast.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\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#include \"base/mac/foundation_util.h\"\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont face\u003d\"'courier new', monospace\" size\u003d\"2\"\u003e.....\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cfont face\u003d\"'courier new', monospace\"\u003eNSString *ns_string \u003d base::mac::CFToNSCast(cf_string);\u003c/font\u003e\u003c/font\u003e\u003c/div\u003e\u003c/div\u003e\u003c/blockquote\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-family:Menlo\"\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cfont face\u003d\"arial, sans-serif\" size\u003d\"2\"\u003eCFToNSCast avoids any ugly double C++ casts that you may dream up, is clang safe, and only allows you to convert between properly toll-bridged types.\u003c/font\u003e\u003c/div\u003e\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-weight:bold\"\u003eAll properties are nonatomic\u003c/span\u003e\u003c/div\u003e\u003cdiv\u003enonatomic: Some of our classes have custom setters that are not \u003cfont color\u003d\"#38761d\"\u003e\u003ccode\u003e@synchronize\u003c/code\u003ed\u003c/font\u003e. If the \u003ccode\u003e@property\u003c/code\u003e for that is not non-atomic, then the interface claims that the method is synchronized but the implementation actually isn't. That's a bug. gcc happens not to complain about this, but clang does. Since we shouldn't need atomic properties anywhere, the simple rule is now to just make all properties nonatomic.\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/clang-mac"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7766900761436030193"},{"rel":"http://schemas.google.com/sites/2008#template","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7762381182101003415/2"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7766900761436030193"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7766900761436030193"}],"author":[{"name":{"$t":"Nico Weber"},"email":{"$t":"thakis@chromium.org"}}],"sites$pageName":{"$t":"clang-mac"},"sites$revision":{"$t":"11"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5244275940649138365"},"published":{"$t":"2011-06-24T01:22:37.124Z"},"updated":{"$t":"2011-06-24T01:22:37.131Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-24T01:22:37.124Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"csdservice.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/5244275940649138365"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/csdservice.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5244275940649138365"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5244275940649138365"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5244275940649138365"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/5244275940649138365"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6999621110342489305"},"published":{"$t":"2011-06-23T03:31:52.574Z"},"updated":{"$t":"2011-06-23T03:31:52.588Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-23T03:31:52.574Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"browse.details4.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6999621110342489305"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/browse.details4.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6999621110342489305"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6999621110342489305"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6999621110342489305"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6999621110342489305"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1529754047690441887"},"published":{"$t":"2011-06-23T01:05:08.626Z"},"updated":{"$t":"2011-06-23T01:05:08.634Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-23T01:05:08.626Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"browse.details3.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1529754047690441887"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/browse.details3.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1529754047690441887"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1529754047690441887"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1529754047690441887"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1529754047690441887"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3037494191999139735"},"published":{"$t":"2011-06-22T02:55:23.458Z"},"updated":{"$t":"2011-06-22T02:55:23.462Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-22T02:55:23.458Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"browse.details2.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3037494191999139735"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/browse.details2.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3037494191999139735"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3037494191999139735"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3037494191999139735"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3037494191999139735"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1303184962335459169"},"published":{"$t":"2011-06-22T02:41:57.910Z"},"updated":{"$t":"2011-06-22T02:41:57.947Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-22T02:41:57.910Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"browse.details1.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1303184962335459169"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/browse.details1.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1303184962335459169"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1303184962335459169"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1303184962335459169"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1303184962335459169"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDgpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4177762144031198974"},"published":{"$t":"2011-06-22T02:37:22.961Z"},"updated":{"$t":"2011-06-22T02:40:58.548Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-22T02:40:58.526Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"browse.details.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4177762144031198974"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/browse.details.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4177762144031198974"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4177762144031198974"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4177762144031198974"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4177762144031198974"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"4"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/6114499186676168095"},"published":{"$t":"2011-06-21T18:14:52.324Z"},"updated":{"$t":"2011-06-21T18:14:52.356Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-21T18:14:52.324Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Content.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/6114499186676168095"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8989149786333341245"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/how-tos/getting-around-the-chrome-source-code/Content.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/6114499186676168095"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6114499186676168095"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/6114499186676168095"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/6114499186676168095"}],"author":[{"name":{"$t":"John Abd-El-Malek"},"email":{"$t":"jam@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1972355889361807802"},"published":{"$t":"2011-06-21T18:14:12.347Z"},"updated":{"$t":"2011-06-21T18:14:12.371Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-21T18:14:12.347Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Content.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1972355889361807802"},"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":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/content-module/Content.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1972355889361807802"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1972355889361807802"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1972355889361807802"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1972355889361807802"}],"author":[{"name":{"$t":"John Abd-El-Malek"},"email":{"$t":"jam@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7873937833461437643"},"published":{"$t":"2011-06-21T03:30:44.351Z"},"updated":{"$t":"2011-06-21T03:30:44.365Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-21T03:30:44.351Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"browse.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7873937833461437643"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7650844405767894756"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/safebrowsing/browse.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7873937833461437643"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7873937833461437643"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7873937833461437643"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7873937833461437643"}],"author":[{"name":{"$t":"Matt Mueller"},"email":{"$t":"mattm@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YDkpeyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4618469044646221105"},"published":{"$t":"2008-09-16T08:52:32.855Z"},"updated":{"$t":"2011-06-17T19:07:55.220Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2008-09-16T08:52:32.855Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"wrench.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4618469044646221105"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5712323589102190048"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/getting-involved/dev-channel/wrench.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4618469044646221105"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4618469044646221105"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4618469044646221105"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4618469044646221105"}],"author":[{"name":{"$t":"Mark Larson"},"email":{"$t":"mal@chromium.org"}}],"sites$revision":{"$t":"5"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/8298879755093166402"},"published":{"$t":"2011-06-14T14:47:11.987Z"},"updated":{"$t":"2011-06-14T14:53:15.305Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-14T14:53:15.305Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Cookies and Prerender"},"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 style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003eShared local storage such as DOM storage, IndexedDB, and HTTP cookies present challenges for prerendering. Ideally mutations made by the prerendered page should not be visible to other tabs until after the user has activated the page. Mutations made by other pages should be reflected in the prerendered page, which may have already read from local storage before the other pages made the changes.\u003c/span\u003e\u003cfont face\u003d\"Arial\" size\u003d\"2\"\u003e\u003cspan style\u003d\"white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cfont size\u003d\"2\"\u003eThere is some thought about adding a transactional cookie store which would be memory only for the prerendered page. Unlike some of the HTML5 storage mechanisms, cookies primarily exist in HTTP and setter's may not have access to the Visibility API to change behavior. Basically, the transactional store would exist in memory only. If the user never uses a prerendered page, any mutations will just disappear. If the user tries to navigate to a page, mutations in the transactional cookie store are compared against mutations in the profile's main cookie store. If there are any conflicts, the prerendered page is cancelled and the mutations disappear. Otherwise, the mutations are merged into the profile's main cookie store and the page is swapped in.\u003c/font\u003e\u003cdiv\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cdiv\u003e\u003cspan style\u003d\"font-size:small\"\u003ePrerendered requests will use a ChromeURLRequestContext which has a new CookieStore interface, but is otherwise the same as the current profile’s ChromeURLRequestContext. If the PrerenderContents are discarded without being used, the changes made to the CookieStore interface go away. Otherwise, the deltas will be committed to the main CookieStore for the profile. If there is a merge problem, the prerendered page is discarded and a fresh request is issued.\u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003eThere are a couple of possible approaches to implementing this:\u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003ea) Do a complete copy of the canonical cookie store for the prerendered page. Both the canonical cookie store and the prerendered cookie store make mutations locally, and both maintain a log of mutations. Abandoning is simple: just delete the new cookie store. Conflict detection happens by examining the logs of the canonical store and the prerender store, and merges are simply applying the logs of the prerendered store to the canonical store if no detection detected. The main advantage is that this does not change the current \"get all cookies for this request\" path at all. The downsides are memory cost plus memcpy (back-of-the-envelope estimate is 600KB for store) and some overhead for Set-Cookie in non prerender case due to log. \u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003eb) Add ability for CookieMonster's to be chained together. The prerendered version starts out with 0 entries, but points to the canonical backing store. Set-Cookie in the prerendered page only adds entries to the prerendered version. \"Get all cookies\" in the prerendered page will need to merge together cookies from the prerendered cookiemonster and the backing cookiemonster. Abandoning is easy - just remove the prerendered cookie monster. Merge will look at last modified times for entries and any newer ones in the backing store will cause conflict detection. The main concern is how to detect a clearing of Set-Cookie in the backing store at the time of merge. The main advantage of this case is low overhead at startup and fairly minimial logic changes. The concerns are the complexity of \"get all cookies\" for the prerendered case, as well as detecting deleted cookies during the merge.\u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003ec) Add a new CookieStore implementation which stores diffs and has a CookieMonster backing store. This is similar to b), but could handle the deleted cookie case better. The downside is the potential for lots of duplicated logic, and very different lookup paths. Also, a fair bit of code does downcasting of CookieStore to CookieMonster, so the CookieStore interface will need to change for this to work.\u003c/span\u003e\u003cbr /\u003e\u003cfont size\u003d\"2\"\u003e\u003cbr /\u003e\u003c/font\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003eA few other concerns:\u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003e  - Are cookies ever cached in the render process? For example, does document.cookies do an IPC over to the CookieMonster to retrieve the values each time, or is there a cache that we will have to deal with? \u003c/span\u003e\u003cbr /\u003e\u003cspan style\u003d\"font-family:Arial;white-space:pre-wrap;font-size:small\"\u003e  - How big are the cookiestore's typically? Could we get away with the copy-and-log approach? \u003c/span\u003e\u003cbr /\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\u003cfont size\u003d\"2\"\u003e\u003cspan style\u003d\"font-family:Arial;color:rgb(0,0,0);background-color:transparent;font-style:normal;text-decoration:none;vertical-align:baseline;white-space:pre-wrap\"\u003e\u003cbr /\u003e\u003c/span\u003e\u003c/font\u003e\u003c/div\u003e\u003c/blockquote\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/3863791766242792620"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/cookies-and-prerender"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/8298879755093166402"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8298879755093166402"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8298879755093166402"}],"author":[{"name":{"$t":"Chris Bentzel"},"email":{"$t":"cbentzel@chromium.org"}}],"sites$pageName":{"$t":"cookies-and-prerender"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/757452868044218593"},"published":{"$t":"2011-06-14T00:58:56.717Z"},"updated":{"$t":"2011-06-14T00:58:56.728Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-14T00:58:56.717Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"CroppedPrerenderingDiagram.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/757452868044218593"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5488964710350134003"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/prerender/CroppedPrerenderingDiagram.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/757452868044218593"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/757452868044218593"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/757452868044218593"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/757452868044218593"}],"author":[{"name":{"$t":"Chris Bentzel"},"email":{"$t":"cbentzel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3282985000796438970"},"published":{"$t":"2011-06-14T00:55:14.150Z"},"updated":{"$t":"2011-06-14T00:55:14.156Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-14T00:55:14.150Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Prerenderingdiagram.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3282985000796438970"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5488964710350134003"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/prerender/Prerenderingdiagram.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3282985000796438970"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3282985000796438970"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3282985000796438970"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3282985000796438970"}],"author":[{"name":{"$t":"Chris Bentzel"},"email":{"$t":"cbentzel@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/901556297693225555"},"published":{"$t":"2011-06-06T21:13:26.851Z"},"updated":{"$t":"2011-06-06T21:13:26.864Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-06T21:13:26.851Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"cc.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/901556297693225555"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/cc.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/901556297693225555"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/901556297693225555"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/901556297693225555"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/901556297693225555"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7585152714872042044"},"published":{"$t":"2011-06-06T17:59:27.552Z"},"updated":{"$t":"2011-06-06T17:59:27.559Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-06T17:59:27.552Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"b.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7585152714872042044"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/b.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7585152714872042044"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7585152714872042044"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7585152714872042044"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7585152714872042044"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1690059406555643566"},"published":{"$t":"2011-06-06T17:48:59.801Z"},"updated":{"$t":"2011-06-06T17:48:59.812Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-06-06T17:48:59.801Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"a.jpg"},"summary":{},"content":{"type":"image/jpeg","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/1690059406555643566"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2934567373974236984"},{"rel":"alternate","type":"image/jpeg","href":"https://sites.google.com/a/chromium.org/dev/chromium-os/developer-information-for-chrome-os-devices/samsung-series-5-chromebook/a.jpg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1690059406555643566"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1690059406555643566"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1690059406555643566"},{"rel":"edit-media","type":"image/jpeg","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/1690059406555643566"}],"author":[{"name":{"$t":"Bill Richardson"},"email":{"$t":"wfrichar@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7157698711250077597"},"published":{"$t":"2011-05-24T22:22:26.973Z"},"updated":{"$t":"2011-05-24T22:22:26.989Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-05-24T22:22:26.973Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"SyncAPI.pdf"},"summary":{},"content":{"type":"application/pdf","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7157698711250077597"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/8438919426918061887"},{"rel":"alternate","type":"application/pdf","href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/sync/syncable-service-api/SyncAPI.pdf"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7157698711250077597"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7157698711250077597"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7157698711250077597"},{"rel":"edit-media","type":"application/pdf","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7157698711250077597"}],"author":[{"name":{"$t":"Nicolas Zea"},"email":{"$t":"zea@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD8peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/2410314280940662399"},"published":{"$t":"2010-07-12T21:47:19.855Z"},"updated":{"$t":"2011-05-12T17:57:13.251Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2010-07-12T22:01:41.696Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"1: 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\"\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:gadget;maxDepth:6;rootPage:THIS_PAGE;\" width\u003d\"500\" height\u003d\"300\" style\u003d\"display:block;text-align:left;margin-right:auto;\" /\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/5663733556794389665"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/getting-started"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/2410314280940662399"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2410314280940662399"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/2410314280940662399"}],"author":[{}],"sites$pageName":{"$t":"getting-started"},"sites$revision":{"$t":"3"}},{"gd$etag":"\"YD4peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/1000473166634879802"},"published":{"$t":"2011-05-09T15:41:18.168Z"},"updated":{"$t":"2011-05-09T15:41:53.788Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-05-09T15:41:53.787Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#webpage","label":"webpage"}],"title":{"$t":"Working on the git toolchain repos"},"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\u003eEverybody who might ever need to touch the repositories that were formerly\u003c/div\u003e\u003cdiv\u003eat git.chromium.org should start by doing the account setup that Anush\u003c/div\u003e\u003cdiv\u003eposted about: http://www.chromium.org/chromium-os/developer-guide/gerrit-guide\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eYou can use your existing SSH key you were using with git.chromium.org\u003c/div\u003e\u003cdiv\u003e(that's what I did) or generate a fresh one if you prefer.  Then you\u003c/div\u003e\u003cdiv\u003eshould put this bit into your ~/.ssh/config:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eHost gerrit.chromium.org\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e Port 29418\u003c/div\u003e\u003cdiv\u003e User \u0026lt;your-gerrit-username\u0026gt;\u003c/div\u003e\u003cdiv\u003e IdentityFile %d/.ssh/chromium\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eFor sanity's sake, your gerrit username will be the same as your\u003c/div\u003e\u003cdiv\u003echromium.org username which will be the same as your google.com username.\u003c/div\u003e\u003cdiv\u003eI did it that way even though I don't like my google.com username much\u003c/div\u003e\u003cdiv\u003e(and even though I am insane).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThis config assumes that you are using your SSH key from before and/or that\u003c/div\u003e\u003cdiv\u003eyou generated it with \"ssh-keygen -f ~/.ssh/chromium\".  Adjust file names\u003c/div\u003e\u003cdiv\u003eto taste if you are nonconformist.  Make sure that the bit you paste into\u003c/div\u003e\u003cdiv\u003ethe account setup web form for your SSH key is instead the contents of\u003c/div\u003e\u003cdiv\u003e~/.ssh/chromium.pub (your public key, not your private key).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eOnce you have done the account setup, then you can ask someone to add you\u003c/div\u003e\u003cdiv\u003eto the nacl-toolchain-committers group.  For the moment, you can ask me.\u003c/div\u003e\u003cdiv\u003eWhen other more adminy people get their gerrit accounts set up so I can\u003c/div\u003e\u003cdiv\u003eadd them to the nacl-admin group, you should ask them instead of me.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe content for our repos has been migrated over from the\u003c/div\u003e\u003cdiv\u003egitrw.chromium.org server, and nobody can push there anymore.  Note that\u003c/div\u003e\u003cdiv\u003ethe read-only http://git.chromium.org mirrors are still stale (lacking\u003c/div\u003e\u003cdiv\u003etwo commits I pushed yesterday), and will probably never be updated again.\u003c/div\u003e\u003cdiv\u003eBut that's OK!\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe new repos are live.  The read-only URLs are:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e       http://gerrit.chromium.org/gerrit/p/native_client/nacl-glibc.git\u003c/div\u003e\u003cdiv\u003e       http://gerrit.chromium.org/gerrit/p/native_client/nacl-binutils.git\u003c/div\u003e\u003cdiv\u003e       http://gerrit.chromium.org/gerrit/p/native_client/nacl-gcc.git\u003c/div\u003e\u003cdiv\u003e       http://gerrit.chromium.org/gerrit/p/native_client/nacl-newlib.git\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eI will look into changing the toolchain builder crapola to pull from those.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eThe URLs for writing are:\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e       ssh://gerrit.chromium.org/native_client/nacl-glibc.git\u003c/div\u003e\u003cdiv\u003e       ssh://gerrit.chromium.org/native_client/nacl-binutils.git\u003c/div\u003e\u003cdiv\u003e       ssh://gerrit.chromium.org/native_client/nacl-gcc.git\u003c/div\u003e\u003cdiv\u003e       ssh://gerrit.chromium.org/native_client/nacl-newlib.git\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eTo keep life simple, you can just do a fresh 'git clone' from one of the\u003c/div\u003e\u003cdiv\u003essh URLs.  (You only need a gerrit account and not committer privs to be\u003c/div\u003e\u003cdiv\u003eable to clone that way.)  It's also possible to set things up to pull from\u003c/div\u003e\u003cdiv\u003ehttp:// urls but push to ssh:// urls, but that is stranger and I don't\u003c/div\u003e\u003cdiv\u003ereally know why you'd bother with it.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eIf you have an existing git checkout, you can fix the URLs just by changing\u003c/div\u003e\u003cdiv\u003ethem in the .git/config file in each checkout.  There is a way to do this\u003c/div\u003e\u003cdiv\u003ewith the 'git config' command, but really I'd just edit the file.  It ain't\u003c/div\u003e\u003cdiv\u003erocket science.\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/5548930097806777862"},{"rel":"alternate","type":"text/html","href":"https://sites.google.com/a/chromium.org/dev/nativeclient/how-tos/working-on-the-git-toolchain-repos"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/1000473166634879802"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000473166634879802"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1000473166634879802"}],"author":[{"name":{"$t":"Michael Linck"},"email":{"$t":"mlinck@chromium.org"}}],"sites$pageName":{"$t":"working-on-the-git-toolchain-repos"},"sites$revision":{"$t":"2"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3140401077629017083"},"published":{"$t":"2011-05-07T01:42:26.606Z"},"updated":{"$t":"2011-05-07T01:42:26.623Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-05-07T01:42:26.606Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromiumMediaPlayerFSStack (1).png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3140401077629017083"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3463878342489281452"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/audio-video/ChromiumMediaPlayerFSStack%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/3140401077629017083"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3140401077629017083"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3140401077629017083"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3140401077629017083"}],"author":[{"name":{"$t":"Andrew Scherkus"},"email":{"$t":"scherkus@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3832001491524319239"},"published":{"$t":"2011-05-07T01:39:57.860Z"},"updated":{"$t":"2011-05-07T01:39:57.871Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-05-07T01:39:57.860Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromiumMediaPlayerFSStack.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3832001491524319239"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3463878342489281452"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/audio-video/ChromiumMediaPlayerFSStack.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3832001491524319239"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3832001491524319239"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3832001491524319239"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3832001491524319239"}],"author":[{"name":{"$t":"Andrew Scherkus"},"email":{"$t":"scherkus@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7272195326937133363"},"published":{"$t":"2011-05-05T22:24:16.138Z"},"updated":{"$t":"2011-05-05T22:24:16.144Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-05-05T22:24:16.138Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromiumMediaBuffering.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7272195326937133363"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3463878342489281452"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/audio-video/ChromiumMediaBuffering.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7272195326937133363"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7272195326937133363"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7272195326937133363"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7272195326937133363"}],"author":[{"name":{"$t":"Andrew Scherkus"},"email":{"$t":"scherkus@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/4356894708027472977"},"published":{"$t":"2011-05-05T22:22:30.198Z"},"updated":{"$t":"2011-05-05T22:22:30.209Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-05-05T22:22:30.198Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"ChromiumMediaBuffering.svg"},"summary":{},"content":{"type":"image/svg+xml","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/4356894708027472977"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3463878342489281452"},{"rel":"alternate","type":"image/svg+xml","href":"https://sites.google.com/a/chromium.org/dev/audio-video/ChromiumMediaBuffering.svg"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/4356894708027472977"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4356894708027472977"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/4356894708027472977"},{"rel":"edit-media","type":"image/svg+xml","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/4356894708027472977"}],"author":[{"name":{"$t":"Andrew Scherkus"},"email":{"$t":"scherkus@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/3163880553267830698"},"published":{"$t":"2011-04-08T18:11:30.887Z"},"updated":{"$t":"2011-04-08T18:11:30.899Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-08T18:11:30.887Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"chrome-32.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/3163880553267830698"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/1201972082741324563"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/chromium-projects/chrome-32.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/3163880553267830698"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3163880553267830698"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/3163880553267830698"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/3163880553267830698"}],"author":[{}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/7786120276443807404"},"published":{"$t":"2011-04-01T23:28:07.115Z"},"updated":{"$t":"2011-04-01T23:28:07.127Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-01T23:28:07.115Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#attachment","label":"attachment"}],"title":{"$t":"Screen shot 2011-04-01 at 4.27.30 PM.png"},"summary":{},"content":{"type":"image/png","src":"https://a77db9aa-a-7b23c8ea-s-sites.googlegroups.com/feeds/media/content/chromium.org/dev/7786120276443807404"},"link":[{"rel":"http://schemas.google.com/sites/2008#parent","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/969660262670796398"},{"rel":"alternate","type":"image/png","href":"https://sites.google.com/a/chromium.org/dev/developers/f-script-anywhere/Screen%20shot%202011-04-01%20at%204.27.30%20PM.png"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/7786120276443807404"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7786120276443807404"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/7786120276443807404"},{"rel":"edit-media","type":"image/png","href":"https://sites.google.com/feeds/media/content/chromium.org/dev/7786120276443807404"}],"author":[{"name":{"$t":"Nico Weber"},"email":{"$t":"thakis@chromium.org"}}],"sites$revision":{"$t":"1"}},{"gd$etag":"\"YD0peyY.\"","id":{"$t":"https://sites.google.com/feeds/content/chromium.org/dev/5278017466506944670"},"published":{"$t":"2011-04-01T23:02:01.261Z"},"updated":{"$t":"2011-04-01T23:02:01.290Z"},"app$edited":{"xmlns$app":"http://www.w3.org/2007/app","$t":"2011-04-01T23:02:01.261Z"},"category":[{"scheme":"http://schemas.google.com/g/2005#kind","term":"http://schemas.google.com/sites/2008#comment","label":"comment"}],"title":{"$t":""},"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\"\u003eWindow is not a subclass of WidgetWin. Maybe WindowWin is meant?\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/5077298636011219464"},{"rel":"http://schemas.google.com/sites/2008#revision","type":"application/atom+xml","href":"https://sites.google.com/feeds/revision/chromium.org/dev/5278017466506944670"},{"rel":"self","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5278017466506944670"},{"rel":"edit","type":"application/atom+xml","href":"https://sites.google.com/feeds/content/chromium.org/dev/5278017466506944670"}],"author":[{"name":{"$t":"Roy Hashimoto"},"email":{"$t":"rhashimoto@chromium.org"}}],"thr$in-reply-to":{"href":"https://sites.google.com/a/chromium.org/dev/developers/design-documents/chromeviews","ref":"https://sites.google.com/feeds/content/chromium.org/dev/5077298636011219464","source":"https://sites.google.com/feeds/content/chromium.org/dev","type":"text/html"},"sites$revision":{"$t":"1"}}]}}