# Technical Documentation: GoogleChrome/chrome-extensions-samples

> ℹ️ **Provenance:** In-Tree Documentation (316 Chapters) · [CodeWiki Reference](https://codewiki.google/github.com/GoogleChrome/chrome-extensions-samples) · Recency: Active (< 180 days)

## File: README.md

# Chrome Extensions samples

Official samples for Chrome Extensions and the Chrome Apps platform. (Chrome Apps are deprecated. Learn more [on the Chromium blog](https://blog.chromium.org/2020/08/changes-to-chrome-app-support-timeline.html)).

For more information on extensions, see [Chrome Developers](https://developer.chrome.com).

## Explore samples

The directory structure is as follows:

- [api-samples/](api-samples/) - extensions focused on a single API package
- [functional-samples/](functional-samples/) - full featured extensions spanning multiple API packages
- [\_archive/apps/](_archive/apps/) - deprecated Chrome Apps platform (not listed below)
- [\_archive/mv2/](_archive/mv2/) - resources for manifest version 2

You can also use the [Samples](https://developer.chrome.com/docs/extensions/samples/) page to discover extensions by type, permissions, and extension API.

## Installation

To experiment with these samples, please clone this repo and use 'Load Unpacked Extension'.
Read more on [Development Basics](https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/#load-unpacked).

## Contributing

Please see [the CONTRIBUTING file](/CONTRIBUTING.md) for information on contributing to the `chrome-extensions-samples` project.

## License

`chrome-extensions-samples` are authored by Google and are licensed under the [Apache License, Version 2.0](/LICENSE).

---

## File: CONTRIBUTING.md

# How to Contribute

We'd love to accept your patches and contributions to this project.

## Before you begin

### Sign our Contributor License Agreement

Contributions to this project must be accompanied by a
[Contributor License Agreement](https://cla.developers.google.com/about) (CLA).
You (or your employer) retain the copyright to your contribution; this simply
gives us permission to use and redistribute your contributions as part of the
project.

If you or your current employer have already signed the Google CLA (even if it
was for a different project), you probably don't need to do it again.

Visit <https://cla.developers.google.com/> to see your current agreements or to
sign a new one.

### Review our Community Guidelines

This project follows [Google's Open Source Community
Guidelines](https://opensource.google/conduct/).

## Contribution process

### Create an issue first

Before adding a new sample, [create an issue first](https://github.com/GoogleChrome/chrome-extensions-samples/issues/new).
Describe why this sample is needed and how you plan to implement it. Only once
you've got the approval from one of the maintainers start working on a PR. Non
trivial PRs without an approved issue will be rejected.

### Code Reviews

All submissions, including submissions by project members, require review. We
use GitHub pull requests for this purpose. Consult
[GitHub Help](https://help.github.com/articles/about-pull-requests/) for more
information on using pull requests.

### Setting up your Environment

If you want to contribute to this repository, you need to first [create your own fork](https://docs.github.com/en/get-started/quickstart/fork-a-repo).
After forking chrome-extensions-samples to your own Github account, run the
following steps to get started:

```sh
# clone your fork to your local machine
git clone https://github.com/your-fork/chrome-extensions-samples.git

cd chrome-extensions-samples

# install dependencies
npm install
```

### Writing a README

All new code samples or samples updated from Manifest V2 should include a
README file. Please copy the [provided template](./README-template.md) into
your sample's folder and follow the instructions therein.

---

## File: package.json

{
  "name": "chrome-extensions-samples",
  "version": "1.0.0",
  "private": true,
  "description": "Official samples for Chrome Extensions and the Chrome Apps platform.",
  "scripts": {
    "prettier": "npx prettier **/*.{md,html,json} -w",
    "lint": "eslint **/*.js",
    "lint:fix": "npm run lint -- --fix",
    "prepare": "husky install"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/GoogleChrome/chrome-extensions-samples.git"
  },
  "keywords": [],
  "author": "The Chrome Team",
  "license": "Apache 2.0",
  "bugs": {
    "url": "https://github.com/GoogleChrome/chrome-extensions-samples/issues"
  },
  "homepage": "https://github.com/GoogleChrome/chrome-extensions-samples#readme",
  "devDependencies": {
    "@eslint/js": "10.0.1",
    "chrome-types": "0.1.454",
    "eslint": "^10.12.0",
    "eslint-config-prettier": "10.1.8",
    "eslint-plugin-jest": "^29.17.0",
    "eslint-plugin-prettier": "5.5.7",
    "globals": "17.13.0",
    "husky": "9.1.7",
    "lint-staged": "17.6.0",
    "prettier": "3.9.10"
  },
  "lint-staged": {
    "**/*.js": [
      "npx eslint --fix"
    ],
    "**/*.{md,html,json}": [
      "npx prettier --write"
    ]
  }
}

---

## File: README-template.md

_To create a README for your sample_

1. _Copy this file to your sample folder._
1. _Enter the requested information below._
1. _Delete these instructions._

_For API samples use the name of the API. For example, a sample about the `chrome.declarativeNetRequest` would simply be called "chrome.declarativeNetRequest". (Do not use special formatting in headings.) For functional samples, the title should be what the sample demonstrates_

# Title

_Describe what the sample demonstrates. If this is an API sample, link to the API._

This sample demonstrates ...

## Overview

_Describe how the sample demonstrates the API or use case and briefly describe how to use it._

## Implementation Notes

_Add any information that doesn't fit elsewhere in the README._

## Running this extension

1. Clone this repository.
2. Load this directory in Chrome as an [unpacked extension](https://developer.chrome.com/docs/extensions/mv3/getstarted/development-basics/#load-unpacked).
3. _Add the rest of the instructions here_

---

## File: .prettierrc.json

{
  "printWidth": 80,
  "tabWidth": 2,
  "semi": true,
  "singleQuote": true,
  "trailingComma": "none",
  "bracketSpacing": true,
  "arrowParens": "always"
}

---

## File: _archive/apps/README.md

# Chrome Apps samples

Official samples for deprecated Chrome Apps platform. If you want to learn about the platform, you can:

1. look at the source code of the samples below. Most samples have a "Try it now" button that allows you to install and play with it.
2. read the [official docs](http://developer.chrome.com/apps)

If you have questions, [search](http://stackoverflow.com/questions/tagged/google-chrome-app) or [ask at StackOverflow](http://stackoverflow.com/questions/ask?tags=google-chrome-app) (observe the google-chrome-app tag) or join the [Chromium Apps](https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-apps) Google group.


# Samples



Sample | API or feature | Link
--- | --- |:---:
<a name="_sample_analytics" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/analytics">analytics</a> | [storage](#_feature_storage) [ios](#mobile-support) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/anfhlhgdnbpnglngmblhkdifdbcepjce"></a>
<a name="_sample_appengine-channelapi_app" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/appengine-channelapi/app">appengine-channelapi/app</a> | [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/alieplnmdkoekpkepkfgickpmhhabfkl"></a>
<a name="_sample_appsquare" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/appsquare">appsquare</a> | [geolocation](#_feature_geolocation) [identity](#_feature_identity) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/loimmcmmgnhkbppokdpfhlccebcpicld"></a>
<a name="_sample_appview_embedded-app" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/appview/embedded-app">appview/embedded-app</a> | [getUserMedia](#_feature_getUserMedia)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/mighjnlldblaiimoaidiggecdkobklfe"></a>
<a name="_sample_appview_host-app" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/appview/host-app">appview/host-app</a> | [appview](#_feature_appview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/gkmjlnhjcdognmniiadfdhdlgdocngda"></a>
<a name="_sample_blink1" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/blink1">blink1</a> | [hid](#_feature_hid) [usb](#_feature_usb)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/kcpjgiicabigbjejdjnkflkdkjknkdch"></a>
<a name="_sample_bluetooth-samples_battery-service-demo" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/bluetooth-samples/battery-service-demo">bluetooth-samples/battery-service-demo</a> | [bluetooth](#_feature_bluetooth)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/kllncpgahapecnfkhefffabcemaknamh"></a>
<a name="_sample_bluetooth-samples_device-info-demo" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/bluetooth-samples/device-info-demo">bluetooth-samples/device-info-demo</a> | [bluetooth](#_feature_bluetooth)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/dblimghcclaakknbpajckcamddhjaaai"></a>
<a name="_sample_bluetooth-samples_heart-rate-sensor" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/bluetooth-samples/heart-rate-sensor">bluetooth-samples/heart-rate-sensor</a> | [bluetooth](#_feature_bluetooth)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/nmlcgjldnboapnjdmllfcdenlljfjanm"></a>
<a name="_sample_calculator" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/calculator">calculator</a> | [clipboard](#_feature_clipboard) [ios](#mobile-support) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/pelimflkpjiicnajdjcmekpioacmahkh"></a>
<a name="_sample_camera-capture" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/camera-capture">camera-capture</a> | [getUserMedia](#_feature_getUserMedia)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ilefapmpngkdnnllcnlcjffipbolhklf"></a>
<a name="_sample_clock" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/clock">clock</a> | [framelessWindows](#_feature_framelessWindows) [geolocation](#_feature_geolocation) [richNotifications](#_feature_richNotifications) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/lhfiglpmnendbchimlikaeachppfonmm"></a>
<a name="_sample_context-menu" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/context-menu">context-menu</a> | [contextMenu](#_feature_contextMenu)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/biknlgbccocnocjfclpedecpgopjokik"></a>
<a name="_sample_dart" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/dart">dart</a> | [dart](#_feature_dart) [ios](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/pcbbhbaibaphjlbaoahmahgmncbdkeli"></a>
<a name="_sample_desktop-capture" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/desktop-capture">desktop-capture</a> | [desktopCapture](#_feature_desktopCapture)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/mhkidniocjdaiddjckopkigjmjbadfji"></a>
<a name="_sample_dialog-element" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/dialog-element">dialog-element</a> |   | <a target="_blank" href="https://chrome.google.com/webstore/detail/mikhnkopoddcomlgmcjgfnaccjhibiec"></a>
<a name="_sample_diff" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/diff">diff</a> | [clipboard](#_feature_clipboard) [fileSystem](#_feature_fileSystem) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/neifiophhpiohjlhiohlhlekkfokcepk"></a>
<a name="_sample_filesystem-access" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/filesystem-access">filesystem-access</a> | [fileSystem](#_feature_fileSystem) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ehbhjpchdgepkgjhfkhpkjdbnljedllm"></a>
<a name="_sample_frameless-window" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/frameless-window">frameless-window</a> | [framelessWindows](#_feature_framelessWindows)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/hjjdaddngnaofnfjpajdcbdmkegiakec"></a>
<a name="_sample_gcm-notifications" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/gcm-notifications">gcm-notifications</a> | [gcm](#_feature_gcm) [richNotifications](#_feature_richNotifications) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/gpededflkpcoehfjpdecdkoiagajloin"></a>
<a name="_sample_gdrive" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/gdrive">gdrive</a> | [framelessWindows](#_feature_framelessWindows) [identity](#_feature_identity)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/jpabeekbjicamajjcfejnochhmlbpgjh"></a>
<a name="_sample_github-auth" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/github-auth">github-auth</a> | [identity](#_feature_identity)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/laolmfhjaobpboigjfbclcphckmjodlp"></a>
<a name="_sample_hello-world" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/hello-world">hello-world</a> |  [ios](#mobile-support) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/nmfpplkdkcbhediajmbhljkafnlahcda"></a>
<a name="_sample_hello-world-sync" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/hello-world-sync">hello-world-sync</a> | [storage](#_feature_storage) [ios](#mobile-support) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/ajjcafkkflbcealbcfjajolnkogffgcb"></a>
<a name="_sample_hid" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/hid">hid</a> | [hid](#_feature_hid)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ohndmecdhlgohpibepbboddcoecomnpc"></a>
<a name="_sample_identity" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/identity">identity</a> | [identity](#_feature_identity) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/oficlfehfenioickohognhdhmmcpceil"></a>
<a name="_sample_image-edit" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/image-edit">image-edit</a> | [fileSystem](#_feature_fileSystem) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/foibnkkcggahkmckladbmgkajodpcjfh"></a>
<a name="_sample_instagram-auth" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/instagram-auth">instagram-auth</a> | [identity](#_feature_identity)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/baaenjnmlaejajnalldcecpdafeggelb"></a>
<a name="_sample_io2012-presentation" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/io2012-presentation">io2012-presentation</a> | [framelessWindows](#_feature_framelessWindows) [getUserMedia](#_feature_getUserMedia) [serial](#_feature_serial) [storage](#_feature_storage) [webview](#_feature_webview)  | -
<a name="_sample_io2012-presentation_helloworld" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/io2012-presentation/helloworld">io2012-presentation/helloworld</a> |   | -
<a name="_sample_io2012-presentation_servo" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/io2012-presentation/servo">io2012-presentation/servo</a> | [getUserMedia](#_feature_getUserMedia) [serial](#_feature_serial)  | -
<a name="_sample_ioio" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/ioio">ioio</a> | [bluetooth](#_feature_bluetooth)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/hknlnnbpihcamokfeggmahjgldbcpkof"></a>
<a name="_sample_keyboard-handler" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/keyboard-handler">keyboard-handler</a> |   | <a target="_blank" href="https://chrome.google.com/webstore/detail/pcbbaldjljokfnnkphllabnpolciapjc"></a>
<a name="_sample_managed-in-app-payments" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/managed-in-app-payments">managed-in-app-payments</a> | [in-app-payments](#_feature_in-app-payments)  | -
<a name="_sample_manga-cam" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/manga-cam">manga-cam</a> | [framelessWindows](#_feature_framelessWindows) [getUserMedia](#_feature_getUserMedia) [syncFileSystem](#_feature_syncFileSystem)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/cnehcenehakkickcnoiaemcpjpaigmbb"></a>
<a name="_sample_mdns-browser" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/mdns-browser">mdns-browser</a> | [framelessWindows](#_feature_framelessWindows) [sockets](#_feature_sockets) [systemInfo](#_feature_systemInfo)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/kipighjpklofchgbdgclfaoccdlghidp"></a>
<a name="_sample_media-gallery" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/media-gallery">media-gallery</a> | [mediaGallery](#_feature_mediaGallery)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/lidepfgfmameopopgagobnpndcnfgbnk"></a>
<a name="_sample_messaging_app1" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/messaging/app1">messaging/app1</a> | [messaging](#_feature_messaging)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/mcfaknmahgbmjlbondlciokappnnjbnf"></a>
<a name="_sample_messaging_app2" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/messaging/app2">messaging/app2</a> | [messaging](#_feature_messaging)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/hdligeegpimhdjepakblhneiekccbhol"></a>
<a name="_sample_messaging_extension" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/messaging/extension">messaging/extension</a> | [messaging](#_feature_messaging) [richNotifications](#_feature_richNotifications)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ihhkahhkmiddbnfhlglocakcdfbgddkj"></a>
<a name="_sample_mini-code-edit" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/mini-code-edit">mini-code-edit</a> | [commands](#_feature_commands) [contextMenu](#_feature_contextMenu) [fileSystem](#_feature_fileSystem)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/inbjbbebnhailhhkfaaokegkfjlmgabb"></a>
<a name="_sample_multicast" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/multicast">multicast</a> | [framelessWindows](#_feature_framelessWindows) [messaging](#_feature_messaging) [sockets](#_feature_sockets) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/bnheobjndkaipbloffigkiddhcbblihl"></a>
<a name="_sample_one-time-payment" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/one-time-payment">one-time-payment</a> | [identity](#_feature_identity) [storage](#_feature_storage)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ebcgmmcbgnpoclkoibogeiokfdmjbbob"></a>
<a name="_sample_optional-permissions" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/optional-permissions">optional-permissions</a> | [optionalPermissions](#_feature_optionalPermissions)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ggkojffeaocnfigijnfbnliopcilipgg"></a>
<a name="_sample_parrot-ar-drone" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/parrot-ar-drone">parrot-ar-drone</a> | [old_sockets](#_feature_old_sockets) [sockets](#_feature_sockets) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/lhdfniaagbjbipjmgfbnlbcmlbcgklkh"></a>
<a name="_sample_platform-title" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/platform-title">platform-title</a> | [framelessWindows](#_feature_framelessWindows)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/gdpimhplfcmbiakglpomcdcchbmgfiaj"></a>
<a name="_sample_printing" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/printing">printing</a> | [print](#_feature_print) [storage](#_feature_storage) [systemInfo](#_feature_systemInfo)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/eahldfpkmibbaajaoeifhjeehfgdagdm"></a>
<a name="_sample_restarted-demo" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/restarted-demo">restarted-demo</a> | [storage](#_feature_storage) [ios](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/ljngdccbopfaompkjfhepllagnijbdne"></a>
<a name="_sample_rich-notifications" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/rich-notifications">rich-notifications</a> | [richNotifications](#_feature_richNotifications) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/cndmbddaappldijonoekcdfdlhemhejm"></a>
<a name="_sample_sandbox" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/sandbox">sandbox</a> | [sandbox](#_feature_sandbox)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ipchbpppeafbpnmnjbkljpfhkkiaeikd"></a>
<a name="_sample_sandboxed-content" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/sandboxed-content">sandboxed-content</a> | [sandbox](#_feature_sandbox)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/gaaeficfcmngmogaejhikdnkdijlpgec"></a>
<a name="_sample_serial-control-signals" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/serial-control-signals">serial-control-signals</a> | [serial](#_feature_serial)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/gmlopmidlcfikepbnklkochchhehjpak"></a>
<a name="_sample_serial_adkjs_app" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/serial/adkjs/app">serial/adkjs/app</a> | [serial](#_feature_serial)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ieoiddehfkbacdideciijbdjfjegmpjo"></a>
<a name="_sample_serial_espruino" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/serial/espruino">serial/espruino</a> | [serial](#_feature_serial)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ghbnaccmkndoembcopnaklidmocbdkfp"></a>
<a name="_sample_serial_ledtoggle" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/serial/ledtoggle">serial/ledtoggle</a> | [serial](#_feature_serial)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/bdiclhdalonemjdeeaglackjgdboboem"></a>
<a name="_sample_servo" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/servo">servo</a> | [getUserMedia](#_feature_getUserMedia) [serial](#_feature_serial)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/lhedgapiolhajjkgokaplenafmdppmak"></a>
<a name="_sample_storage" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/storage">storage</a> |   | <a target="_blank" href="https://chrome.google.com/webstore/detail/bpncolcpekidijienghhkibflikohggn"></a>
<a name="_sample_syncfs-editor" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/syncfs-editor">syncfs-editor</a> | [syncFileSystem](#_feature_syncFileSystem)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ccphiekjjhfnhbmpcbmkmjjhbfhlijkc"></a>
<a name="_sample_systemInfo" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/systemInfo">systemInfo</a> | [systemInfo](#_feature_systemInfo)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/lfkebofdngpbnooppdhiibpdpepgjoch"></a>
<a name="_sample_tasks" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/tasks">tasks</a> | [identity](#_feature_identity) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/tasks-sample-using-gapi/licakmgdnppmfjlkgijcbnobnkoaegko"></a>
<a name="_sample_tcpserver" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/tcpserver">tcpserver</a> | [sockets](#_feature_sockets) [systemInfo](#_feature_systemInfo) [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ahlcocbkjpjkobcdpjcobmibmpbeecpg"></a>
<a name="_sample_telnet" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/telnet">telnet</a> | [sockets](#_feature_sockets)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ebckmolcafdmfjbkmamhoacnmmkiohpe"></a>
<a name="_sample_text-editor" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/text-editor">text-editor</a> | [clipboard](#_feature_clipboard) [fileSystem](#_feature_fileSystem)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/jkgbibkjioaefdopcdbhjehefhajgadh"></a>
<a name="_sample_todomvc" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/todomvc">todomvc</a> | [alarms](#_feature_alarms) [fileSystem](#_feature_fileSystem) [richNotifications](#_feature_richNotifications) [storage](#_feature_storage) [syncFileSystem](#_feature_syncFileSystem) [android](#mobile-support) | -
<a name="_sample_tts" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/tts">tts</a> | [tts](#_feature_tts)  | -
<a name="_sample_udp" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/udp">udp</a> | [sockets](#_feature_sockets) [ios](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/okhdmjejphblookgnkabaoaalhcoobec"></a>
<a name="_sample_url-handler" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/url-handler">url-handler</a> | [storage](#_feature_storage) [webview](#_feature_webview)  | -
<a name="_sample_usb-label-printer" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/usb-label-printer">usb-label-printer</a> | [fileSystem](#_feature_fileSystem) [getUserMedia](#_feature_getUserMedia) [optionalPermissions](#_feature_optionalPermissions) [usb](#_feature_usb)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/fgnncpfphbgfchijmoopegkdhihegfla"></a>
<a name="_sample_usb_device-info" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/usb/device-info">usb/device-info</a> | [usb](#_feature_usb)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/igkmggljimacfdfalpeelenjeicmfnll"></a>
<a name="_sample_usb_knob" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/usb/knob">usb/knob</a> | [optionalPermissions](#_feature_optionalPermissions) [usb](#_feature_usb)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/npiachjbcianljljdlckbnkilpnddnfn"></a>
<a name="_sample_weather" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/weather">weather</a> | [geolocation](#_feature_geolocation) [storage](#_feature_storage) [ios](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/hfgmgghdkhgcklddhfefhdhcpkpmikhi"></a>
<a name="_sample_web-store" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/web-store">web-store</a> | [fileSystem](#_feature_fileSystem) [identity](#_feature_identity) [storage](#_feature_storage) [webstore](#_feature_webstore)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ndgidogppopohjpghapeojgoehfmflab"></a>
<a name="_sample_webgl-pointer-lock" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webgl-pointer-lock">webgl-pointer-lock</a> | [framelessWindows](#_feature_framelessWindows) [pointerLock](#_feature_pointerLock)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/pjfconokbhkicolnaaphhfhjpcgnnfpj"></a>
<a name="_sample_webserver" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webserver">webserver</a> | [sockets](#_feature_sockets) [systemInfo](#_feature_systemInfo) [android](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/hflhcpmgeolmjlbmdicgkjedjmkoocbe"></a>
<a name="_sample_websocket-server" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/websocket-server">websocket-server</a> | [sockets](#_feature_sockets) [ios](#mobile-support) | <a target="_blank" href="https://chrome.google.com/webstore/detail/pkbpddppnkjmlbgliipgmhjeialadokj"></a>
<a name="_sample_webview-samples_browser" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/browser">webview-samples/browser</a> | [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/edggnmnajhcbhlnpjnogkjpghaikidaa"></a>
<a name="_sample_webview-samples_declarative-web-request" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/declarative-web-request">webview-samples/declarative-web-request</a> | [storage](#_feature_storage) [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/hhflblflkeainajnkamabjibdbfnbilb"></a>
<a name="_sample_webview-samples_insert-css" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/insert-css">webview-samples/insert-css</a> | [storage](#_feature_storage) [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/dnedmnfnnbpgnedogbljhiacgmkbklfj"></a>
<a name="_sample_webview-samples_local-resources" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/local-resources">webview-samples/local-resources</a> | [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/nfeplfjagjlljomimjealpedhjgamkle"></a>
<a name="_sample_webview-samples_multi-tab-browser" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/multi-tab-browser">webview-samples/multi-tab-browser</a> | [contextMenu](#_feature_contextMenu) [webview](#_feature_webview)  | -
<a name="_sample_webview-samples_new-window" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/new-window">webview-samples/new-window</a> | [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/kpgjodoohleggakakpaadgjeedfgeafi"></a>
<a name="_sample_webview-samples_new-window-user-agent" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/new-window-user-agent">webview-samples/new-window-user-agent</a> | [contextMenu](#_feature_contextMenu) [webview](#_feature_webview)  | -
<a name="_sample_webview-samples_shared-script" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/shared-script">webview-samples/shared-script</a> | [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/cbdacningpambfjjejgfebeagmhpdcko"></a>
<a name="_sample_webview-samples_user-agent" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/user-agent">webview-samples/user-agent</a> | [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/fbkdeonndngdbojbccanjnpnlpdmgchc"></a>
<a name="_sample_webview-samples_webview" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/webview">webview-samples/webview</a> | [geolocation](#_feature_geolocation) [getUserMedia](#_feature_getUserMedia) [pointerLock](#_feature_pointerLock) [webview](#_feature_webview)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/hnanccpkhjhkkgiipckodmdldeomdohj"></a>
<a name="_sample_window-options" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/window-options">window-options</a> | [fullscreen](#_feature_fullscreen)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/cfcgoifcnpnadlhhoolkemkjkhoajfmk"></a>
<a name="_sample_window-state" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/window-state">window-state</a> | [fullscreen](#_feature_fullscreen)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/hcbhfbnaaancmblfhdknlnojpafjohbi"></a>
<a name="_sample_windows" href="https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/windows">windows</a> | [framelessWindows](#_feature_framelessWindows)  | <a target="_blank" href="https://chrome.google.com/webstore/detail/ldenchfohdfgggloeimambnckhjpedgc"></a>




# Samples by features


API or feature | Samples
--- | ---
<a name="_feature_alarms"></a>alarms | [todomvc](#_sample_todomvc) 
<a name="_feature_appview"></a>appview | [appview_host-app](#_sample_appview_host-app) 
<a name="_feature_bluetooth"></a>bluetooth | [bluetooth-samples_battery-service-demo](#_sample_bluetooth-samples_battery-service-demo) [bluetooth-samples_device-info-demo](#_sample_bluetooth-samples_device-info-demo) [bluetooth-samples_heart-rate-sensor](#_sample_bluetooth-samples_heart-rate-sensor) [ioio](#_sample_ioio) 
<a name="_feature_clipboard"></a>clipboard | [calculator](#_sample_calculator) [diff](#_sample_diff) [text-editor](#_sample_text-editor) 
<a name="_feature_commands"></a>commands | [mini-code-edit](#_sample_mini-code-edit) 
<a name="_feature_contextMenu"></a>contextMenu | [context-menu](#_sample_context-menu) [mini-code-edit](#_sample_mini-code-edit) [webview-samples_multi-tab-browser](#_sample_webview-samples_multi-tab-browser) [webview-samples_new-window-user-agent](#_sample_webview-samples_new-window-user-agent) 
<a name="_feature_dart"></a>dart | [dart](#_sample_dart) 
<a name="_feature_desktopCapture"></a>desktopCapture | [desktop-capture](#_sample_desktop-capture) 
<a name="_feature_fileSystem"></a>fileSystem | [diff](#_sample_diff) [filesystem-access](#_sample_filesystem-access) [image-edit](#_sample_image-edit) [mini-code-edit](#_sample_mini-code-edit) [text-editor](#_sample_text-editor) [todomvc](#_sample_todomvc) [usb-label-printer](#_sample_usb-label-printer) [web-store](#_sample_web-store) 
<a name="_feature_framelessWindows"></a>framelessWindows | [clock](#_sample_clock) [frameless-window](#_sample_frameless-window) [gdrive](#_sample_gdrive) [io2012-presentation](#_sample_io2012-presentation) [manga-cam](#_sample_manga-cam) [mdns-browser](#_sample_mdns-browser) [multicast](#_sample_multicast) [platform-title](#_sample_platform-title) [webgl-pointer-lock](#_sample_webgl-pointer-lock) [windows](#_sample_windows) 
<a name="_feature_fullscreen"></a>fullscreen | [window-options](#_sample_window-options) [window-state](#_sample_window-state) 
<a name="_feature_gcm"></a>gcm | [gcm-notifications](#_sample_gcm-notifications) 
<a name="_feature_geolocation"></a>geolocation | [appsquare](#_sample_appsquare) [clock](#_sample_clock) [weather](#_sample_weather) [webview-samples_webview](#_sample_webview-samples_webview) 
<a name="_feature_getUserMedia"></a>getUserMedia | [appview_embedded-app](#_sample_appview_embedded-app) [camera-capture](#_sample_camera-capture) [io2012-presentation](#_sample_io2012-presentation) [io2012-presentation_servo](#_sample_io2012-presentation_servo) [manga-cam](#_sample_manga-cam) [servo](#_sample_servo) [usb-label-printer](#_sample_usb-label-printer) [webview-samples_webview](#_sample_webview-samples_webview) 
<a name="_feature_hid"></a>hid | [blink1](#_sample_blink1) [hid](#_sample_hid) 
<a name="_feature_identity"></a>identity | [appsquare](#_sample_appsquare) [gdrive](#_sample_gdrive) [github-auth](#_sample_github-auth) [identity](#_sample_identity) [instagram-auth](#_sample_instagram-auth) [one-time-payment](#_sample_one-time-payment) [tasks](#_sample_tasks) [web-store](#_sample_web-store) 
<a name="_feature_in-app-payments"></a>in-app-payments | [managed-in-app-payments](#_sample_managed-in-app-payments) 
<a name="_feature_mediaGallery"></a>mediaGallery | [media-gallery](#_sample_media-gallery) 
<a name="_feature_messaging"></a>messaging | [messaging_app1](#_sample_messaging_app1) [messaging_app2](#_sample_messaging_app2) [messaging_extension](#_sample_messaging_extension) [multicast](#_sample_multicast) 
<a name="_feature_old_sockets"></a>old_sockets | [parrot-ar-drone](#_sample_parrot-ar-drone) 
<a name="_feature_optionalPermissions"></a>optionalPermissions | [optional-permissions](#_sample_optional-permissions) [usb-label-printer](#_sample_usb-label-printer) [usb_knob](#_sample_usb_knob) 
<a name="_feature_pointerLock"></a>pointerLock | [webgl-pointer-lock](#_sample_webgl-pointer-lock) [webview-samples_webview](#_sample_webview-samples_webview) 
<a name="_feature_print"></a>print | [printing](#_sample_printing) 
<a name="_feature_richNotifications"></a>richNotifications | [clock](#_sample_clock) [gcm-notifications](#_sample_gcm-notifications) [messaging_extension](#_sample_messaging_extension) [rich-notifications](#_sample_rich-notifications) [todomvc](#_sample_todomvc) 
<a name="_feature_sandbox"></a>sandbox | [sandbox](#_sample_sandbox) [sandboxed-content](#_sample_sandboxed-content) 
<a name="_feature_serial"></a>serial | [io2012-presentation](#_sample_io2012-presentation) [io2012-presentation_servo](#_sample_io2012-presentation_servo) [serial-control-signals](#_sample_serial-control-signals) [serial_adkjs_app](#_sample_serial_adkjs_app) [serial_espruino](#_sample_serial_espruino) [serial_ledtoggle](#_sample_serial_ledtoggle) [servo](#_sample_servo) 
<a name="_feature_sockets"></a>sockets | [mdns-browser](#_sample_mdns-browser) [multicast](#_sample_multicast) [parrot-ar-drone](#_sample_parrot-ar-drone) [tcpserver](#_sample_tcpserver) [telnet](#_sample_telnet) [udp](#_sample_udp) [webserver](#_sample_webserver) [websocket-server](#_sample_websocket-server) 
<a name="_feature_storage"></a>storage | [analytics](#_sample_analytics) [appsquare](#_sample_appsquare) [clock](#_sample_clock) [diff](#_sample_diff) [filesystem-access](#_sample_filesystem-access) [gcm-notifications](#_sample_gcm-notifications) [hello-world-sync](#_sample_hello-world-sync) [image-edit](#_sample_image-edit) [io2012-presentation](#_sample_io2012-presentation) [multicast](#_sample_multicast) [one-time-payment](#_sample_one-time-payment) [printing](#_sample_printing) [restarted-demo](#_sample_restarted-demo) [todomvc](#_sample_todomvc) [url-handler](#_sample_url-handler) [weather](#_sample_weather) [web-store](#_sample_web-store) [webview-samples_declarative-web-request](#_sample_webview-samples_declarative-web-request) [webview-samples_insert-css](#_sample_webview-samples_insert-css) 
<a name="_feature_syncFileSystem"></a>syncFileSystem | [manga-cam](#_sample_manga-cam) [syncfs-editor](#_sample_syncfs-editor) [todomvc](#_sample_todomvc) 
<a name="_feature_systemInfo"></a>systemInfo | [mdns-browser](#_sample_mdns-browser) [printing](#_sample_printing) [systemInfo](#_sample_systemInfo) [tcpserver](#_sample_tcpserver) [webserver](#_sample_webserver) 
<a name="_feature_tts"></a>tts | [tts](#_sample_tts) 
<a name="_feature_usb"></a>usb | [blink1](#_sample_blink1) [usb-label-printer](#_sample_usb-label-printer) [usb_device-info](#_sample_usb_device-info) [usb_knob](#_sample_usb_knob) 
<a name="_feature_webstore"></a>webstore | [web-store](#_sample_web-store) 
<a name="_feature_webview"></a>webview | [appengine-channelapi_app](#_sample_appengine-channelapi_app) [io2012-presentation](#_sample_io2012-presentation) [tcpserver](#_sample_tcpserver) [url-handler](#_sample_url-handler) [webview-samples_browser](#_sample_webview-samples_browser) [webview-samples_declarative-web-request](#_sample_webview-samples_declarative-web-request) [webview-samples_insert-css](#_sample_webview-samples_insert-css) [webview-samples_local-resources](#_sample_webview-samples_local-resources) [webview-samples_multi-tab-browser](#_sample_webview-samples_multi-tab-browser) [webview-samples_new-window](#_sample_webview-samples_new-window) [webview-samples_new-window-user-agent](#_sample_webview-samples_new-window-user-agent) [webview-samples_shared-script](#_sample_webview-samples_shared-script) [webview-samples_user-agent](#_sample_webview-samples_user-agent) [webview-samples_webview](#_sample_webview-samples_webview) 


# Mobile support

You can generate native mobile versions of the samples below using the procedure
described [here](https://github.com/MobileChromeApps/mobile-chrome-apps/blob/master/README.md).




| Sample | Android support | iOS support |
| --- | --- | --- |
| analytics | Supported. | Supported. |
| calculator | Supported. Visual issues caused by fixed-size layout | Supported. Visual issues caused by fixed-size layout |
| dart |  | Supported. Visual issues caused by fixed-size layout |
| hello-world | Supported. | Supported. |
| hello-world-sync | Supported. sync storage doesn't actually sync - works local | Supported. sync storage doesn't actually sync - works local |
| identity | Supported. You need to add an Android OAuth app in the Cloud API console of the OAuth project. The app's SHA1 can be the debug one (see more [here](https://developers.google.com/console/help/new/#installedapplications)), and the package name is org.chromium.identity.MyApp. If you don't add the Android OAuth app and tries to use the OAuth client-id from the Chrome app, you will get a generic message GoogleAuthException |  |
| parrot-ar-drone | Supported. Communication to the Drone works, but the UI requires a connected gamepad. |  |
| restarted-demo |  | Supported. Restart must be done via Safari remote debugging. |
| rich-notifications | Supported. |  |
| tasks | Supported. |  |
| todomvc | Supported. |  |
| udp |  | Supported. |
| weather |  | Supported. |
| webserver | Supported. Directory picking doesn't work on some versions of Android |  |
| websocket-server |  | Supported. |




# Libraries and tools

* [Google APIs client library for Chrome Apps](https://github.com/GoogleChrome/chrome-extensions-samples/blob/main/_archive/apps/libraries/gapi-chrome-apps-lib)
* [Google Analytics for Chrome Apps and Extensions](https://github.com/GoogleChrome/chrome-platform-analytics)

---

## File: _archive/apps/libraries/gapi-chrome-apps-lib/README.md

# Google API javascript client library loader for Chrome Packaged Apps

Provides the Google API javascript client 'gapi' as
appropriate for hosted websites, or if in a Chrome packaged
app implement a minimal set of functionality that is Content
Security Policy compliant and uses the chrome identity api.

## Status

This library is likely not suitable for use without additional modifications.

## Usage

To be expanded upon, but essentially:
- Add 'identity' permission to manifest.
- Reference this script instead of the apis.google.com online version.
- Call gapi methods as usual.

## Examples:

* [Tasks app using GAPI](https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/tasks)

## Resources

* [JavaScript Client Library Reference](https://developers.google.com/api-client-library/javascript/reference/referencedocs)

---

## File: _archive/apps/samples/analytics/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/anfhlhgdnbpnglngmblhkdifdbcepjce"></a>


# Analytics

This example demonstrates how to include support for Google Analytics in your
packaged application. It uses the
[chrome-platform-analytics](https://github.com/GoogleChrome/chrome-platform-analytics) library,
which allows tracking app views or any arbitrary event to Google Analytics.
See more at the [project wiki](https://github.com/GoogleChrome/chrome-platform-analytics/wiki)

*Please note: You will need to modify main.js to include real Google Analytics credentials.*

## Resources

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [chrome-platform-analytics](https://github.com/GoogleChrome/chrome-platform-analytics/wiki)


## Screenshot

---

## File: _archive/apps/samples/analytics/manifest.json

{
  "name": "Analytics Sample App",
  "description": "An example app using Google Analytics without the Closure library",
  "version": "1.2.5",
  "manifest_version": 2,
  "icons": {"128": "icon_128.png"},
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "https://www.google-analytics.com/*",
    "storage"
  ]
}

---

## File: _archive/apps/samples/analytics/sample_support_metadata.json

{
  "sample": "analytics",
  "files_with_snippets": [ ],
  "android": {"works": true},
  "ios": {"works": true}
}

---

## File: _archive/apps/samples/appengine-channelapi/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/alieplnmdkoekpkepkfgickpmhhabfkl"></a>



# AppEngine Channel API example

This is an example of how to use the AppEngine's Channel API in a Chrome Packaged App. Since the Channel API is not directly compatible with the CSP restrictions in a packaged app, this sample uses a WebView and a "proxy" object that communicates with the Webview using async postMessage.

This code is an adaptation of the [Tic Tac Toe game](https://code.google.com/p/channel-tac-toe/) used by the AppEngine team to demonstrate the Channel API. The main modifications from the original game are:

- index.html is not rendered as a template in the server, it is embedded in the app. All responses from the server are JSON messages;
- the server doesn't use the appengine's user library, since that would require another authentication step. Instead, the server attributes a random UUID to the first user and another to the second. This user ID is returned to the client that uses it in the following calls. It is not secure, but simple enough for this sample. In a real application, this method would allow an eaversdropper to capture the GET request and replay with different commands;
- all the interations with the channel API are abstracted in the ChannelAPI object defined by channel_in_a_webview.js. This object communicates with the webview page (channel_in_a_webview.html), served to the webview from the appengine server.

To run:

- go to the `appengine` folder and type `dev_appserver.py .`
- install the Chrome Packaged App in the `app` folder
- run the Chrome packaged app twice and copy the game ID from one screen to the other
- play

* [Appengine Channel API](https://developers.google.com/appengine/docs/python/channel)
* [Webview](https://developer.chrome.com/apps/tags/webview)


## Screenshot

---

## File: _archive/apps/samples/appengine-channelapi/app/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/alieplnmdkoekpkepkfgickpmhhabfkl"></a>

---

## File: _archive/apps/samples/appengine-channelapi/app/manifest.json

{
  "manifest_version": 2,
  "name": "Appengine Channel API Sample",
  "version": "2",
  "minimum_chrome_version": "27",
  "permissions": ["webview", "http://localhost:8080/*"],
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/appengine-channelapi/appengine/app.yaml

application: moishetest
version: 1
runtime: python
api_version: 1

handlers:
- url: /static
  static_dir: static

- url: /.*
  script: chatactoe.py

inbound_services:
- channel_presence

---

## File: _archive/apps/samples/appsquare/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/loimmcmmgnhkbppokdpfhlccebcpicld"></a>


# AppSquare

This is a basic Foursquare client implemented as a packaged app.

It just displays recent checkins of the logged in user's friends. To log into Foursquare, it uses the [identity API](http://developer.chrome.com/apps/identity.html) (specfically, the `launchWebAuthFlow` method). Once it gets the OAuth token, it uses the [storage API](http://developer.chrome.com/apps/storage) to persist it. It also uses the [W3C Geolocation API](http://www.w3.org/TR/geolocation-API/) to pass in the current location to the Foursquare API.

When running it unpacked, it will normally have a different ID (the unpacked
extension ID is a hash of the path on disk). However, this will result in the
auth API not working, since the redirect URL will be different. To force the
unpacked app to have the same ID, add this key and value to `manifest.json`:

    "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDnyZBBnfu+qNi1x5C0YKIob4ACrA84HdMArTGobttMHIxM2Z6aLshFmoKZa/pbyQS6D5yNywr4KM/llWiY2aV2puIflUxRT8SjjPehswCvm6eWQM+r3mB755m48x+diDl8URJsX4AJ3pQHnKWEvitZcuBh0GTfsLzKU/BfHEaH7QIDAQAB"
(this is a base 64 encoded version of the app's public key)

The key *must* be removed before uploading it to the store.

## Resources

* [Identity](https://developer.chrome.com/docs/apps/app_identity/)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/appsquare/manifest.json

{
  "name": "Sample of Foursquare integration",
  "version": "7.1",
  "manifest_version": 2,
  "minimum_chrome_version": "33",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "icons": {
    "16": "icon16.png",
    "48": "icon48.png",
    "128": "icon128.png"
  },
  "permissions": [
    "identity",
    "geolocation",
    "storage",

    "https://api.foursquare.com/",
    "https://*.4sqi.net/",
    "https://foursquare.com/"
  ]
}

---

## File: _archive/apps/samples/appview/README.md

# Appview

These samples show how to use the `<appview>` tag to embed other Chrome Apps
within your Chrome App.

Add `host-app` and `embedded-app` and embed the `embedded-app` inside
`host-app`.

## Resources

* [Appview](https://developer.chrome.com/apps/tags/appview)
* [Runtime](http://developer.chrome.com/apps/app_runtime)
* [Window](http://developer.chrome.com/apps/app_window)
* [videoCapture](https://developer.chrome.com/apps/declare_permissions)

## Screenshot

---

## File: _archive/apps/samples/appview/embedded-app/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/mighjnlldblaiimoaidiggecdkobklfe"></a>

---

## File: _archive/apps/samples/appview/embedded-app/manifest.json

{
  "manifest_version": 2,
  "name": "Sample Appview Embedded",
  "description": "This sample shows how to allow your app to be embedded into another app",
  "version": "2",
  "minimum_chrome_version": "43",
  "permissions": ["videoCapture"],
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/appview/host-app/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/gkmjlnhjcdognmniiadfdhdlgdocngda"></a>

---

## File: _archive/apps/samples/appview/host-app/manifest.json

{
  "manifest_version": 2,
  "name": "Sample Appview Host",
  "description": "This sample shows how to request another app to be embedded.",
  "version": "2",
  "minimum_chrome_version": "43",
  "permissions": ["appview"],
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/blink1/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/kcpjgiicabigbjejdjnkflkdkjknkdch"></a>


# Blink(1)

This sample demos the `chrome.hid` API by controlling a [ThingM blink(1) mk2](http://blink1mk2.thingm.com/) RGB LED light via USB HID Feature Reports.

## APIs

* [HID](https://developer.chrome.com/apps/hid)
* [Runtime](https://developer.chrome.com/apps/app_runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Running this app on Linux

On Linux a udev rule must be added to allow Chrome to open the blink(1) device. Copy the file [`udev/61-blink1.rules`](https://raw.githubusercontent.com/GoogleChrome/chrome-extensions-samples/main/_archive/apps/samples/blink1/udev/61-blink1.rules) to `/etc/udev/rules.d`. It contains the following rule which allows anyone in the `plugdev` group read/write access the `hidraw` node for this device. See [USB Caveats](https://developer.chrome.com/apps/app_usb#caveats) for more details.

    # Make the blink(1) accessible to plugdev via hidraw.
    SUBSYSTEM=="hidraw", SUBSYSTEMS=="usb", ATTRS{idVendor}=="27b8", ATTRS{idProduct}=="01ed", MODE="0660", GROUP="plugdev"

## Screenshot

---

## File: _archive/apps/samples/blink1/manifest.json

{
  "name": "blink(1)",
  "manifest_version": 2,
  "version": "0.3",
  "minimum_chrome_version": "39.0.2140.0",
  "app": {
    "background": {
      "scripts": [ "main.js" ]
    }
  },
  "icons": {
    "128": "128.png"
  },
  "permissions": [
    "hid",
    {
      "usbDevices": [
        { "vendorId": 10168, "productId": 493 }
      ]
    }
  ]
}

---

## File: _archive/apps/samples/bluetooth-samples/battery-service-demo/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/kllncpgahapecnfkhefffabcemaknamh"></a>


Bluetooth Low-Energy Battery Service Demo
=========================================

This sample demonstrates how an app can read the battery level of a Bluetooth
Low Energy peripheral using the chrome.bluetoothLowEnergy API to communicate
with the Generic Attribute Profile (GATT) based Battery Service.


## Screenshot

---

## File: _archive/apps/samples/bluetooth-samples/battery-service-demo/manifest.json

{
  "name": "Battery Service Demo",
  "description": "Battery Service Demo using chrome.bluetoothLowEnergy",
  "version": "0.1",
  "minimum_chrome_version": "37",
  "icons": {
    "16": "bluetooth.png",
    "48": "bluetooth.png",
    "128": "bluetooth.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "bluetooth": {
    "low_energy": true,
    "uuids": ["180f"]
  }
}

---

## File: _archive/apps/samples/bluetooth-samples/device-info-demo/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/dblimghcclaakknbpajckcamddhjaaai"></a>


Bluetooth Low-Energy Device Information Service Demo
====================================================

This sample demonstrates how an app can communicate with the GATT based Device
Information Service on a Bluetooth Low Energy peripheral using the
chrome.bluetoothLowEnergy API.


## Screenshot

---

## File: _archive/apps/samples/bluetooth-samples/device-info-demo/manifest.json

{
  "name": "Device Information Service Demo",
  "description": "Device Information Demo using chrome.bluetoothLowEnergy",
  "version": "0.3",
  "minimum_chrome_version": "37",
  "icons": {
    "16": "bluetooth.png",
    "48": "bluetooth.png",
    "128": "bluetooth.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "bluetooth": {
    "low_energy": true,
    "uuids": ["180a"]
  }
}

---

## File: _archive/apps/samples/bluetooth-samples/heart-rate-sensor/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/nmlcgjldnboapnjdmllfcdenlljfjanm"></a>


Low-Energy Heart Rate Sensor
============================

This sample demonstrates using the chrome.bluetoothLowEnergy API to communicate
with the Generic Attribute Profile (GATT) based Heart Rate Service on a
Bluetooth Low Energy heart rate sensor.


## Screenshot

---

## File: _archive/apps/samples/bluetooth-samples/heart-rate-sensor/manifest.json

{
  "name": "Heart Rate Service Demo",
  "description": "Heart Rate Monitor Demo using chrome.bluetoothLowEnergy",
  "version": "0.1",
  "minimum_chrome_version": "37",
  "icons": {
    "16": "hr_sensor_icon16.png",
    "48": "hr_sensor_icon48.png",
    "128": "hr_sensor_icon128.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "bluetooth": {
    "low_energy": true,
    "uuids": ["180d"]
  }
}

---

## File: _archive/apps/samples/calculator/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/pelimflkpjiicnajdjcmekpioacmahkh"></a>


# Calculator

A sample application that provides a simple calculator. Supports basic operations
such as addition, multiplication, subtraction and division.

This sample also incorporates an MVC-style structure and requires jQuery for
DOM manipulation.

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/calculator/manifest.json

{
  "name": "Calculator",
  "description": "A simple calculator.",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "version": "1.2",
  "offline_enabled": true,
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions" : [
    "clipboardWrite"
  ],
  "icons": {
    "16": "assets/icon-128x128.png",
    "128": "assets/icon-128x128.png"
  }
}

---

## File: _archive/apps/samples/calculator/sample_support_metadata.json

{
  "sample": "calculator",
  "files_with_snippets": [ ],
  "android": {"works": true, "comments": "Visual issues caused by fixed-size layout"},
  "ios": {"works": true, "comments": "Visual issues caused by fixed-size layout"}
}

---

## File: _archive/apps/samples/camera-capture/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ilefapmpngkdnnllcnlcjffipbolhklf"></a>


# Camera Capture

Shows how to grab a camera feed using getUserMedia. Requires
the `videoCapture` permissions to be set in the manifest file.

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [videoCapture](https://developer.chrome.com/apps/declare_permissions)


## Screenshot

---

## File: _archive/apps/samples/camera-capture/manifest.json

{
  "name": "Camera Capture Sample",
  "version": "2.2",
  "manifest_version": 2,
  "icons": {
    "16": "camera.png",
    "128": "camera.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "videoCapture"
  ]
}

---

## File: _archive/apps/samples/clock/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/lhfiglpmnendbchimlikaeachppfonmm"></a>


# Clock

A widget-like application that provides a world clock, an alarm, a timer and a stopwatch.

## APIs

* [Sync Storage API](http://developer.chrome.com/apps/storage)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/clock/manifest.json

{
	"name": "World Clock",
	"version": "0.1.6",
	"manifest_version": 2,
	"minimum_chrome_version": "23",
	"description": "A world clock application.",
	"icons": {
		"16": "assets/icon.png",
		"128": "assets/icon.png"
	},
	"app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
	"offline_enabled": true,
	"permissions": ["geolocation",
									"storage",
									"notifications",
									"<all_urls>"
								 ]
}

---

## File: _archive/apps/samples/context-menu/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/biknlgbccocnocjfclpedecpgopjokik"></a>


# Context menus

Sample that shows how to use the [context menu API](http://developer.chrome.com/apps/contextMenus) in an app to manage various application context menus, such as menus that only apply to particular windows, menus that apply to selections, and context menus that work on the app launcher.

## APIs

* [Context menu API](http://developer.chrome.com/apps/contextMenus)
* [Runtime](http://developer.chrome.com/apps/app_runtime)
* [Window](http://developer.chrome.com/apps/app_window)

## Screenshot

---

## File: _archive/apps/samples/context-menu/manifest.json

{
  "manifest_version": 2,
  "name": "Context Menu Sample",
  "version": "4",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["contextMenus"]
}

---

## File: _archive/apps/samples/dart/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/pcbbhbaibaphjlbaoahmahgmncbdkeli"></a>


# Using DART in a Chrome Packaged App

A simple Dart sample transformed into a Chrome packaged app. Please, use Dart version equal or greater than
   0.1.2.0_15284_chrome-bot (Fri Nov 23 05:26:52 2012)
if you want to recompile dart to JS. See the correct, CSP compatible, command-line parameter in the compile.sh script.

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/dart/manifest.json

{
  "manifest_version": 2,
  "name": "Hello Dart! Sample",
  "version": "2",
  "minimum_chrome_version": "23",
  "icons": {"128": "images/dart_icon.png"},
  "app": {
    "background": {
      "scripts": ["js/main.js"]
    }
  }
}

---

## File: _archive/apps/samples/dart/pubspec.yaml

name: dart-clock-packaged-app-sample

dependencies:
  browser: any

---

## File: _archive/apps/samples/dart/sample_support_metadata.json

{
  "sample": "dart",
  "files_with_snippets": [ ],
  "ios": {"works": true, "comments": "Visual issues caused by fixed-size layout"}
}

---

## File: _archive/apps/samples/desktop-capture/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/mhkidniocjdaiddjckopkigjmjbadfji"></a>


# Desktop Capture

Shows how to grab a desktop capture feed using getUserMedia. Requires
the appropriate permissions (`desktopCapture`) to be set in the manifest file.

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [desktopCapture](https://developer.chrome.com/apps/desktopCapture)


## Screenshot

---

## File: _archive/apps/samples/desktop-capture/manifest.json

{
  "name": "Desktop Capture Sample",
  "version": "2",
  "manifest_version": 2,
  "icons": {
    "16": "desktop.png",
    "128": "desktop.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "desktopCapture"
  ]
}

---

## File: _archive/apps/samples/dialog-element/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/mikhnkopoddcomlgmcjgfnaccjhibiec"></a>


# Dialog Element

The WHATWG defines a new element called `<dialog>` that can be used to define modal and modeless dialogs within an HTML page. This example shows how to use this new element.

NOTE: This sample requires M31 or later in Chrome, and if necessary you might have to enable experimental web features in the chrome://flags page.

```javascript
var dialog = document.querySelector('#dialog1');
document.querySelector('#show').addEventListener("click", function(evt) {
  dialog.showModal();
});
document.querySelector('#close').addEventListener("click", function(evt) {
  dialog.close("thanks!");
});

dialog.addEventListener("close", function(evt) {
  document.querySelector('#result').textContent = "You closed the dialog with: " + dialog.returnValue;
});

// called when the user Cancels the dialog, for example by hitting the ESC key
dialog.addEventListener("cancel", function(evt) {
  dialog.close("canceled");
});
```

## Resources

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/dialog-element/manifest.json

{
  "manifest_version": 2,
  "name": "Dialog Element Example",
  "version": "2",
  "minimum_chrome_version": "31",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/diff/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/neifiophhpiohjlhiohlhlekkfokcepk"></a>


# Diff

A non-trivial application to diff two files choosen by the user. This app shows how you can open for reading and for writing files in the user's computer, as long as the file was explicitly selected by the user. It uses the Filesystem API, which is an extension of the HTML5 Filesystem API.

## Try it: [Diff Tool Sample](https://chrome.google.com/webstore/detail/diff-tool/knammbkafbpckgibgjilgpcnpacmecme)

## APIs

* [Local Storage API](http://developer.chrome.com/apps/storage) to save history of selected files
* [Filesystem API](http://developer.chrome.com/apps/app_storage.html) to allow the user to pick arbitrary files from the disk and save them back.
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/diff/manifest.json

{
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "name": "Diff Tool",
  "description": "View diff and merge two files.",
  "version": "0.1.8",
  "offline_enabled": true,
  "app": {
    "background": {
      "scripts": ["js/background.js"]
    }
  },
  "permissions": ["storage",
                  "unlimitedStorage",
                  {"fileSystem": ["write"]},
                  "clipboardRead",
                  "clipboardWrite",
                  "<all_urls>"
                 ],
  "icons": { "16": "img/icon_16.png",
             "48": "img/icon_48.png",
             "128": "img/icon_128.png"
           }
}

---

## File: _archive/apps/samples/dojo/README.md

Dojo
====
This directory contains a script (build.sh) to generate an "one-app-to-rule-them-all": an app that executes all the other apps in the repository.

To create the app, run `build.sh` on your Mac or Linux. It is necessary to have Perl installed (MacOsX and Linux both have by default). The generated kitchen-sink app will be in `dojo.crx`.

Special thanks to @tomtasche for the idea and for the non-automatic implementation, which ultimately resulted in this script.

Please join the [Chromium Apps](https://groups.google.com/a/chromium.org/forum/?fromgroups#!forum/chromium-apps) group for general discussion. We're also available on IRC at #chromium-apps ([Freenode](http://freenode.net/)).

---

## File: _archive/apps/samples/filesystem-access/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ehbhjpchdgepkgjhfkhpkjdbnljedllm"></a>


# Filesystem access

Shows basic usage of accessing (read/write) files and directories using the `chrome.fileSystem` API.

NOTE: This sample requires Milestone 31 or later of Chrome, since it uses the new directory permission.

## APIs

* [chrome.fileSystem](http://developer.chrome.com/apps/fileSystem)

## Screenshot

---

## File: _archive/apps/samples/filesystem-access/manifest.json

{
  "name": "Filesystem Access Sample",
  "version": "2.1",
  "manifest_version": 2,
  "minimum_chrome_version": "31",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    {"fileSystem": ["write", "retainEntries", "directory"]},
    "storage"
  ],
  "file_handlers": {
    "text": {
      "types": [
          "text/*"
      ]
    }
  }
}

---

## File: _archive/apps/samples/frameless-window/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hjjdaddngnaofnfjpajdcbdmkegiakec"></a>


# Frameless window

A sample application to showcase how you can use frame:'none' windows to allow total customization of the window's real estate. Initially, the window is open with no titlebar. When you check one of the titlebars, it is added to the appropriate position. Notice that the added titlebars are the only parts of the window that allow dragging. This is achieved through a special CSS property applied to what is draggable or non-draggable (by default, the whole window is not draggable): `-webkit-app-region: drag|no-drag;`

Caveat: `-webkit-app-region: drag;` *will* disable some customizations such as custom mouse pointers.

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/frameless-window/manifest.json

{
  "name": "Frameless Window Sample",
  "description": "Chrome platform app.",
  "manifest_version": 2,
  "version": "0.2",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  }
}

---

## File: _archive/apps/samples/gcm-notifications/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/gpededflkpcoehfjpdecdkoiagajloin"></a>


# GCM Notifications Sample

Demonstrates the capability to receive the push messages from Google Cloud Messaging (GCM) and show notifications.

## APIs

* [gcm](https://developer.chrome.com/apps/gcm)
* [storage](https://developer.chrome.com/apps/storage)
* [notifications](https://developer.chrome.com/apps/notifications)


## Screenshot

---

## File: _archive/apps/samples/gcm-notifications/manifest.json

{
  "name": "GCM Notifications",
  "description": "Chrome platform app.",
  "manifest_version": 2,
  "version": "0.1",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": ["gcm", "storage", "notifications"],
  "icons": { "128": "gcm_128.png" }
}

---

## File: _archive/apps/samples/gdrive/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/jpabeekbjicamajjcfejnochhmlbpgjh"></a>


# Google Drive Uploader

Uses the `chrome.identity.getAuthToken()` API to perform OAuth2 and
access the Google Drive API.

To upload files: drag in files from the desktop onto the app.

## APIs

* [Identity](http://developer.chrome.com/apps/identity.html)


## Screenshot

---

## File: _archive/apps/samples/gdrive/manifest.json

{
  "name": "Google Drive Sample",
  "version": "0.0.5",
  "manifest_version": 2,
  "minimum_chrome_version": "29",
  "oauth2": {
    "client_id": "696763237280-bkfouv0030la6l9t2g1elim04no836fq.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/drive"
    ]
  },
  "icons": {
    "128": "icon_128.png"
  },
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXaBUTn1PNjYo8fg+1JBmWBA3bdrn7siqzkY0tYeuNHIWi5ji+6V5Y3QWYRFQh3AFwrZaBItvaM3fsit7K++kDoD67VhYGrGd+mjl4Htmp+/HbzzCQMBJdTdTOvR722+VHmIttzbe/I7GB3a74KvPYfUENONj1tswyKkuXeMgFOQIDAQAB",
  "app": {
    "background": {
      "scripts": ["js/background.js"]
    }
  },
  "permissions": [
    "identity",
    "https://ssl.gstatic.com/",
    "https://www.googleapis.com/",
    "https://accounts.google.com/"
  ]
}

---

## File: _archive/apps/samples/github-auth/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/laolmfhjaobpboigjfbclcphckmjodlp"></a>


# GitHub Auth

A sample application that uses the
[Identity API](https://developer.chrome.com/apps/identity) to
request identification information about the user's GitHub account. After user
logs on to GitHub and authorizes the application to use their information, both
users name and email address (if available) will be displayed.

This app uses the launchWebAuthFlow flow of the Identity API, which is enabling
authorization with providers other than Google. For autorization using Google
Account check out the [Identity sample application](../identity).

## APIs

* [Identity](https://developer.chrome.com/apps/identity)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/github-auth/manifest.json

{
  "name": "GitHub Auth Sample",
  "version": "3.1",
  "manifest_version": 2,
  "minimum_chrome_version": "33",
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCXZ6+N4gRLyUUtj79Z3TClsrA32yU9ekkdKXlGylaRhtjMNLN+oBekfDsBfASdkGu35r48v+GiHgCTeySFgm/MfOBavutudcr1Cm/+CD6Y7XSQBMHQn06sJgsMk0eG6FcP797Ofig2MHmouaoHCPfpmXfcbgZZYioh29PWJ6oq7QIDAQAB",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "identity",
    "https://github.com/"
  ]
}

---

## File: _archive/apps/samples/hello-world/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/nmfpplkdkcbhediajmbhljkafnlahcda"></a>


# Hello World

This is a starter application. It contains a basic manifest file with no
additional permissions. The manifest denotes a background script, main.js,
detailed below:

```javascript
chrome.app.runtime.onLaunched.addListener(function() {
  // Center window on screen.
  var screenWidth = screen.availWidth;
  var screenHeight = screen.availHeight;
  var width = 500;
  var height = 300;

  chrome.app.window.create('index.html', {
    id: "helloWorldID",
    outerBounds: {
      width: width,
      height: height,
      left: Math.round((screenWidth-width)/2),
      top: Math.round((screenHeight-height)/2)
    }
  });
});
```

This simply waits for the launch event for the application (`chrome.app.runtime.onLaunched.addListener`)
and, at that point, creates a window using a basic HTML page, index.html, as the source.

## Resources

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/hello-world/manifest.json

{
  "manifest_version": 2,
  "name": "Hello World",
  "version": "2.1",
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/hello-world/sample_support_metadata.json

{
  "sample": "hello-world",
  "files_with_snippets": [ ],
  "android": {"works": true},
  "ios": {"works": true}
}

---

## File: _archive/apps/samples/hello-world-sync/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ajjcafkkflbcealbcfjajolnkogffgcb"></a>


# Hello World storage.sync

Use chrome.storage.sync to share small chunks of data among all of your Chrome devices. To test, open this app in two different devices, both signed in with the same user.

Important: needs "key" in manifest.json to support testing outside of CWS, so that sync storage is shared among different instances.


    // app.js
    chrome.storage.sync.set({"myValue": newValue}, mycallback);
    ...
    chrome.storage.onChanged.addListener(
      function(changes, namespace) {
        // do something
      }
    );
    ...
    chrome.storage.sync.get("myValue",
      function(val) {
        // do something
      }
    );

## APIs

* [Storage sync](http://developer.chrome.com/extensions/storage)

## Screenshot

---

## File: _archive/apps/samples/hello-world-sync/manifest.json

{
  "manifest_version": 2,
  "version": "2",
  "name": "Syncable storage sample",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["storage"],

  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwhGKZ4KMgoHDmBGs+BrYueDkiiPAt7QjHbcxeNs3JBaPah/nNsz8e4E38TeEKNyHg+0DoVQlV6gvmuXy/bAbpCBSk3/y+/J5TFCjSgVLhm7nQPeE3RIR2/kVZIaY1YIabxqdC4N0RmAef+EBR+WB4RqFsV78TpzgpNqDinkhfPwIDAQAB"
}

---

## File: _archive/apps/samples/hello-world-sync/sample_support_metadata.json

{
  "sample": "hello-world-sync",
  "files_with_snippets": [ ],
  "android": {"works": true, "comments": "sync storage doesn't actually sync - works local"},
  "ios": {"works": true, "comments": "sync storage doesn't actually sync - works local"}
}

---

## File: _archive/apps/samples/hid/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ohndmecdhlgohpibepbboddcoecomnpc"></a>


chrome.hid API Sample
=====================

This sample demonstrates usage of the `chrome.hid` API.

## APIs

* [HID](https://developer.chrome.com/apps/hid)
* [Runtime](https://developer.chrome.com/apps/runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Screenshot

---

## File: _archive/apps/samples/hid/manifest.json

{
  "name": "HID Sample App",
  "manifest_version": 2,
  "version": "0.3.2",
  "minimum_chrome_version": "45.0.2439.3",
  "app": {
    "background": {
      "scripts": [ "main.js" ]
    }
  },
  "permissions": [ "hid" ]
}

---

## File: _archive/apps/samples/identity/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/oficlfehfenioickohognhdhmmcpceil"></a>


# Identity

A sample application that uses the
[Identity API](https://developer.chrome.com/apps/identity.html) to
request information of the logged in user and present this info on the screen.
If the user has a profile picture, an XMLHttpRequest request is also sent to
grab the image and show it in the app.

This app uses the getAuthToken flow of the Identity API, so it only works with
Google accounts. If you want to identify the user in a non-Google OAuth2 flow,
you should use the launchWebAuthFlow method instead.

## APIs

* [Identity](https://developer.chrome.com/docs/apps/app_identity/)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/identity/manifest.json

{
  "name": "Identity API Sample",
  "version": "3.2",
  "manifest_version": 2,
  "minimum_chrome_version": "29",
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCDJB6ZGcGxtlr/34s+TKgi84QiP7DMekqOjSUS2ubmbhchlM6CN9gYdGQ1aBI3TBXG3YaAu+XyutFA8M8NLLWc4OOGByWaGV11DP6p67g8a+Ids/gX6cNSRnRHiDZXAd44ATxoN4OZjZJk9iQ26RIUjwX07bzntlI+frwwKCk4WQIDAQAB",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["identity", "https://accounts.google.com/*", "https://www.googleapis.com/*"],
  "oauth2": {
    // client_id below is specific to the application key. Follow the
    // documentation to obtain one for your app.
    "client_id": "497291774654.apps.googleusercontent.com",
    "scopes": ["https://www.googleapis.com/auth/userinfo.profile"]
  }
}

---

## File: _archive/apps/samples/identity/sample_support_metadata.json

{
  "sample": "identity",
  "files_with_snippets": [ "identity.js" ],
  "android": {"works": true, "comments": "You need to add an Android OAuth app in the Cloud API console of the OAuth project. The app's SHA1 can be the debug one (see more <a href=\"https://developers.google.com/console/help/new/#installedapplications\">here</a>), and the package name is org.chromium.identity.MyApp. If you don't add the Android OAuth app and tries to use the OAuth client-id from the Chrome app, you will get a generic message GoogleAuthException"}
}

---

## File: _archive/apps/samples/identity/sample_support/README.md

ATTENTION contributors: this directory (sample_support) should not be changed.
It is automatically updated and should not contain anything that is specific
to this sample.

---

## File: _archive/apps/samples/image-edit/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/foibnkkcggahkmckladbmgkajodpcjfh"></a>


# Crop Tool - Image Edit

A tool to crop images.

Open files, or drag and drop them. Perform a simple crop and save the result.

Works offline.

## Try it: [Crop Tool - Image Edit](https://chrome.google.com/webstore/detail/crop-tool-image-edit/foibnkkcggahkmckladbmgkajodpcjfh)

## Screenshot

---

## File: _archive/apps/samples/image-edit/manifest.json

{
  "name": "Crop Tool - Image Edit",
  "version": "8.1",
  "manifest_version": 2,
  "minimum_chrome_version": "28",
  "description": "A tool to crop images.",
  "offline_enabled": true,
  "icons": { "128": "assets/icon_128.png" },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    {"fileSystem": ["write", "retainEntries"]},
    "storage"
  ],
  "file_handlers": {
    "image": {
      "types": [
        "image/png",
        "image/jpeg"
      ]
    }
  }
}

---

## File: _archive/apps/samples/instagram-auth/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/baaenjnmlaejajnalldcecpdafeggelb"></a>


# Instagram Demo

This is a basic Instagram client implemented as a packaged app.  This demonstration simply displays the users logged-in view as raw JSON.

To log into Instagram, it uses the [identity API](http://developer.chrome.com/apps/identity.html) (specfically, the `launchWebAuthFlow` method). Once it gets the OAuth token it makes a request to an authenticated endpoint to get the JSON feed of the user's view.

When running it unpacked, it will normally have a different ID (the unpacked
extension ID is a hash of the path on disk). However, this will result in the
auth API not working, since the redirect URL will be different. To force the
unpacked app to have the same ID, add this key and value to `manifest.json`:

    "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCM9NA1cLHYrp+htpkHWHmXKAXja/DNfyrSb2mkvfGRT/JVxbPDXJqeRXwhqwYpxgNxMxcD8skIqSy6zHWqtymzjqyFVbMg4ox7qyLC7dEMdx0TgstYjtC3KjEZNM7VM0gRlReJoQuSM/GSIGnAlUjP7Ahd1XF16JgZPICSoeFiTQIDAQAB",

(this is a base 64 encoded version of the app's public key)

The key *must* be removed before uploading it to the store.

## Resources

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Identity](https://developer.chrome.com/docs/apps/app_identity/)


## Screenshot

---

## File: _archive/apps/samples/instagram-auth/manifest.json

{
  "name": "__MSG_appName__",
  "version": "2.1",
  "manifest_version": 2,
  "minimum_chrome_version": "33",
  "description": "__MSG_appDescription__",
  "default_locale": "en",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["identity", "https://api.instagram.com/*"]
}

---

## File: _archive/apps/samples/instagram-auth/_locales/en/messages.json

{
  "appName": {
    "message": "Sample of Instagram Integration",
    "description": "The name of the application"
  },
  "appDescription": {
    "message": "Displays the users logged-in view as raw JSON",
    "description": "The description of the application"
  }
}

---

## File: _archive/apps/samples/io2012-presentation/README.md

This is the slide deck for the Google I/O 2012 "The Next Evolution of Chrome Apps" session. It itself is a Chrome packaged app. It currently runs in Chrome 22.0.1190.0 or later (as of 6/29/2012, this means canary channel only).

The session itself (including live demos) is [available on YouTube](https://www.youtube.com/watch?v=j8oFAr1YR-0).

The text editor used in the presentation is itself a Chrome packaged app. It's [available in the samples repository](https://github.com/GoogleChrome/chrome-app-samples/tree/main/_archive/apps/samples/mini-code-edit).

The `helloworld` directory contains the "Hello World!" demo from the session, including the variant with the XSS issue (which can't be exploited due to CSP).

The `diff-sample-files` directory contains the two local files that were diff-ed during the offline diff tool demo (the diff tool itself is also [available in the samples repository](https://github.com/GoogleChrome/chrome-app-samples/tree/main/_archive/apps/samples/diff)).

The `servo` directory contains the standalone version of the serial port API spinner demo. It only does writes to the serial port. The [complete version in the samples repository](https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/servo) has the full read/write implementation.

The `windowing_api` directory contains the source for the custom window frame and windowing API documentation (it's launched via the "Demo" link on slide 7).

## Screenshot

---

## File: _archive/apps/samples/io2012-presentation/manifest.json

{
  "manifest_version": 2,
  "name": "Apps I/O 2012 Presentation",
  "description": "Chrome Apps IO 2012 presentation.",
  "version": "1.3",
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["js/main.js"]
    }
  },
  "icons": {
    "16": "images/icon-16.png",
    "128": "images/icon-128.png"
  },
  "permissions": [
    "webview",
    "serial",
    "storage",
    "videoCapture"
  ]
}

---

## File: _archive/apps/samples/io2012-presentation/diff-sample-files/new-manifest.json

{
  "manifest_version": 2,
  "name": "Hello world",
  "version": "0.0.1",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "experimental"
  ]
}

---

## File: _archive/apps/samples/io2012-presentation/diff-sample-files/old-manifest.json

{
  "name": "Hello world",
  "version": "0.0.1",
  "app": {
    "launch": {
      "local_path": "main.html"
    }
  }
}

---

## File: _archive/apps/samples/io2012-presentation/helloworld/manifest.json

{
  "manifest_version": 2,
  "name": "Hello world",
  "version": "0.0.2",
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/io2012-presentation/servo/manifest.json

{
  "name": "Servo Serial Sample",
  "version": "0.4",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "description": "Show off serial functionality.",

  "app": {
    "background": {
      "scripts": [ "background.js" ]
    }
  },

  "permissions": [
    "videoCapture", "serial"
  ]
}

---

## File: _archive/apps/samples/ioio/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hknlnnbpihcamokfeggmahjgldbcpkof"></a>


# IOIO Bluetooth device

Very simple IOIO client. Tested with [this hardware](http://www.adafruit.com/blog/2012/06/15/new-product-ioio-mint-portable-android-development-kit/)

The constants and information about the protocol was taken from https://github.com/ytai/ioio/wiki/

## Caveats:
* The bluetooth API is only available on dev-channel Chrom(e|ium)OS
* Resource clean-up isn't happening properly yet: you will likely have to disable/enable bluetooth between runs of the program or the connection will fail

## APIs

* [Bluetooth](http://developer.chrome.com/apps/bluetooth)

## Screenshot

---

## File: _archive/apps/samples/ioio/manifest.json

{
  "manifest_version": 2,
  "name": "IOIO Sample",
  "description": "Blinks the on-board LED",
  "version": "1.1",
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "bluetooth"
  ]
}

---

## File: _archive/apps/samples/keyboard-handler/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/keyboard-handler-sample/pcbbaldjljokfnnkphllabnpolciapjc"></a>


# Keyboard Handler Sample

This sample handles all keyboard events (preventing default behavior) and
maintains a dictionary of the state of each key.

It provides an easy way to check if the key strokes you are interested in can
be captured by a chrome packaged app, and learn what the appropriate keyCode
is for them.

## Screenshot


## Credit

Icon image adapted from [David Peters, Wikimedia Foundation](http://commons.wikimedia.org/wiki/File:Keyboard-icon_Wikipedians.svg)

---

## File: _archive/apps/samples/keyboard-handler/manifest.json

{
  "manifest_version": 2,
  "name": "Keyboard Handler Sample",
  "version": "3.1",
  "icons": {
    "128": "assets/icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  }
}

---

## File: _archive/apps/samples/managed-in-app-payments/README.md

# Managed In-App Payments with Google Wallet and the Chrome Web Store API

You can use [managed in-app payments with Google Wallet and the Chrome Web Store API](https://developer.chrome.com/webstore/payments-iap) to sell virtual
goods within a Chrome App. When you use managed in-app payments, the
Chrome In-App Payments Service (embedded in Chrome) communicates with:
 * The Chrome Web Store to get the list of available products, including:
   * Items available for purchase
   * Items purchased by the user
 * The Google Wallet servers to handle all the required checkout details.

This means that you can easily manage your virtual good inventory and licensing through the Chrome Web Store Developer Dashboard, and the Chrome Web Store will take care of the nitty gritty details, including financial transaction processing.

The actual integration work to enable managed in-app payments is similar to using the [Google Wallet for Digital Goods API](https://web.archive.org/web/20130308145345/https://developers.google.com/commerce/wallet/digital/docs/) (now deprecated), except that managed in-app payments require you to embed a piece of JavaScript ([buy.js](https://raw.githubusercontent.com/GoogleChrome/chrome-extensions-samples/main/_archive/apps/samples/managed-in-app-payments/scripts/buy.js)) within your app to trigger the payment flow.

---

## File: _archive/apps/samples/managed-in-app-payments/manifest.json

{
  "name": "Managed In App Payment Sample",
  "version": "0.1.0.1",
  "manifest_version": 2,
  "minimum_chrome_version": "29",
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAoUq1cKlKbPLfHlA+x/eTxPA5ZSz4bd/fgKInayClJQTc6RRATDfRshCXjn8Eu7VpgsfEG3nLGD0C+8SdDxSGxj51k5elLRcRhDLODjxMshjPpziRm8wxalrGDEVOjD8GX6DG1YXQDMq6Hd9fxSj/ZEBjGvDWtoL3wBZ1M2/+aop/5Z6y9rQDOKI8PmCaIpWmIBS1+zZub9wc/RVNA2glGaSb0N71FxN/W5PhlWwJciG/iIJHhCM888kIPODJq8JgFKz1jO8/3L8YfO9/lzbKZLPnRMrN5q5KZDbG22l6BccSXnqYu4JX9RzXK0HcRzO5SI1l5XPAeZAhNY5M+rZULwIDAQAB",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "icons": {
    "128": "/images/128.png"
  }
}

---

## File: _archive/apps/samples/manga-cam/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/cnehcenehakkickcnoiaemcpjpaigmbb"></a>


# Manga Camera

Chrome Packaged App with `videoCapture` permission can query user media without a warning. It is also possible to process the image captured by a video camera using WebGL. You can then save the pictures you take to the the sync file system. The pictures will be synced among your devices.

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Sync File Systesm](http://developer.chrome.com/apps/syncFileSystem)
* [videoCapture](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/manga-cam/manifest.json

{
  "name": "Manga Cam",
  "version": "0.4",
  "manifest_version": 2,
  "minimum_chrome_version": "28",
  "description": "Take photos and turn them into manga-style.",
  "offline_enabled": true,
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "icons": {
    "16": "images/camera-128.png",
    "48": "images/camera-128.png",
    "128": "images/camera-128.png"
  },
  "requirements": {
    "3D": {
      "features": ["webgl"]
    }
  },
  "permissions": [ "videoCapture", "syncFileSystem" ]
}

---

## File: _archive/apps/samples/mdns-browser/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/kipighjpklofchgbdgclfaoccdlghidp"></a>


# mDNS browser

This is a non-trivial sample which uses the UDP multicast support in Chrome Packaged Apps to browse mDNS servers. mDNS protocol is usually used for home appliance devices, like the Apple's Bonjour. Read more about the mDNS protocol at this [Wikipedia's article](http://en.wikipedia.org/wiki/Multicast_DNS)

# Known Issues

* IPv6 is not supported.
* Broadcast responses are not supported.

## APIs

* [Sockets](https://developer.chrome.com/apps/sockets_udp)
* [Network](https://developer.chrome.com/apps/system_network)
* [Runtime](http://developer.chrome.com/apps/app_runtime)
* [Window](http://developer.chrome.com/apps/app_window)


## Screenshot

---

## File: _archive/apps/samples/mdns-browser/manifest.json

{
  "name": "mDNS Browser",
  "description": "Browses mDNS services on the local network",
  "manifest_version": 2,
  "version": "0.7",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "sockets": {
     "udp": { "bind": "*", "send": "*" }
  },
  "permissions": [ "system.network" ],
  "icons": { "128": "img/icon-128.png", "16": "img/icon-16.png" }
}

---

## File: _archive/apps/samples/media-gallery/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/lidepfgfmameopopgagobnpndcnfgbnk"></a>


# Media Gallery

This is a sample application that uses the [media gallery](http://developer.chrome.com/apps/mediaGalleries) API to read and show user's media without requiring direct filesystem permission.

## APIs

* [Media gallery](http://developer.chrome.com/apps/mediaGalleries)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/media-gallery/manifest.json

{
  "name": "Media Gallery Sample",
  "version": "0.2.5",
  "manifest_version": 2,
  "description": "Used to test Media Gallery API",
  "permissions": [{
      "mediaGalleries": ["read", "scan", "allAutoDetected"]
  }],
  "icons": {
    "128": "mga-128color.png"
  },
  "app": {
     "background": {
       "scripts": ["runtime.js"]
     }
  }
}

---

## File: _archive/apps/samples/messaging/README.md

# Messaging

This sample shows how to communicate between two apps or one app and one extension. Add app1, app2 and extension to Chrome and play with sending messages between them.

## Resources

* [Messaging](https://developer.chrome.com/docs/extensions/reference/app_runtime#method-sendMessage)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/messaging/app1/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/mcfaknmahgbmjlbondlciokappnnjbnf"></a>

---

## File: _archive/apps/samples/messaging/app1/manifest.json

{
  "manifest_version": 2,
  "name": "Sample Messaging App1",
  "description": "This sample shows how to communicate between two apps or one app and one extension.",
  "version": "2",
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icon_16.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/messaging/app2/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hdligeegpimhdjepakblhneiekccbhol"></a>

---

## File: _archive/apps/samples/messaging/app2/manifest.json

{
  "manifest_version": 2,
  "name": "Sample Messaging App2",
  "description": "This sample shows how to communicate between two apps or one app and one extension.",
  "version": "2",
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icon_16.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/messaging/extension/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ihhkahhkmiddbnfhlglocakcdfbgddkj"></a>

---

## File: _archive/apps/samples/messaging/extension/manifest.json

{
  "name": "Sample Messaging extension",
  "version": "1.3.1",
  "description": "This sample shows how to communicate between two apps or one app and one extension.",
  "browser_action": {
    "default_title": "Send message to other apps",
    "default_icon": "icon_16.png",
    "default_popup": "index.html"
  },
  "background": {
    "scripts": ["eventPage.js"],
    "persistent": false
  },
  "permissions": ["notifications"],
  "manifest_version": 2
}

---

## File: _archive/apps/samples/mini-code-edit/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/inbjbbebnhailhhkfaaokegkfjlmgabb"></a>


# Mini code editor

A non-trivial sample with basic features of a code editor, like syntax detection and syntax highlight. If also uses the extended FileSystem API that allows a user to select files from the disk so the app can read and write to that file.

## APIs

* [chrome.fileSystem](http://developer.chrome.com/apps/fileSystem)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/mini-code-edit/manifest.json

{
  "name": "MiniCodeEdit",
  "version": "0.1.12",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "description": "A very small code editor.",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },

  "permissions": [
    {"fileSystem": ["write"]},
    "unlimitedStorage",
    "contextMenus"
  ],

  "icons": {
    "16":  "img/16x16/file_edit.png",
    "32":  "img/32x32/file_edit.png",
    "64":  "img/64x64/file_edit.png",
    "128": "img/128x128/file_edit.png"
  },

  "commands" : {
    "cmdNew": {
        "suggested_key": {
          "default": "Ctrl+Shift+1"
        },
        "global": true,
        "description": "Create new window"
    }
  }
}

---

## File: _archive/apps/samples/mini-code-edit/cm/README.md

# CodeMirror 2

CodeMirror 2 is a rewrite of [CodeMirror
1](http://github.com/marijnh/CodeMirror). The docs live
[here](http://codemirror.net/doc/manual.html), and the project page is
[http://codemirror.net/](http://codemirror.net/).

---

## File: _archive/apps/samples/mini-code-edit/cm/mode/python/LICENSE.txt

The MIT License

Copyright (c) 2010 Timothy Farrell

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

---

## File: _archive/apps/samples/mini-code-edit/img/README.txt

Icons from http://www.smashingmagazine.com/2008/09/02/simplicio-a-free-icon-set/

---

## File: _archive/apps/samples/multicast/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/bnheobjndkaipbloffigkiddhcbblihl"></a>


# Multicast Chatting



This sample shows how to send and receive [multicast
socket](http://en.wikipedia.org/wiki/Multicast) diagrams in local network from
Chrome apps. It joins the multicast socket group 237.132.123.123 and listens on
port 3038.

To support multicast socket messaging in your local network requires the
support of your router. The connectivity of this app varies depending on the
network configuration.

__Warning: This is a simple chatting app demonstrating the usage of multicast
socket Chrome app API. It is not designed for reliable communication. Privacy
and reachability of the message is NOT guaranteed. It is also possible that a
user is able to send to another user while not being able to receive from the
latter.__

## APIs
* [Messaging](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Runtime](https://developer.chrome.com/apps/app.runtime.html)
* [Storage](https://developer.chrome.com/apps/storage.html)
* [Sockets](https://developer.chrome.com/apps/sockets_udp)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/multicast/manifest.json

{
  "name": "Multicast Chat Sample",
  "version": "0.3",
  "manifest_version": 2,
  "minimum_chrome_version": "33",
  "description": "Sending/Receiving multicast diagrams.",
  "app": {
    "background": {
      "scripts": [
        "MulticastSocket.js",
        "ChatClient.js",
        "background.js"]
    }
  },

  "icons": {
    "128": "128.png"
  },

  "sockets": {
    "udp": {
      "bind": "*",
      "send": "*",
      "multicastMembership": ""
    }
  },
  "permissions": [ "storage" ]
}

---

## File: _archive/apps/samples/one-time-payment/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ebcgmmcbgnpoclkoibogeiokfdmjbbob"></a>

# One time payments & free trials in Chrome Apps

If you choose to charge users for your Chrome App, there are several options
available to you. The Chrome Web Store has a built-in
[one-time payment system](https://developers.google.com/chrome/web-store/docs/payments-otp)
called Chrome Web Store Payments.  With one-time payments, you can also
offer a free trial experience for your users.

### Note:
The version that is published in the Chrome Web Store is not available for sale! This is to prevent people from accidentally purchasing a sample.  When installed, the user will be issued with a FREE_TRIAL license.  If you want to see the end to end flow, complete with the ability to purchase the app, you'll need to publish it in the store yourself and enable one time payments.  See the [documentation](https://developers.google.com/chrome/web-store/docs/payments-otp#using-otps) for full details.

To test with the version that is in the Chrome Web Store, you'll need
to add the the key below to your manifest:

```"key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtqhlRmNTTzJXvfYcLEW9sTzOJzDxJr5M80XgolHc1EYdvjdg1/e4+fPadq3vAueArzwvEtFji2Ax4Aqo99kA1qYyw9ji8RdlUArvJCTIq/7xPMoMPWHCb3wPfZ7IYV4U6h841dUjrOng7yxN9RIYSLHPpqQG0tBSh3sx7pxjYWx6DxhxOlP9BAQ9W8McSaoI8Wy/4hCJb0k6hkGrD1q7mQIWODg7aF03+LvWuF+GNZJfVFU37w6IFo2bcmfJugW/Lu4oG4eYuYziWFXNfgnwaHyrA5MLPrQJ3jZKiETx1AzCClAyYKafkwKEXXhb0mA1H/fJf1ePfMWjT4Yj0E8SWwIDAQAB"```

## APIs
* [Identity](http://developer.chrome.com/apps/identity.html)

## Screenshot

---

## File: _archive/apps/samples/one-time-payment/manifest.json

{
  "name": "One Time Payment Sample",
  "version": "0.4.1.1",
  "manifest_version": 2,
  "minimum_chrome_version": "29",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "storage",
    "identity"
  ],
  "icons": {
    "128": "/images/128.png"
  },
  "oauth2": {
    "client_id": "912609627511-naonel81buqhb6egeqk4r531m75lbsr7.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/chromewebstore.readonly"
    ]
  }
}

---

## File: _archive/apps/samples/optional-permissions/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ggkojffeaocnfigijnfbnliopcilipgg"></a>


# Optional permissions API

This app shows how to use the permissions API to request optional permissions. It can list the attached serial devices, but only if the "serial" permission is granted. The app shows how to check if the permission is granted and how to request it if it is not.

## APIs

* [Serial API](http://developer.chrome.com/apps/app_serial)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Permissions](http://developer.chrome.com/apps/permissions)

## Screenshot

---

## File: _archive/apps/samples/optional-permissions/manifest.json

{
  "name": "Optional Permissions Sample",
  "version": "2.1",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "description": "Shows how to use the optional permissions API",

  "app": {
    "background": {
      "scripts": [ "main.js" ]
    }
  },

  "optional_permissions": [
    "serial"
  ]
}

---

## File: _archive/apps/samples/parrot-ar-drone/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/lhdfniaagbjbipjmgfbnlbcmlbcgklkh"></a>


# Parrot AR.Drone 2.0 Controller

This app uses the [Gamepad API](http://www.html5rocks.com/en/tutorials/doodles/gamepad/) and the [chrome.socket API](https://developer.chrome.com/docs/extensions/reference/socket) to communicate with
a [Parrot AR.Drone 2.0](https://www.parrot.com/us/support/documentation/ar-drone).

The SDK specifies that there are 4 socket connections:

* UDP 5554: Receiving navdata, i.e. battery, velocities, control state
* TCP 5555: Receiving H264 video [not implemented]
* UDP 5556: Sending AT commands for tilt, rotation and elevation
* UDP 5559: Sending Admin commands

The app connects to port 5556 and sends commands to the Drone depending on which
buttons are pressed on the gamepad. The commands themselves are AT commands, which
are essentially strings in a specific format. The command strings are concatenated
and converted to an ArrayBuffer and sent over the socket connection. Since the
protocol in use is UDP there is no guarantee of packet delivery so all commands
are sent approximately every 30ms.

When data comes back in it is parsed according to the navdata specification in
the Drone SDK documentation. The navdata comes back in as an ArrayBuffer from which
numbers are read from fixed byte positions. This includes data on the control
state of the drone (flying, hovering, landing, taking off), the battery percentage,
its angles, altitudes and velcocities.

_Please note: this has only been tested with an Xbox 360 controller_

## Resources

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Socket](https://developer.chrome.com/docs/extensions/reference/socket)

_Thanks to felixge for the [Node AR Drone lib](https://github.com/felixge/node-ar-drone), which served as a helpful reference._
     
## Screenshot

---

## File: _archive/apps/samples/parrot-ar-drone/manifest.json

{
  "manifest_version": 2,
  "version": "0.3",
  "name": "Drone Controller Sample",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [{
    "socket": ["udp-send-to::*"]
    }],
  "sockets": {
    "tcpServer": { "listen": "" },
    "tcp": { "connect": ["*:5555", "*:5559"] },
    "udp": { "bind": ["*:5554", "*:5556"], "send": ["*:5554", "*:5556"] }
  }
}

---

## File: _archive/apps/samples/parrot-ar-drone/sample_support_metadata.json

{
  "sample": "parrot-ar-drone",
  "files_with_snippets": [ ],
  "android": {"works": true, "comments": "Communication to the Drone works, but the UI requires a connected gamepad."}
}

---

## File: _archive/apps/samples/platform-title/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/gdpimhplfcmbiakglpomcdcchbmgfiaj"></a>


# Titlebar Sample App

This is a basic demo showing alternate titlebars, written in HTML/CSS, depending on target platform.

## Resources

* [chrome.runtime.getPlatformInfo](https://developer.chrome.com/extensions/runtime#method-getPlatformInfo)
* [chrome.app.runtime.onLaunched](https://developer.chrome.com/docs/extensions/reference/app_runtime#event-onLaunched)

## Screenshot

### Mac



### Chrome OS

---

## File: _archive/apps/samples/platform-title/manifest.json

{
  "name": "Titlebar",
  "version": "1",
  "manifest_version": 2,
  "minimum_chrome_version": "36",

  "app": {
    "background": {
      "scripts": [
        "background.js"
      ]
    }
  }
}

---

## File: _archive/apps/samples/printing/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/eahldfpkmibbaajaoeifhjeehfgdagdm"></a>


# Printest

This application demonstrates printing. It supports the creation of any number
of windows, each of which can be printed by a button on the window, and the most
recently accessed window can be printed from a control window. A timer based
animation can be displayed on the control window to demonstrates how timers are
suspended while printing.

## Screenshot

---

## File: _archive/apps/samples/printing/manifest.json

{
  "name": "Printest",
  "description": "A printing testbed",
  "manifest_version": 2,
  "minimum_chrome_version": "32",
  "version": "0.1.7",
  "app": {
    "background": {
      "scripts": [
        "a.js",
        "printout.js",
        "document.js",
        "controls.js",
        "application.js",
        "main.js"
      ]
    }
  },
  "permissions": [
    "storage",
    "system.display"
  ],
  "icons": {
    "16": "icon-16x16.png",
    "128": "icon-128x128.png"
  }
}

---

## File: _archive/apps/samples/restarted-demo/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ljngdccbopfaompkjfhepllagnijbdne"></a>


# onRestarted event

When an app is restored after being unexpectedly terminated (eg, when the browser restarts) it will be sent an onRestarted event which should restore the app to the state it was in when it was last running.

This demo app creates a new counter on launch and restores any existing counters across app restarts.


## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Storage](http://developer.chrome.com/apps/storage)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/restarted-demo/manifest.json

{
  "name": "Restarted Event Sample",
  "version": "2",
  "manifest_version": 2,
  "app": {
    "background": {
      "scripts": [
        "background.js"
      ]
    }
  },
  "permissions": [
    "storage"
  ]
}

---

## File: _archive/apps/samples/restarted-demo/sample_support_metadata.json

{
  "sample": "restarted-demo",
  "files_with_snippets": [ ],
  "ios": {"works": true, "comments": "Restart must be done via Safari remote debugging."}
}

---

## File: _archive/apps/samples/rich-notifications/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/cndmbddaappldijonoekcdfdlhemhejm"></a>


# Rich notifications

This sample shows how to use the "templated" notifications API,
aka Rich Notifications, which allows an app to show feature-rich notifications
in the system tray. This API is still in experimental state.


> WARNING: currently this API only works on ChromeOS and Windows. Linux should fail gracefully by displaying normal HTML5 notifications, but some info might not be presented on these platforms.

## Resources

* [Notification API documentation](http://developer.chrome.com/apps/notifications)

## Screenshot

---

## File: _archive/apps/samples/rich-notifications/manifest.json

{
  "name": "Notification API Sample",
  "description": "Tests the notification API",
  "manifest_version" : 2,
  "version" : "0.3.1",
  "app" : {
    "background" : {
    "scripts" : ["app.js"]
    }
  },
  "permissions" : [
     "notifications"
  ]
}

---

## File: _archive/apps/samples/rich-notifications/sample_support_metadata.json

{
  "sample": "rich-notifications",
  "files_with_snippets": [ ],
  "android": {"works": true}
}

---

## File: _archive/apps/samples/sandbox/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ipchbpppeafbpnmnjbkljpfhkkiaeikd"></a>


# Sandbox

This sample creates a sandboxed iframe (`sandbox.html`) to which the main page (`mainpage.html`)
passes a counter variable. The sandboxed page uses the
[Handlebars template library](http://handlebarsjs.com/) to evaluate and compose a message
using the counter variable which is then passed back to the main page for rendering.

The default packaged app Content Security Policy (CSP) value
[disallows](https://developer.chrome.com/docs/apps/contentSecurityPolicy/) the use of
`eval()` or `new Function()` (or variants like `Function.apply()`) so using a
sandbox is necessary for this process. To enable sandboxing in your app you
add the `sandbox` property to your app's [manifest file](http://developer.chrome.com/apps/manifest#sandbox).

See more info on [using eval safely in packaged apps](http://developer.chrome.com/apps/sandboxingEval).

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)

## Screenshot

---

## File: _archive/apps/samples/sandbox/manifest.json

{
  "name": "Sandboxed Frame Sample",
  "version": "1.0.2",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "icons": {
    "128": "icon_128.png"
  },
  "sandbox": {
    "pages": ["sandbox.html"]
  }
}

---

## File: _archive/apps/samples/sandboxed-content/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/gaaeficfcmngmogaejhikdnkdijlpgec"></a>


# Sandbox

This sample creates a window containing a sandboxed iframe (`sandbox.html`).
The sandbox uses `eval()` function to write some HTML to its own document.

The default packaged app Content Security Policy (CSP) value
[disallows](https://developer.chrome.com/docs/apps/contentSecurityPolicy/) the use of
`eval()` or `new Function()` (or variants like `Function.apply()`) so using a
sandbox is necessary for this process. To enable sandboxing in your app you
add the `sandbox` property to your app's [manifest file](http://developer.chrome.com/apps/manifest#sandbox).

See more info on [using eval safely in packaged apps](http://developer.chrome.com/apps/sandboxingEval).

## APIs

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime/)


## Screenshot

---

## File: _archive/apps/samples/sandboxed-content/manifest.json

{
  "name": "Sandboxed Content Sample",
  "version": "1.0.2",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "icons": {
    "128": "icon_128.png"
  },
  "sandbox": {
    "pages": ["sandboxed.html"]
  }
}

---

## File: _archive/apps/samples/serial/adkjs/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ieoiddehfkbacdideciijbdjfjegmpjo"></a>


# ADK kit in Javascript

This demo is composed of two parts and require a ADK 1.0 hardware (Arduino board+shield shipped at Google I/O 2011) to demonstrate Android hardware integration.

The demo simulates the same visual interface of the Android application, but in HTML5. There are UI widgets to control the servo motors, led lights and relays, and it gets sensors and buttons events.

In the firmware directory, there is the Arduino app you must upload. We could not use exactly the same arduino code from the original Android ADK because it uses a USB port where the board is the USB host, and that woudl conflict with the computer USB port that is always the host. Upload the arduino firmware code to the board and you are set.

In the app directory, you will find the Chrome Packaged App.

## APIs

* [Serial API](http://developer.chrome.com/apps/app.hardware.html#serial)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/serial/adkjs/app/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ieoiddehfkbacdideciijbdjfjegmpjo"></a>

---

## File: _archive/apps/samples/serial/adkjs/app/manifest.json

{
  "name": "ADK Controller Sample",
  "version": "2",
  "app": {
    "background": {
      "scripts": ["js/background.js"]
    }
  },
  "icons": {
    "128": "img/icon_128.png"
  },
  "permissions" : ["serial"],
  "manifest_version": 2
}

---

## File: _archive/apps/samples/serial/espruino/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ghbnaccmkndoembcopnaklidmocbdkfp"></a>


# Espruino LED toggle

This sample lets you toggle the state of an LED on an [Espruino JavaScript board](http://www.espruino.com) as well as reading back its current temperature. The board runs JavaScript, so it's easy to control it by sending JavaScript commands directly to it as strings.

1. Connect the Espruino Board
2. Install and launch this packaged app.
3. Make sure the drop-down box shows the correct serial device
4. Click `Connect`
3. Press the buttons to either toggle the state of an LED, flash it 3 times, or read back the chip's current temperature.


## APIs

* [Serial API](http://developer.chrome.com/apps/app.hardware.html#serial)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/serial/espruino/manifest.json

{
  "name": "Espruino Test",
  "version": "1",
  "manifest_version": 2,
  "permissions": ["serial"],
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["launch.js"]
    }
  }
}

---

## File: _archive/apps/samples/serial/ledtoggle/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/bdiclhdalonemjdeeaglackjgdboboem"></a>


# Arduino LED toggle

Note: on Mac OS X Lion, it's necessary to update USB Serial drivers:
https://web.archive.org/web/20160630184514/http://blog.geekscape.org/wordpress/2011/07/22/mac-os-x-17-lion-upgrading-ftdi-usb-serial-dr

This sample shows a big button that lets you toggle between the on/off
state of an LED connected to an Arduino.

1. Install the LED sketch on your Duo.
2. Attach a LED to pin 2 (with a resistor to not burn it out).
3. Install and launch this packaged app.
4. Press the button to toggle the LED.

Future version: use the standard Firmata sketch and build a JS firmata driver
for Chrome packaged apps.

## APIs

* [Serial API](http://developer.chrome.com/apps/app.hardware.html#serial)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/serial/ledtoggle/manifest.json

{
  "name": "Serial Test",
  "version": "3",
  "manifest_version": 2,
  "permissions": ["serial"],
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["launch.js"],
      "transient": true
    }
  }
}

---

## File: _archive/apps/samples/serial-control-signals/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/gmlopmidlcfikepbnklkochchhehjpak"></a>


# Serial Control Signals

This sample demonstrates how you can send and receive control signals (DTR, RTS, DCD and CTS) to/from a serial port.

## APIs

* [Serial API](http://developer.chrome.com/apps/app.hardware.html#serial)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/serial-control-signals/manifest.json

{
  "name": "Serial Control Signals",
  "version": "1",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "description": "Test serial control signal API.",

  "app": {
    "background": {
      "scripts": [ "background.js" ]
    }
  },

  "permissions": [
    "serial"
  ]
}

---

## File: _archive/apps/samples/servo/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/lhedgapiolhajjkgokaplenafmdppmak"></a>


# Arduino servo control

Note: on Mac OS X Lion, it's necessary to update USB Serial drivers:
http://blog.geekscape.org/wordpress/2011/07/22/mac-os-x-17-lion-upgrading-ftdi-usb-serial-dr/

This app displays a slider that, when dragged, causes a servo attached to an Arduino to move. The Arduino sketch is included and should be uploaded to the Arduino.

## APIs

* [Serial API](http://developer.chrome.com/apps/app.hardware.html#serial)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/servo/manifest.json

{
  "name": "Servo Serial Sample",
  "version": "0.4",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "description": "Show off serial functionality.",

  "app": {
    "background": {
      "scripts": [ "background.js" ]
    }
  },

  "icons": {
    "16": "assets/icon-16x16.jpeg",
    "128": "assets/icon-128x128.jpeg"
  },

  "permissions": [
    "serial",
    "videoCapture"
  ]
}

---

## File: _archive/apps/samples/storage/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/bpncolcpekidijienghhkibflikohggn"></a>


# Storage simple test

A very basic application that demonstrates the Filesystem API. It allows you to request a filesystem, write a sample file to it and query how many bytes are available.

## APIs

* [Filesystem](http://developer.chrome.com/apps/app_storage.html)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/storage/manifest.json

{
  "name": "Syncable Storage Sample",
  "version": "1.1",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "unlimitedStorage"
  ]
}

---

## File: _archive/apps/samples/syncfs-editor/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ccphiekjjhfnhbmpcbmkmjjhbfhlijkc"></a>


syncfs-editor
=============

Cloud-backed text editor using the new chrome.syncFileSystem API.
(You need to use Chrome M27+ Canary for try this out)

LICENSE:
-

Copyright 2012, 2013 {kinuko,tzik,nhiroki,calvinlo}@chromium.org

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

## Screenshot

---

## File: _archive/apps/samples/syncfs-editor/manifest.json

{
  "name": "Sync FileSystem Sample",
  "version": "0.289",
  "manifest_version": 2,
  "description": "SyncFS editor (syncFileSystem sample)",
  "icons": {
    "16": "img/icon-16.png",
    "24": "img/icon-24.png",
    "128": "img/icon-128.png"
  },
  "app": {
    "background": {
      "scripts": ["js/background.js"]
    }
  },
  "permissions": ["syncFileSystem"]
}

---

## File: _archive/apps/samples/systemInfo/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/lfkebofdngpbnooppdhiibpdpepgjoch"></a>


# SystemInfo Sample

Shows how to use experimental systemInfo APIs to query system information, such
as CPU, memory and disk storage etc.

## APIs
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Display](http://developer.chrome.com/apps/system_display)
* [CPU](http://developer.chrome.com/apps/system_cpu)
* [Memory](http://developer.chrome.com/apps/system_memory)
* [Storage](http://developer.chrome.com/apps/system_storage)

## Screenshot

---

## File: _archive/apps/samples/systemInfo/manifest.json

{
 "name": "SystemInfo Sample",
 "version": "0.5",
 "permissions": ["system.cpu", "system.memory", "system.storage", "system.display"],
 "minimum_chrome_version": "34",
 "manifest_version": 2,
 "description": "Show several system information via SystemInfo API",
 "app": {
   "background": {
     "scripts": ["main.js"]
   }
 }
}

---

## File: _archive/apps/samples/tasks/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/tasks-sample-using-gapi/licakmgdnppmfjlkgijcbnobnkoaegko"></a>


# Tasks app using GAPI

Demonstrates the usage of GAPI by listing user's Google Tasks. It can be either
used as a Chrome app, in which case the [GAPI Chrome Apps Lib](https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/libraries/gapi-chrome-apps-lib)
is used, or as a web page, running on http://localhost:8000, taking advantage
of the [JavaScript Client Library](https://developers.google.com/api-client-library/javascript/reference/referencedocs).

## Resources

* [JavaScript Client Library Reference](https://developers.google.com/api-client-library/javascript/reference/referencedocs)
* [GAPI Chrome Apps Lib](https://github.com/GoogleChrome/chrome-app-samples/tree/master/gapi-chrome-apps-lib)


## Screenshot

---

## File: _archive/apps/samples/tasks/manifest.json

{
  "name": "Tasks Sample using GAPI",
  "version": "2.1",
  "manifest_version": 2,
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+EyucIyETym2OR3mPl2EVQULs+1p50pf6dyTdEG+igD41fSpAfEQiXS4Dp+E8ye5HdyBnKUDnSQJ08bAYeTP7z+udV990ddkSSk6uqZTa/o1dr8jv1KDE+MQAF8Qe/XzzddLkaHGQMmATFRbq6IwY8Emk3p7QDcVdTNGFBMxphQIDAQAB",
  "minimum_chrome_version": "29",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["identity", "https://www.googleapis.com/*"],
  "oauth2": {
    "client_id": "788341667074-i889rgdtvmo60rav3pk4kflmb5rf7cqa.apps.googleusercontent.com",
    "scopes": ["https://www.googleapis.com/auth/tasks.readonly"]
  }
}

---

## File: _archive/apps/samples/tasks/sample_support_metadata.json

{
  "sample": "tasks",
  "files_with_snippets": [ ],
  "android": {"works": true}
}

---

## File: _archive/apps/samples/tcpserver/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ahlcocbkjpjkobcdpjcobmibmpbeecpg"></a>


# Chrome Commando TCP server

This is a sample that shows how you can run a network TCP server in a packaged app. This sample allows you to start a server in an arbitrary address and port. Telnet to the listening port and you will be able to remotely control your browser by sending some commands such as `open` and `echo`.

## APIs

* [Sockets](https://developer.chrome.com/apps/sockets_tcp)
* [Runtime](https://developer.chrome.com/apps/app_runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Screenshot

---

## File: _archive/apps/samples/tcpserver/manifest.json

{
  "manifest_version": 2,
  "name": "TCP Server Sample",
  "version": "3.1",
  "minimum_chrome_version": "33.0.1715.0",
  "permissions": ["webview", "system.network"],
  "app": {
    "background": {
      "scripts": ["tcp-server.js", "commands/BrowserCommands.js", "main.js"]
    }
  },
  "sockets": {
    "tcpServer": {
      "listen": ""
    }
  }
}

---

## File: _archive/apps/samples/tcpserver/sample_support_metadata.json

{
  "sample": "tcpserver",
  "files_with_snippets": [ ]
}

---

## File: _archive/apps/samples/telnet/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ebckmolcafdmfjbkmamhoacnmmkiohpe"></a>


# Telnet

Uses the Socket API to connect as a TCP client to aardmud.org on port 4000.
Renders it in glorious ANSIColor for your viewing joy.

* TCP client
* ANSI color renderer
* DNS resolver [Deprecated]

## Resources

* [Sockets](https://developer.chrome.com/apps/sockets_tcp)
* [Runtime](https://developer.chrome.com/apps/app_runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Credits

Networking stuff, ANSI colors by Boris Smus.
Terminal by Eric Bidelman: http://www.htmlfivewow.com/demos/terminal/terminal.html

## Screenshot

---

## File: _archive/apps/samples/telnet/manifest.json

{
  "name": "Telnet Client",
  "version": "2.1",
  "manifest_version": 2,
  "minimum_chrome_version": "33.0.1715.0",
  "icons": {
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["launch.js"]
    }
  },
  "sockets": {
    "tcp": {
      "connect": "*:*"
    }
  }
}

---

## File: _archive/apps/samples/telnet/sample_support_metadata.json

{
  "sample": "telnet",
  "files_with_snippets": [ ],
  "android": {"works": false, "comments": "Can't enter CR/LF in virtual keyboards"},
  "ios": {"works": false, "comments": "Can't enter CR/LF in virtual keyboards and display issues"}
}

---

## File: _archive/apps/samples/text-editor/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/jkgbibkjioaefdopcdbhjehefhajgadh"></a>


# Code editor

A non-trivial sample with basic features of a code editor, like language detection and syntax highlight. If also uses the extended FileSystem API that allows a user to select files from the disk so the app can read and write to that file. This sample is very similar to the [mini-code-editor](https://github.com/GoogleChrome/chrome-app-samples/tree/master/mini-code-edit)

## APIs

* [chrome.fileSystem](http://developer.chrome.com/apps/fileSystem)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/text-editor/manifest.json

{
  "name": "Simple Text Editor",
  "description": "Syntax highlighting text editor",
  "version": "0.21",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icons/texteditor_16.png",
    "24": "icons/texteditor_24.png",
    "48": "icons/texteditor_48.png",
    "128": "icons/texteditor_128.png"
  },
  "permissions": [
    "clipboardRead",
    "clipboardWrite",
    {"fileSystem": ["write"]}
  ],
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  }
}

---

## File: _archive/apps/samples/text-editor/icons/Readme.txt

The icons in this project are awesome and come from http://www.silvestre.com.ar/.

---

## File: _archive/apps/samples/todomvc/bower.json

{
  "name": "todomvc-vanillajs",
  "version": "0.0.0",
  "dependencies": {
    "todomvc-common": "~0.1.4",
    "director": "~1.2.0"
  }
}

---

## File: _archive/apps/samples/todomvc/manifest.json

{
  "manifest_version": 2,
  "name": "ToDoMVC",
  "version": "1",
  "icons": {
    "128": "icon_128.png"
  },
  "permissions": ["storage", "alarms", "notifications",
                  "<all_urls>", { "fileSystem": ["write"]} , "syncFileSystem" ],
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "minimum_chrome_version": "28"
}

---

## File: _archive/apps/samples/todomvc/sample_support_metadata.json

{
  "sample": "todomvc",
  "files_with_snippets": [ ],
  "android": {"works": true}
}

---

## File: _archive/apps/samples/tts/manifest.json

{
  "manifest_version": 2,
  "name": "Text-to-Speech Sample",
  "version": "1",
  "icons": {
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["tts"]
}

---

## File: _archive/apps/samples/udp/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/okhdmjejphblookgnkabaoaalhcoobec"></a>


# A simple UDP echo client

    ------------------------------

    [127.0.0.1:3007    ] [Connect]

                   **o
                      ..
                        .



    ------------------------------

Connects to a UDP echo server at the given address.

Each little dot represents a echo request.
When the request receives a reply, it shoots away and blows up.
When a request doesn't receive a reply, it grows into a big ball and blows up.

The dots gravitate towards each other for extra spiffiness.

### Server side

In the `server` directory, you will find a Node echo server that intentionally drops some packets to simulate a real network. Run this server before, so you can connect the client (Chrome Packaged App) to it.

## APIs

* [UDP Network](http://developer.chrome.com/apps/app_network#udp)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/udp/manifest.json

{
  "manifest_version": 2,
  "name": "Sample of UDP Network Access",
  "description": "Echo..... Echo.",
  "version": "2.2",
  "minimum_chrome_version": "33",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "sockets": {
    "udp": {
      "send": ["*"],
      "bind": ["*"]
    }
  }
}

---

## File: _archive/apps/samples/udp/sample_support_metadata.json

{
  "sample": "udp",
  "files_with_snippets": [ ],
  "ios": {"works": true}
}

---

## File: _archive/apps/samples/url-handler/README.md

# URL Handler Sample App

This is a basic Wikipedia viewer implemented as a packaged app.

Chrome 31 introduces a new mechanism to allow apps to intercept navigations to URLs that match a given pattern or patterns.

Using that mechanism, this sample app intercepts Wikipedia desktop and mobile URLs, normalizes them to the mobile version, and loads the result into a webview.

Note that at least in this initial version of the feature in Chrome 31 stable channel, the Chrome Web Store will reject any apps that attempt to claim URLs not owned by the app's developer (per the Store's definition of ownership and the corresponding verification procedure). That means that this app is for sample purposes only: it can't be uploaded to the Store, however it can be installed locally in developer's mode as unpackaged app.

## Resources

* [url_handlers in manifest](http://developer.chrome.com/apps/manifest/url_handlers)
* [chrome.app.runtime.onLaunched](https://developer.chrome.com/docs/extensions/reference/app_runtime#event-onLaunched)
* [webview](https://developer.chrome.com/apps/tags/webview)
* [chrome.storage](http://developer.chrome.com/apps/storage)

## Screenshot

---

## File: _archive/apps/samples/url-handler/manifest.json

{
  "name": "Wikipedia Viewer",
  "version": "1",
  "manifest_version": 2,
  "minimum_chrome_version": "31.0.1650.4",

  "app": {
    "background": {
      "scripts": [
        "main.js"
      ]
    }
  },

  "permissions": [
    "webview",
    "storage"
  ],

  "url_handlers": {
    "wiki_article": {
      "title": "View Wikipedia article",
      "matches": [
        "*://en.wikipedia.org/wiki/*"
      ]
    },
    "mobile_wiki_article": {
      "title": "View Wikipedia article",
      "matches": [
        "*://en.m.wikipedia.org/wiki/*"
      ]
    }
  }
}

---

## File: _archive/apps/samples/usb/device-info/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/igkmggljimacfdfalpeelenjeicmfnll"></a>


# USB Device Info Demo

This app displays information about any device available to Chrome. The
new `chrome.usb.getUserSelectedDevices` API is used to request permission
for arbitrary devices.

## APIs

* [USB raw access](https://developer.chrome.com/apps/usb)
* [Runtime](https://developer.chrome.com/apps/runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Screenshot

---

## File: _archive/apps/samples/usb/device-info/manifest.json

{
  "name": "USB Device Info",
  "version": "0.6",
  "description": "This application displays detailed technical information about USB devices that are connected to your computer.",
  "manifest_version": 2,
  "minimum_chrome_version": "40.0.2213.0",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": ["usb"],
  "icons": {
    "128": "assets/icon_128.png"
  }
}

---

## File: _archive/apps/samples/usb/knob/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/npiachjbcianljljdlckbnkilpnddnfn"></a>


# Griffin PowerMate knob

This demo interfaces with a [Griffin PowerMate](http://en.wikipedia.org/wiki/Griffin_PowerMate) device, reading its position and displaying it via a Chrome logo. It does not currently work on Mac OS X, since on that platform the OS claims the PowerMate is an HID device, and does not allow raw USB access to it.

## APIs

* [USB raw access](https://developer.chrome.com/apps/usb)
* [Runtime](https://developer.chrome.com/apps/runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Screenshot

---

## File: _archive/apps/samples/usb/knob/manifest.json

{
  "name": "USB Spinner Sample",
  "version": "0.3",
  "manifest_version": 2,
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": ["usb"],
  "optional_permissions": [ {"usbDevices": [{"vendorId": 1917, "productId": 1040}]}]
}

---

## File: _archive/apps/samples/usb-label-printer/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/fgnncpfphbgfchijmoopegkdhihegfla"></a>


label-printer-app
=================

Chrome packaged app for a simple label generator with printer support for Dymo 450 LabelWriter.

Code originally created by Marjin Kruisselbrink (@mkruisselbrink).

### Other printers

If you want to reuse this code for other LabelWriter printers, you might be able to do it if they use the same protocol.

For example, for Dymo 450 Turbo, you need to change:

- index.js

var productId = 0x0021; // changed from 0x0020


- manifest.json

"optional_permissions": [ {"usbDevices": [{"vendorId": 2338, "productId": 33}]}] // changed from 32


(thanks @kjantzer for the [information](https://github.com/GoogleChrome/chrome-app-samples/issues/126#issuecomment-29547981))

### Windows issues

Some Windows device drivers take ownership of the device and don't allow Chrome to connect to them. If openDevice or findDevice doesn't work for you, you can try to use a generic low level driver instead.
For more info, check this [chrome-app-samples issue](https://github.com/GoogleChrome/chrome-app-samples/issues/203).

LICENSE
=======

Copyright 2013 Google Inc. All Rights Reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

## Screenshot

---

## File: _archive/apps/samples/usb-label-printer/manifest.json

{
  "manifest_version": 2,
  "name": "Label USB Printer Sample",
  "version": "2.2",
  "minimum_chrome_version": "25",
  "icons": {
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["usb", "fileSystem", "videoCapture"],
  "optional_permissions": [ {"usbDevices": [{"vendorId": 2338, "productId": 32}]}]

}

---

## File: _archive/apps/samples/weather/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hfgmgghdkhgcklddhfefhdhcpkpmikhi"></a>


# Weather

A basic 5-day weather forecast. Uses geolocation (if available) to locate the
user and retrieve the conditions nearest to them. Also allows the user to add
other cities and choose the temperature format.

Makes use of the Chrome Storage API to save and load the cities and settings
that the user has chosen

## Resources

* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Storage](http://developer.chrome.com/apps/storage)
* [Geolocation](http://developer.chrome.com/apps/manifest#permissions)

## Screenshot

---

## File: _archive/apps/samples/weather/manifest.json

{
  "name": "Weather",
  "description": "A simple weather application.",
  "manifest_version": 2,
  "version": "1.0.7",
  "minimum_chrome_version": "23",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "icons": {
    "16": "img/icon.png",
    "64": "img/icon.png",
    "128": "img/icon.png"
  },
  "permissions": [
    "geolocation",
    "storage",
    "<all_urls>"
  ]
}

---

## File: _archive/apps/samples/weather/sample_support_metadata.json

{
  "sample": "weather",
  "files_with_snippets": [ ],
  "ios": {"works": true}
}

---

## File: _archive/apps/samples/web-store/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ndgidogppopohjpghapeojgoehfmflab"></a>

# Web Store API Sample App

Lets you upload and publish Chrome Apps and Extensions folders stored locally on your hard drive. The `chrome.identity` API is used to retrieve a valid token to authenticate against the [Chrome Web Store Publish API](http://developer.chrome.com/webstore/using_webstore_api). The zip process is handled by the external library [zip.js](http://gildas-lormeau.github.io/zip.js/) and the `chrome.fileSystem` API.

## APIs

* [runtime](http://developer.chrome.com/apps/app_runtime)
* [window](http://developer.chrome.com/apps/app_window)
* [identity](http://developer.chrome.com/apps/app_identity)
* [fileSystem](http://developer.chrome.com/apps/fileSystem)
* [storage](http://developer.chrome.com/apps/storage)

## Screenshot

---

## File: _archive/apps/samples/web-store/manifest.json

{
  "name": "Web Store API Sample App",
  "description": "An example app to upload and publish Chrome Apps to the Web Store",
  "version": "1",
  "manifest_version": 2,
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvTWT4REnE8g8VuWDWF96d1bOfpDMt9nWL2+m92a9kzmiciabfetpTk+zXsjuBNObK0Hm+KPxYfZjxIU7jCSq6UBf2W0SRmCWUtz7OSCAhpBKHTI7D4ybTbcRh41RKPjrHH7WTjNKi/x9LUjwdgROxVNdV5f1CCe2CHSUU1lZciu1FDHKz8cA+2+mAB+j4FvQT8rrbidbAs1O75w6k8d3g0Rp7SrlUXbvvemPIFnaBDGIpfdBLRJRIMk4dS5MAzsHJb4WVCW3hGdMR65x2lHMMLYVe8G8A+4lWrr/hnV4CBCs4FzudaMMXKYoEW5Atr+ES9XKPW8qxSTVM0FfZ4/q7QIDAQAB",
  "icons": {
    "16": "images/icon_16.png",
    "128": "images/icon_128.png"
  },
  "permissions": [
    { "fileSystem": ["directory", "retainEntries"] },
    "identity", 
    "storage"
  ],
  "oauth2": {
    "client_id": "313416032683-3ob52hbv8u7gl4hi8l3sa6eh5ru4rb6u.apps.googleusercontent.com",
    "scopes": ["https://www.googleapis.com/auth/chromewebstore"]
  }
}

---

## File: _archive/apps/samples/webgl-pointer-lock/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/pjfconokbhkicolnaaphhfhjpcgnnfpj"></a>


# Hello 3D World

A basic application using WebGL capabilities. It loads a 3D model from a JSON file and allows for model rotation and camera zooming, based on mouse movements. Dragging the mouse enters pointer lock, allowing movement unlimited by window or screen boundaries.

This sample uses the frameless window:

    chrome.app.runtime.onLaunched.addListener(function() {
      chrome.app.window.create('index.html',
        {frame: 'none', innerBounds: {width: 500, height: 400}});
    });

## APIs

* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Pointer Lock](http://www.w3.org/TR/pointerlock/)

## External libs

* [Three.js](https://github.com/mrdoob/three.js/)

---

## File: _archive/apps/samples/webgl-pointer-lock/manifest.json

{
  "manifest_version": 2,
  "name": "Sample of WebGL",
  "version": "2",
  "minimum_chrome_version": "23",
  "icons": {
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "pointerLock"
  ]
}

---

## File: _archive/apps/samples/webserver/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hflhcpmgeolmjlbmdicgkjedjmkoocbe"></a>


Web Server
==========

This sample is a demonstration of Chrome's new networking stack. Chrome has the ability to
listen on a tcp port AND to accept.

## APIs
* [Sockets](https://developer.chrome.com/apps/sockets_tcpServer)
* [Network](https://developer.chrome.com/apps/system_network)
* [Runtime](https://developer.chrome.com/apps/app_runtime)
* [Window](https://developer.chrome.com/apps/app_window)

## Screenshot

---

## File: _archive/apps/samples/webserver/manifest.json

{
  "name": "__MSG_appName__",
  "version": "3.2",
  "manifest_version": 2,
  "description": "__MSG_appDescription__",
  "icons": {
    "16": "icon-16.png",
    "128": "icon-128.png"
  },
  "default_locale": "en",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["system.network"],
  "sockets": {
    "tcpServer" : {
      "listen": ["*"]
    }
  }
}

---

## File: _archive/apps/samples/webserver/sample_support_metadata.json

{
  "sample": "webserver",
  "files_with_snippets": [ ],
  "android": {"works": true, "comments": "Directory picking doesn't work on some versions of Android"}
}

---

## File: _archive/apps/samples/webserver/_locales/en/messages.json

{
  "appName": {
    "message": "HTTP Server Sample",
    "description": "The name of the application"
  },
  "appDescription": {
    "message": "HTTP Server Sample",
    "description": "The description of the application"
  }
}

---

## File: _archive/apps/samples/websocket-server/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/pkbpddppnkjmlbgliipgmhjeialadokj"></a>


# Http WebSocket Server

An example Http and WebSocket server implementation with a sample app which serves itself and allows connected clients to chat with each other. The API is very similar to NodeJS with the intention that this could be an easy drop-in replacement for a NodeJS served application.

## APIs

* [Sockets](https://developer.chrome.com/apps/sockets_tcpServer)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/websocket-server/manifest.json

{
  "name": "WebSocket Server Test",
  "description": "Runs an Http and WebSocket server with a quick and dirty test chat application.",
  "version": "0.3.2",
  "manifest_version": 2,

  "sockets": {
    "tcp": {
      "connect": "*"
    },

    "tcpServer": {
      "listen": "*"
    }
  },
  
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  }
}

---

## File: _archive/apps/samples/websocket-server/sample_support_metadata.json

{
  "sample": "websocket-server",
  "files_with_snippets": [ ],
  "ios": {"works": true}
}

---

## File: _archive/apps/samples/webview-samples/browser/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/edggnmnajhcbhlnpjnogkjpghaikidaa"></a>


# Browser

Sample that shows how to use the [webview tag](http://developer.chrome.com/apps/app_external#webview)
in an app to create a mini browser.

The app's main window contains a `<webview>` that is sized to fit most of it
(via the `width` and `height` attributes). The location bar is used to
update its `src` attribute.

`<webview>` is the preferred way for you to load web content into your app. It
runs in a separate process and has its own storage, ensuring the security and
reliability of your application.

## Resources

* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/browser/manifest.json

{
  "manifest_version": 2,
  "name": "Browser Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.3.3",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "webview"
  ]
}

---

## File: _archive/apps/samples/webview-samples/declarative-web-request/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hhflblflkeainajnkamabjibdbfnbilb"></a>


# Declarative Web Request API

**Note:** The [declarative web request
API](https://developer.chrome.com/extensions/declarativeWebRequest) is
available only on the [beta
channel](https://www.google.com/landing/chrome/beta/) and [dev
channel](http://www.chromium.org/getting-involved/dev-channel). This sample
will not work on [stable channel](https://www.google.com/chrome/browser/)
builds.

This sample shows how to use the declarative web request API with a
webview. The app implements a simple content blocker for URLs that match a
[RE2 regular expression](https://code.google.com/p/re2/wiki/Syntax). The
default pattern blocks hosts that contain `blogspot.` (such as blogspot.com
blogs) or `gstatic.` (such as thumbnails in Google image search). Top frame
and sub-frame navigation redirects the whole webview to a "page blocked" page
(see screenshot left). Image loads are redirected to a dummy image that
contains a shortened version of the image URL as text (see screenshot
right). The user can modify the URL matching pattern using a form on the
top-right. Content blocking actions are logged beneath the form on the
top-right.

## Resources

* [Declarative Web Request API](https://developer.chrome.com/extensions/declarativeWebRequest)
* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/declarative-web-request/manifest.json

{
  "manifest_version": 2,
  "name": "Declarative Web Request API Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["config.js", "main.js"]
    }
  },
  "permissions": [
    "webview",
    "storage",
    "*://*/*"
  ],
  "webview": {
    "partitions": [
      {
        "name": "blockable",
        "accessible_resources": ["browser.css", "blocked.css", "blocked.html"]
      }
    ]
  }
}

---

## File: _archive/apps/samples/webview-samples/insert-css/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/dnedmnfnnbpgnedogbljhiacgmkbklfj"></a>


# Insert CSS

Sample that shows how to inject CSS into a
[webview](http://developer.chrome.com/apps/app_external#webview). The
user can adjust the regular expression used to match URLs for injection, and
adjust the injected CSS itself. Navigation is only supported through
following links within the webview.

## Resources

* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/insert-css/manifest.json

{
  "manifest_version": 2,
  "name": "Insert CSS API Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["config.js", "main.js"]
    }
  },
  "permissions": [
    "webview",
    "storage"
  ]
}

---

## File: _archive/apps/samples/webview-samples/local-resources/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/nfeplfjagjlljomimjealpedhjgamkle"></a>


# Package-Local Resources

This sample shows good and bad examples of mixing a `<webview>` tag that
embeds trusted content packaged within an app with a tag that embeds
untrusted web content that may crash. In the bad example, trusted and
untrusted content share the same
[partition](https://developer.chrome.com/apps/tags/webview#partition);
simulating a crash in the untrusted `webview` will also crash the trusted
`webview`. The good example separates the two into different partitions;
simulating a crash in the untrusted `webview` does not affect the trusted
`webview`.

Finally, the `manifest.json` file contains an example of granting permissions
to particular `webview` partitions to access trusted package-local content.

## Resources

* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)
* [Partitions](https://developer.chrome.com/apps/tags/webview#partition)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/local-resources/manifest.json

{
  "manifest_version": 2,
  "name": "Local Resources Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "webview"
  ],
  "webview": {
    "partitions": [
      {
        "name": "bad",
        "accessible_resources": ["trusted.html"]
      },
      {
        "name": "good_trusted",
        "accessible_resources": ["trusted.html"]
      }
    ]
  }
}

---

## File: _archive/apps/samples/webview-samples/multi-tab-browser/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/nfcmophndjlljioblddmepjbcfnocnak"></a>


# Multi-Tab Browser

Sample that shows one way to combine the [New Window
API](https://developer.chrome.com/apps/tags/webview#event-newwindow) with the
[User Agent
API](https://developer.chrome.com/apps/tags/webview#method-setUserAgentOverride)
for
[webviews](http://developer.chrome.com/apps/app_external#webview). The
app combines the
[New Window User Agent Sample](https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/new-window)
and the [Browser Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/browser).

## Features

* All features from the [New Window User Agent Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/new-window-user-agent)
* All features from the
  [Browser Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/browser) except for [clearData API](https://developer.chrome.com/apps/tags/webview#method-clearData) and simulate crash.
* Added a new permissions feature based on [webview permissionrequest event](https://developer.chrome.com/apps/tags/webview#event-permissionrequest)

## Limitations

* See [New Window
Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/new-window)

## Resources

* [Webview New Window API](https://developer.chrome.com/apps/tags/webview#event-newwindow)
* [User Agent API](https://developer.chrome.com/apps/tags/webview#method-setUserAgentOverride)
* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)

## Screenshot

---

## File: _archive/apps/samples/webview-samples/multi-tab-browser/manifest.json

{
  "manifest_version": 2,
  "name": "Multi-tabbed Browser",
  "minimum_chrome_version": "35.0.0.0",
  "version": "0.8",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["config.js", "main.js"]
    }
  },
  "permissions": [
    "contextMenus",
    "webview"
  ]
}

---

## File: _archive/apps/samples/webview-samples/new-window/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/kpgjodoohleggakakpaadgjeedfgeafi"></a>


# New Window API

Sample that shows how to use the [New Window
API](https://developer.chrome.com/apps/tags/webview#event-newwindow) for
[webviews](http://developer.chrome.com/apps/app_external#webview). The
app behaves like a tabbed browser. When actions in we webview request a new
tab or window, the browser responds appropriately. For example, clicking
links with a foreign target opens a new tab in the foreground; ctrl+clicking
a link opens a new tab in the background; Javascript calls to `window.open()`
that identify a different window open a new window.

## Features

* Shortcut keys: `Ctrl+t` (new tab), `Ctrl+W` (close tab), `Ctrl + [1-9]` (select tab)
* Popup confirmation: An attempt to open a separate window (not a separate
  tab in the same window) must be explicitly allowed by the user (see
  screenshot for example of Allow/Deny dilaogue)

## Limitations

* Managing of named windows and setting of new window attributes is not
  supported. Attempting to open two links in a window named `foo` will not
  navigate the same window twice. Attributes (e.g., width, height, resizable)
  to `window.open()` will be ignored.

## Resources

* [Webview New Window API](https://developer.chrome.com/apps/tags/webview#event-newwindow)
* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/new-window/manifest.json

{
  "manifest_version": 2,
  "name": "New Window API Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["config.js", "main.js"]
    }
  },
  "permissions": [
    "webview"
  ]
}

---

## File: _archive/apps/samples/webview-samples/new-window-user-agent/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/jhgiafbilglmngpgkhcmnicfkpfihggo"></a>


# New Window API

Sample that shows one way to combine the [New Window
API](https://developer.chrome.com/apps/tags/webview#event-newwindow) with the
[User Agent
API](https://developer.chrome.com/apps/tags/webview#method-setUserAgentOverride)
for
[webviews](http://developer.chrome.com/apps/app_external#webview). The
app combines the [New Window
Sample](https://github.com/GoogleChrome/chrome-extensions-samples/tree/main/_archive/apps/samples/webview-samples/new-window)
and the [User Agent
Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/user-agent)
by supporting `Open link in new tab/window as...` via the [Context Menu
API](https://developer.chrome.com/extensions/contextMenus) (see screenshot).

## Features

* All features from the [New Window
Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/new-window)
* Context menu entries for `Open link in new tab/window
  as Android/iPhone/Nokia Mobile/BlackBerry Playbook`

## Limitations

* See [New Window
Sample](https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/webview-samples/new-window)

## Resources

* [Webview New Window API](https://developer.chrome.com/apps/tags/webview#event-newwindow)
* [User Agent API](https://developer.chrome.com/apps/tags/webview#method-setUserAgentOverride)
* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/new-window-user-agent/manifest.json

{
  "manifest_version": 2,
  "name": "New Window + User Agent API Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["config.js", "main.js"]
    }
  },
  "permissions": [
    "contextMenus",
    "webview"
  ]
}

---

## File: _archive/apps/samples/webview-samples/shared-script/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/cbdacningpambfjjejgfebeagmhpdcko"></a>


# Accessing the main world with `<webview>`.executeScript()

Web view content scripts run in *an isolated world*. This means that they can
access the current page's DOM, but cannot share objects with scripts included
in the DOM because scripts in the DOM run in the *main world*. For a more
detailed explanation, checkout [this
video](https://www.youtube.com/watch?v=laLudeUmXHM).

Running in an isolated world is usually what the developer wants because
access to the DOM is enough. Sometimes, the developer may want to access
Javascript objects in the main world. This sample shows good and bad examples
of injecting Javascript into a `<webview>` that is intended to run in the
main world. To do this correctly, content script must create a `<script>` tag
and inject it into the DOM. Then, the script contained within the `<script>`
tag will be run in the main world.

The sample shows a page that contains an animated dragon. The injected script
adds the ability to construct dragons that animate in sync. In order to do
so, the script needs access to the `Dragon`
[FOAM](http://foam-framework.github.io/foam/) model. To gain access, the
injected script inserts a `<script>` tag into the DOM.

The sample contains two app windows: *Incorrect injection* attempts to inject
the script directly and *Correct injection* injects the script into a
`<script>` tag in the DOM.

## Resources

* [Video about isolated worlds](https://www.youtube.com/watch?v=laLudeUmXHM)
* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [FOAM](http://foam-framework.github.io/foam/)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/shared-script/manifest.json

{
  "manifest_version": 2,
  "name": "Shared Script Sample: More Dragons!",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "webview"
  ]
}

---

## File: _archive/apps/samples/webview-samples/user-agent/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/fbkdeonndngdbojbccanjnpnlpdmgchc"></a>


# User Agent Override

Sample that shows how to use the [webview
tag](http://developer.chrome.com/apps/app_external#webview) in an app to
create a browser with multiple personalities. The browser [overrides the user
agent
string](https://developer.chrome.com/apps/tags/webview#method-setUserAgentOverride)
for multiple views of the same webpage.

The app's main window contains a series of `<webview>`s that are sized to fit
most of it (via the `width` and `height` attributes). Clicking links, the
navigation control buttons, or entering an address in the location bar
update the `src` attribute of all webviews.

`<webview>` is the preferred way for you to load web content into your
app. It runs in a separate process and has its own storage, ensuring the
security and reliability of your application.

## Resources

* [Webview](http://developer.chrome.com/apps/app_external#webview)
* [Permissions](http://developer.chrome.com/apps/manifest#permissions)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/user-agent/manifest.json

{
  "manifest_version": 2,
  "name": "User-Agent Sample",
  "minimum_chrome_version": "24.0.1307.0",
  "version": "2.0",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "webview"
  ]
}

---

## File: _archive/apps/samples/webview-samples/webview/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/hnanccpkhjhkkgiipckodmdldeomdohj"></a>


# Webview explorer sample

Sample to explore some of the APIs in the webview tag.

## APIs

* [webview](https://developer.chrome.com/apps/tags/webview)
* [Runtime](https://developer.chrome.com/docs/extensions/reference/app_runtime)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)


## Screenshot

---

## File: _archive/apps/samples/webview-samples/webview/manifest.json

{
  "manifest_version": 2,
  "name": "Webview Sample",
  "version": "2.1",
  "permissions": ["webview", "pointerLock", "geolocation", "videoCapture"],
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/apps/samples/window-options/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/cfcgoifcnpnadlhhoolkemkjkhoajfmk"></a>



# Window Options Sample

Demonstrates:

* Window bounds and size constraints.
* Options available for creating new windows.
* Options that can be changed after creation of the window.

This sample requires Chrome Version 35 or higher.

## Resources

* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/window-options/manifest.json

{
  "manifest_version": 2,
  "name": "Window Options Sample",
  "version": "2",
  "minimum_chrome_version": "35",
  "icons": {
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": ["fullscreen", "alwaysOnTopWindows"]
}

---

## File: _archive/apps/samples/window-state/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/window-state-sample/hcbhfbnaaancmblfhdknlnojpafjohbi"></a>


# Window State Sample

Demonstrates transitioning the window into minimized, maximized, fullscreen
and hidden states. Includes HTML5 requestFullscreen and app.window.fullscreen().

## Resources

* [Fullscreen Specification](http://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html)
* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/window-state/manifest.json

{
  "manifest_version": 2,
  "name": "Window State Sample",
  "version": "4.2",
  "icons": {
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": ["fullscreen", "alwaysOnTopWindows"]
}

---

## File: _archive/apps/samples/windows/README.md

<a target="_blank" href="https://chrome.google.com/webstore/detail/ldenchfohdfgggloeimambnckhjpedgc"></a>


# Copycat Window

Sample that shows how to use the [window API](https://developer.chrome.com/docs/extensions/reference/app_window) to create a window with a custom frame and manipulate its properties.

The app creates two windows, an "original" window and a "copycat" window. The copycat window mimics the position and minimize state of the original window, but it displays itself in an inverted fashion.

## APIs

* [Window](https://developer.chrome.com/docs/extensions/reference/app_window)

## Screenshot

---

## File: _archive/apps/samples/windows/manifest.json

{
  "manifest_version": 2,
  "name": "Windowing API Sample",
  "version": "3",
  "minimum_chrome_version": "23",
  "icons": {
    "16": "icon_16.png",
    "128": "icon_128.png"
  },
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  }
}

---

## File: _archive/mv2/readme.md

# Chrome Extensions samples (Manifest v2)

Official samples for Chrome Extensions and the Chrome Apps platform.
Note that Chrome Apps are deprecated—learn more [on the Chromium blog](https://blog.chromium.org/2020/08/changes-to-chrome-app-support-timeline.html).

For more information on extensions, see [Chrome Developers](https://developer.chrome.com).

## Samples

The directory structure is as follows:

* api/ - extensions focused on a single API package
* howto/ - extensions that show how to perform a particular task
* tutorials/ - multi-step walkthroughs referenced inline in the docs
* extensions/ - full featured extensions spanning multiple API packages

To experiment with these samples, please clone this repo and use 'Load Unpacked Extension'.
Read more on [Getting Started](https://developer.chrome.com/extensions/getstarted).

Sample | Calls
--- | ---
[My Bookmarks](api/bookmarks/basic)A browser action with a popup dump of all bookmarks, including search, add, edit and delete. | <li>bookmarks.create</li><li>bookmarks.getTree</li><li>bookmarks.remove</li><li>bookmarks.update</li><li>tabs.create</li>
[Page Redder](api/browserAction/make_page_red)Make the current page red | <li>browserAction.onClicked</li><li>tabs.executeScript</li>
[Print this page](api/browserAction/print)Adds a print button to the browser. | <li>browserAction.onClicked</li><li>tabs.executeScript</li>
[A browser action which changes its icon when clicked](api/browserAction/set_icon_path)Click browser action icon to change color! | <li>browserAction.onClicked</li><li>browserAction.setIcon</li><li>runtime.onInstalled</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[A browser action with a popup that changes the page color](api/browserAction/set_page_color)Change the current page color | <li>tabs.executeScript</li>
[BrowsingData API: Basics](api/browsingData/basic)A trivial usage example. | <li>browsingData.remove</li>
[Sample Extension Commands extension](api/commands)Press Ctrl+Shift+F to open the browser action popup, press Ctrl+Shift+Y to send an event. | <li>commands.onCommand</li>
[Content settings](api/contentSettings)Shows the content settings for the current site. | <li>contentSettings.ContentSetting.get</li><li>contentSettings.ContentSetting.set</li><li>tabs.query</li>
[Context Menus Sample](api/contextMenus/basic)Shows some of the features of the Context Menus API | <li>contextMenus.create</li><li>extension.lastError</li>
[Context Menus Sample (with Event Page)](api/contextMenus/event_page)Shows some of the features of the Context Menus API using an event page | <li>contextMenus.create</li><li>contextMenus.onClicked</li><li>extension.lastError</li><li>runtime.onInstalled</li>
[Global Google Search](api/contextMenus/global_context_search)Use the context menu to search a different country's Google | <li>contextMenus.create</li><li>contextMenus.onClicked</li><li>contextMenus.remove</li><li>runtime.onInstalled</li><li>storage.onChanged</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabs.create</li>
[Cookie API Test Extension](api/cookies)Testing Cookie API | <li>browserAction.onClicked</li><li>cookies.getAll</li><li>cookies.onChanged</li><li>cookies.remove</li><li>extension.getURL</li><li>tabs.create</li><li>tabs.update</li><li>windows.getAll</li>
[Live HTTP headers](api/debugger/live-headers)Displays the live log with the http requests headers | <li>browserAction.onClicked</li><li>debugger.attach</li><li>debugger.detach</li><li>debugger.onEvent</li><li>debugger.sendCommand</li><li>runtime.lastError</li><li>windows.create</li>
[JavaScript pause/resume](api/debugger/pause-resume)Pauses / resumes JavaScript execution | <li>browserAction.onClicked</li><li>browserAction.setIcon</li><li>browserAction.setTitle</li><li>debugger.attach</li><li>debugger.detach</li><li>debugger.onDetach</li><li>debugger.onEvent</li><li>debugger.sendCommand</li><li>runtime.lastError</li>
[Tab Flipper](api/default_command_override)Press Ctrl+Shift+Right or Ctrl+Shift+Left (Command+Shift+Right or Command+Shift+Left on a Mac) to flip through window tabs | <li>commands.onCommand</li><li>tabs.query</li><li>tabs.update</li>
[Desktop Capture Example](api/desktopCapture)Show desktop media picker UI | <li>desktopCapture.cancelChooseDesktopMedia</li><li>desktopCapture.chooseDesktopMedia</li><li>runtime.onMessage</li><li>runtime.sendMessage</li>
[My Devices](api/deviceInfo/basic)A browser action with a popup dump of all devices signed into the same account as the current profile. | <li>signedInDevices.get</li><li>signedInDevices.onDeviceInfoChange</li>
[FirePHP for Chrome](api/devtools/network/chrome-firephp)Extends the Developer Tools, adding support for parsing FirePHP messages from server | <li>devtools.network.getHAR</li><li>devtools.network.onRequestFinished</li><li>extension.onRequest</li><li>extension.sendRequest</li><li>tabs.executeScript</li>
[Chrome Query](api/devtools/panels/chrome-query)Extends the Developer Tools, adding a sidebar that displays the jQuery data associated with the selected DOM element. | <li>devtools.panels.ElementsPanel.createSidebarPane</li><li>devtools.panels.ElementsPanel.onSelectionChanged</li>
[tabCast](api/displaySource/tabCast)Creates a WiFi Display Session from the captured tab media stream using chrome.displaySource API. | <li>displaySource.getAvailableSinks</li><li>displaySource.onSessionTerminated</li><li>displaySource.onSinksUpdated</li><li>displaySource.startSession</li><li>displaySource.terminateSession</li><li>extension.getBackgroundPage</li><li>runtime.lastError</li><li>runtime.onMessage</li><li>runtime.sendMessage</li><li>tabCapture.capture</li><li>tabs.getCurrent</li>
[Document Scanning API Sample](api/document_scan) | <li>documentScan.scan</li><li>permissions.contains</li><li>permissions.request</li><li>runtime.lastError</li>
[Download Filename Controller](api/downloads/download_filename_controller)Download Filename Controller | <li>downloads.onDeterminingFilename</li>
[Download Selected Links](api/downloads/download_links)Select links on a page and download them. | <li>downloads.download</li><li>extension.onRequest</li><li>extension.sendRequest</li><li>tabs.executeScript</li><li>tabs.query</li><li>windows.getCurrent</li>
[Download Manager Button](api/downloads/download_manager)Browser Action Download Manager User Interface for Google Chrome | <li>browserAction.setIcon</li><li>downloads.acceptDanger</li><li>downloads.cancel</li><li>downloads.download</li><li>downloads.erase</li><li>downloads.getFileIcon</li><li>downloads.onChanged</li><li>downloads.onCreated</li><li>downloads.onErased</li><li>downloads.open</li><li>downloads.pause</li><li>downloads.removeFile</li><li>downloads.resume</li><li>downloads.search</li><li>downloads.setShelfEnabled</li><li>downloads.show</li><li>downloads.showDefaultFolder</li><li>i18n.getMessage</li><li>permissions.contains</li><li>permissions.request</li><li>runtime.onMessage</li><li>runtime.sendMessage</li><li>tabs.create</li>
[Download and Open Button](api/downloads/download_open)Download and Open Context Menu Button | <li>contextMenus.create</li><li>contextMenus.onClicked</li><li>downloads.download</li><li>downloads.onChanged</li><li>downloads.open</li><li>i18n.getMessage</li>
[Downloads Overwrite Existing Files](api/downloads/downloads_overwrite)All downloads overwrite existing files instead of adding ' (1)', ' (2)', etc. | <li>downloads.onDeterminingFilename</li>
[Event Page Example](api/eventPage/basic)Demonstrates usage and features of the event page | <li>alarms.create</li><li>alarms.onAlarm</li><li>bookmarks.onRemoved</li><li>browserAction.onClicked</li><li>browserAction.setBadgeText</li><li>commands.onCommand</li><li>declarativeWebRequest.RedirectRequest</li><li>declarativeWebRequest.RequestMatcher</li><li>runtime.onInstalled</li><li>runtime.onMessage</li><li>runtime.onSuspend</li><li>runtime.sendMessage</li><li>tabs.create</li><li>tabs.executeScript</li><li>tabs.query</li><li>tabs.sendMessage</li>
[`extension.isAllowedFileSchemeAccess` and `extension.isAllowedIncognitoAccess` Example](api/extension/isAllowedAccess)Demonstrates the `extension.isAllowedFileSchemeAccess` and `extesion.isAllowedIncognitoAccess` APIs | <li>extension.isAllowedFileSchemeAccess</li><li>extension.isAllowedIncognitoAccess</li>
[Fake Archive Handler App](api/fileSystemProvider/archive)Demonstrate File System Provider API usage for apps. | <li>fileSystemProvider.get</li><li>fileSystemProvider.mount</li><li>fileSystemProvider.onCloseFileRequested</li><li>fileSystemProvider.onGetMetadataRequested</li><li>fileSystemProvider.onOpenFileRequested</li><li>fileSystemProvider.onReadDirectoryRequested</li><li>fileSystemProvider.onReadFileRequested</li><li>fileSystemProvider.onUnmountRequested</li><li>fileSystemProvider.unmount</li><li>runtime.lastError</li><li>runtime.onStartup</li><li>runtime.onSuspend</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[File System Provider API Extension Example](api/fileSystemProvider/basic)Demonstrate features of the API like mounting, listing directories, etc for extensions. | <li>fileSystemProvider.mount</li><li>fileSystemProvider.onCloseFileRequested</li><li>fileSystemProvider.onGetMetadataRequested</li><li>fileSystemProvider.onMountRequested</li><li>fileSystemProvider.onOpenFileRequested</li><li>fileSystemProvider.onReadDirectoryRequested</li><li>fileSystemProvider.onReadFileRequested</li><li>fileSystemProvider.onUnmountRequested</li><li>fileSystemProvider.unmount</li><li>runtime.lastError</li>
[Advanced Font Settings](api/fontSettings)Customize per-script font settings. | <li>fontSettings.clearDefaultFixedFontSize</li><li>fontSettings.clearDefaultFontSize</li><li>fontSettings.clearFont</li><li>fontSettings.clearMinimumFontSize</li><li>fontSettings.getDefaultFixedFontSize</li><li>fontSettings.getDefaultFontSize</li><li>fontSettings.getFont</li><li>fontSettings.getFontList</li><li>fontSettings.getMinimumFontSize</li><li>fontSettings.onDefaultFixedFontSizeChanged</li><li>fontSettings.onDefaultFontSizeChanged</li><li>fontSettings.onFontChanged</li><li>fontSettings.onMinimumFontSizeChanged</li><li>fontSettings.setDefaultFixedFontSize</li><li>fontSettings.setDefaultFontSize</li><li>fontSettings.setFont</li><li>fontSettings.setMinimumFontSize</li>
[History Override](api/history/historyOverride)Overrides the History Page | <li>history.deleteAll</li><li>history.deleteUrl</li><li>history.search</li>
[Typed URL History](api/history/showHistory)Reads your history, and shows the top ten pages you go to by typing the URL. | <li>history.getVisits</li><li>history.search</li><li>tabs.create</li>
[CLD](api/i18n/cld)Displays the language of a tab | <li>browserAction.setBadgeText</li><li>tabs.detectLanguage</li><li>tabs.onSelectionChanged</li><li>tabs.onUpdated</li><li>tabs.query</li>
[Detect Language](api/i18n/detectLanguage)Detects up to 3 languages and their percentages of the provided string | <li>i18n.detectLanguage</li>
[AcceptLanguage](api/i18n/getMessage)Returns accept languages of the browser | <li>i18n.getAcceptLanguages</li><li>i18n.getMessage</li>
[Minimal Localized Hosted App](api/i18n/localizedHostedApp)This is the minimal set of data required to upload a localized hosted application to the web store. | 
[Idle - Simple Example](api/idle/idle_simple)Demonstrates the Idle API | <li>browserAction.onClicked</li><li>extension.getBackgroundPage</li><li>idle.onStateChanged</li><li>idle.queryState</li>
[Test IME](api/input.ime/basic)A simple IME that converts all keystrokes to upper case. | <li>input.ime</li><li>input.ime.commitText</li><li>input.ime.onActivate</li><li>input.ime.onBlur</li><li>input.ime.onDeactivated</li><li>input.ime.onFocus</li><li>input.ime.onKeyEvent</li>
[Message Timer](api/messaging/timer)Times how long it takes to send a message to a content script and back. | <li>runtime.onConnect</li><li>runtime.onMessage</li><li>tabs.connect</li><li>tabs.query</li><li>tabs.sendMessage</li>
[Native Messaging Example](api/nativeMessaging/app)Send a message to a native application. | <li>runtime.connectNative</li>
[Notification Demo](api/notifications)Shows off desktop notifications, which are "toast" windows that pop up on the desktop. | 
[Omnibox New Tab Search](api/omnibox/newtab_search)Type 'nt' plus a search term into the Omnibox to open search in new tab. | <li>omnibox.onInputEntered</li><li>tabs.create</li>
[Omnibox Example](api/omnibox/simple-example)To use, type 'omnix' plus a search term into the Omnibox. | <li>omnibox.onInputChanged</li><li>omnibox.onInputEntered</li>
[Blank new tab page](api/override/blank_ntp)Override the new tab page with a blank one | 
[iGoogle new tab page](api/override/override_igoogle)Override the new tab page with iGoogle | 
[Page action by content](api/pageAction/pageaction_by_content)Shows a page action for HTML pages containing a video | <li>declarativeContent.PageStateMatcher</li><li>declarativeContent.ShowPageAction</li><li>runtime.onInstalled</li>
[Page action by URL](api/pageAction/pageaction_by_url)Shows a page action for urls which have the letter 'g' in them. | <li>declarativeContent.PageStateMatcher</li><li>declarativeContent.ShowPageAction</li><li>runtime.onInstalled</li>
[Animated Page Action](api/pageAction/set_icon)This extension adds an animated browser action to the toolbar. | <li>pageAction.hide</li><li>pageAction.onClicked</li><li>pageAction.setIcon</li><li>pageAction.setTitle</li><li>pageAction.show</li><li>tabs.onSelectionChanged</li><li>tabs.query</li>
[Top Chrome Extension Questions](api/permissions/extension-questions)Sample demonstration of the optional permissions API. | <li>permissions.contains</li><li>permissions.onAdded</li><li>permissions.onRemoved</li><li>permissions.remove</li><li>permissions.request</li><li>tabs.create</li>
[Keep Awake](api/power)Override system power-saving settings. | <li>browserAction.onClicked</li><li>browserAction.setIcon</li><li>browserAction.setTitle</li><li>i18n.getMessage</li><li>power.releaseKeepAwake</li><li>power.requestKeepAwake</li><li>runtime.onInstalled</li><li>runtime.onStartup</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[Block/allow third-party cookies API example extension](api/preferences/allowThirdPartyCookies)Sample extension which demonstrates how to access a preference. | <li>extension.isAllowedIncognitoAccess</li>
[Block/allow referrer API example extension](api/preferences/enableReferrer)Sample extension which demonstrates how to access a preference. | <li>extension.isAllowedIncognitoAccess</li>
[Print Extension](api/printing)Sends print job directly to the printers installed on the Chromebook | <li>printing.getPrinterInfo</li><li>printing.getPrinters</li><li>printing.submitJob</li><li>runtime.lastError</li>
[Print Job History](api/printingMetrics)Reads your print history and displays the recent print jobs. | <li>browserAction.setBadgeText</li><li>printingMetrics.getPrintJobs</li><li>printingMetrics.onPrintJobFinished</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[Process Monitor](api/processes/process_monitor)Adds a browser action that monitors resource usage of all browser processes. | <li>processes.onUpdatedWithMemory</li><li>processes.terminate</li>
[Show Tabs in Process](api/processes/show_tabs)Adds a browser action showing which tabs share the current tab's process. | <li>processes.getProcessIdForTab</li><li>tabs.query</li><li>tabs.update</li><li>windows.getAll</li><li>windows.getCurrent</li><li>windows.update</li>
[Stylizr](api/storage/stylizr)Spruce up your pages with custom CSS. | <li>extension.getURL</li><li>runtime.lastError</li><li>storage.local</li><li>storage.StorageArea.clear</li><li>storage.StorageArea.get</li><li>storage.StorageArea.remove</li><li>storage.StorageArea.set</li><li>tabs.insertCSS</li>
[Tab Capture Example](api/tabCapture)Capture a tab and play in a | <li>browserAction.onClicked</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabCapture.capture</li><li>tabCapture.getMediaStreamId</li>
[Tab Inspector](api/tabs/inspector)Utility for working with the extension tabs api | <li>browserAction.onClicked</li><li>extension.getURL</li><li>tabs.create</li><li>tabs.get</li><li>tabs.getAllInWindow</li><li>tabs.move</li><li>tabs.onAttached</li><li>tabs.onCreated</li><li>tabs.onDetached</li><li>tabs.onMoved</li><li>tabs.onRemoved</li><li>tabs.onSelectionChanged</li><li>tabs.onUpdated</li><li>tabs.query</li><li>tabs.remove</li><li>tabs.update</li><li>windows.create</li><li>windows.get</li><li>windows.getAll</li><li>windows.getCurrent</li><li>windows.getLastFocused</li><li>windows.onCreated</li><li>windows.onFocusChanged</li><li>windows.onRemoved</li><li>windows.remove</li><li>windows.update</li>
[Keyboard Pin](api/tabs/pin)Creates a keyboard shortcut (Alt + Shift + P) to toggle the pinned state of the currently selected tab | <li>commands.onCommand</li><li>tabs.query</li><li>tabs.update</li>
[Test Screenshot Extension](api/tabs/screenshot)Demonstrate screenshot functionality in the chrome.tabs api. | <li>browserAction.onClicked</li><li>extension.getURL</li><li>extension.getViews</li><li>tabs.captureVisibleTab</li><li>tabs.create</li><li>tabs.onUpdated</li>
[Tabs Zoom API Demo](api/tabs/zoom)This extension allows the user to explore features of the new tabs zoom api. | <li>runtime.lastError</li><li>tabs.getZoom</li><li>tabs.getZoomSettings</li><li>tabs.onZoomChange</li><li>tabs.query</li><li>tabs.setZoom</li><li>tabs.setZoomSettings</li>
[Top Sites](api/topsites/basic)Shows the top sites in a browser action | <li>tabs.create</li><li>topSites.get</li>
[NTP prototyping extension](api/topsites/magic8ball)extension to prototype new NTP designs | <li>topSites.get</li>
[Console TTS Engine](api/ttsEngine/console_tts_engine)A "silent" TTS engine that prints text to a small window rather than synthesizing speech. | <li>extension.getViews</li><li>ttsEngine.onSpeak</li><li>ttsEngine.onStop</li><li>windows.create</li><li>windows.getCurrent</li><li>windows.onRemoved</li>
[Drink Water Event Popup](api/water_alarm_notification)Demonstrates usage and features of the event page by reminding user to drink water | <li>alarms.clearAll</li><li>alarms.create</li><li>alarms.onAlarm</li><li>browserAction.setBadgeText</li><li>notifications.create</li><li>notifications.onButtonClicked</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[WebNavigation Tech Demo](api/webNavigation/basic)Demonstration of the WebNavigation extension API. | <li>i18n.getMessage</li><li>runtime.onMessage</li><li>runtime.onStartup</li><li>runtime.sendMessage</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>webNavigation.onBeforeNavigate</li><li>webNavigation.onCommitted</li><li>webNavigation.onCompleted</li><li>webNavigation.onCreatedNavigationTarget</li><li>webNavigation.onErrorOccurred</li><li>webNavigation.onHistoryStateUpdated</li><li>webNavigation.onReferenceFragmentUpdated</li>
[Webview transparency](api/webview/capturevisibleregion)Sample of the webview.captureVisibleRegion api | 
[WebView Extension Communications Demo: App](api/webview/comm_demo_app) | <li>runtime.connect</li>
[WebView Extension Communications Demo: Extension](api/webview/comm_demo_ext)Provides content scripts to an app hosting a WebView. | <li>runtime.id</li><li>runtime.onConnectExternal</li>
[Merge Windows](api/windows/merge_windows)Merges all of the browser's windows into the current window | <li>browserAction.onClicked</li><li>tabs.getAllInWindow</li><li>tabs.move</li><li>windows.getAll</li><li>windows.getCurrent</li>
[Chrome Apps](../apps)A collection of samples demonstrating the Chrome App platform. | 
[App Launcher](extensions/app_launcher)Get access to your apps in a browser action | <li>extension.getURL</li><li>management.getAll</li><li>management.launchApp</li><li>tabs.create</li>
[Chromium Buildbot Monitor](extensions/buildbot)Displays the status of the Chromium buildbot in the toolbar. Click to see more detailed status in a popup. | <li>browserAction.setBadgeBackgroundColor</li><li>browserAction.setBadgeText</li><li>browserAction.setTitle</li><li>extension.getBackgroundPage</li><li>extension.getURL</li><li>extension.getViews</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[Google Calendar Checker (by Google)](extensions/calendar)Quickly see the time until your next meeting from any of your calendars. Click on the button to be taken to your calendar. | <li>browserAction.onClicked</li><li>browserAction.setBadgeBackgroundColor</li><li>browserAction.setBadgeText</li><li>i18n.getMessage</li><li>management.uninstallSelf</li><li>notifications.clear</li><li>notifications.create</li><li>notifications.onButtonClicked</li><li>notifications.onClicked</li><li>runtime.getURL</li><li>runtime.id</li><li>runtime.onInstalled</li><li>tabs.create</li>
[CatBlock](extensions/catblock)I can't has cheezburger! | <li>webRequest.onBeforeRequest</li>
[Catifier](extensions/catifier)Moar cats! | <li>declarativeWebRequest.IgnoreRules</li><li>declarativeWebRequest.RedirectRequest</li><li>declarativeWebRequest.RequestMatcher</li><li>runtime.lastError</li><li>runtime.onInstalled</li>
[Chromium Search](extensions/chrome_search)Add support to the omnibox to search the Chromium source code. | <li>omnibox.onInputCancelled</li><li>omnibox.onInputChanged</li><li>omnibox.onInputEntered</li><li>omnibox.onInputStarted</li><li>omnibox.setDefaultSuggestion</li><li>tabs.query</li><li>tabs.update</li>
[Constant Context](extensions/constant_context)Highlights elements with keywords on developer.chrome | <li>declarativeContent.PageStateMatcher</li><li>declarativeContent.ShowPageAction</li><li>runtime.onInstalled</li><li>storage.StorageArea.clear</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabs.executeScript</li>
[Download Images](extensions/download_images)Displays all webpage images and allows user to download | <li>declarativeContent.PageStateMatcher</li><li>declarativeContent.ShowPageAction</li><li>downloads.download</li><li>runtime.lastError</li><li>runtime.onInstalled</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabs.create</li><li>tabs.executeScript</li>
[Email this page (by Google)](extensions/email_this_page)This extension adds an email button to the toolbar which allows you to email the page link using your default mail client or Gmail. | <li>browserAction.onClicked</li><li>runtime.connect</li><li>runtime.onConnect</li><li>tabs.create</li><li>tabs.executeScript</li><li>tabs.update</li>
[Chrome Sounds](extensions/fx)Enjoy a more magical and immersive experience when browsing the web using the power of sound. | <li>bookmarks.onCreated</li><li>bookmarks.onMoved</li><li>bookmarks.onRemoved</li><li>extension.getBackgroundPage</li><li>extension.onRequest</li><li>extension.sendRequest</li><li>tabs.get</li><li>tabs.onAttached</li><li>tabs.onCreated</li><li>tabs.onDetached</li><li>tabs.onMoved</li><li>tabs.onRemoved</li><li>tabs.onSelectionChanged</li><li>tabs.onUpdated</li><li>windows.onCreated</li><li>windows.onFocusChanged</li><li>windows.onRemoved</li>
[Google Document List Viewer](extensions/gdocs)Demonstrates how to use OAuth to connect the Google Documents List Data API. | <li>extension.getBackgroundPage</li><li>extension.getURL</li><li>tabs.create</li><li>tabs.onUpdated</li><li>tabs.query</li><li>tabs.remove</li>
[Google Mail Checker](extensions/gmail)Displays the number of unread messages in your Google Mail inbox. You can also click the button to open your inbox. | <li>alarms.create</li><li>alarms.get</li><li>alarms.onAlarm</li><li>browserAction.onClicked</li><li>browserAction.setBadgeBackgroundColor</li><li>browserAction.setBadgeText</li><li>browserAction.setIcon</li><li>i18n.getMessage</li><li>runtime.onInstalled</li><li>runtime.onStartup</li><li>runtime.onStartup</li><li>tabs.create</li><li>tabs.getAllInWindow</li><li>tabs.onUpdated</li><li>tabs.update</li><li>webNavigation.onDOMContentLoaded</li><li>webNavigation.onDOMContentLoaded</li><li>webNavigation.onReferenceFragmentUpdated</li><li>webNavigation.onReferenceFragmentUpdated</li><li>windows.onCreated</li>
[Imageinfo](extensions/imageinfo)Get image info for images, including EXIF data | <li>contextMenus.create</li><li>tabs.getCurrent</li><li>windows.create</li><li>windows.update</li>
[Chromium IRC App](extensions/irc/app) | 
[Managed Bookmarks](extensions/managed_bookmarks)Adds bookmarks configured by your system administrator to Chrome. | <li>bookmarks.create</li><li>bookmarks.getChildren</li><li>bookmarks.move</li><li>bookmarks.onChanged</li><li>bookmarks.onMoved</li><li>bookmarks.onRemoved</li><li>bookmarks.remove</li><li>bookmarks.removeTree</li><li>bookmarks.update</li><li>runtime.onInstalled</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>storage.StorageArea.get</li><li>storage.onChanged</li>
[Mappy](extensions/mappy)Finds addresses in the web page you're on and pops up a map window. | <li>pageAction.setTitle</li><li>pageAction.show</li><li>runtime.onMessage</li><li>runtime.sendMessage</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[Google Maps](extensions/maps_app) | 
[News Reader (by Google)](extensions/news)Displays the latest stories from Google News in a popup. | <li>extension.getURL</li><li>i18n.getMessage</li><li>tabs.create</li>
[News Reader](extensions/news_a11y)Displays the first 5 items from the 'Google News - top news' RSS feed in a popup. | <li>tabs.create</li>
[News Reader](extensions/news_i18n)Displays the first 5 items from the '$Google$ News - top news' RSS feed in a popup. | 
[No Cookies](extensions/no_cookies)Removes 'Cookie' and 'Set-Cookie' headers. | <li>webRequest.onBeforeSendHeaders</li><li>webRequest.onHeadersReceived</li>
[Sample - OAuth Contacts](extensions/oauth_contacts)Uses OAuth to connect to Google's contacts service and display a list of your contacts. | <li>browserAction.onClicked</li><li>browserAction.setIcon</li><li>extension.getBackgroundPage</li><li>extension.getURL</li><li>tabs.create</li><li>tabs.onUpdated</li><li>tabs.query</li><li>tabs.remove</li>
[Optional Permissions New Tab](extensions/optional_permissions)Demonstrates optional permissions in extensions | <li>permissions.contains</li><li>permissions.request</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>topSites.get</li>
[Per-plugin content settings](extensions/plugin_settings)Customize your content setting for different plugins. | <li>contentSettings.plugins</li><li>contentSettings.ContentSetting.clear</li><li>contentSettings.ContentSetting.getResourceIdentifiers</li><li>contentSettings.ContentSetting.set</li><li>i18n.getMessage</li><li>runtime.lastError</li>
[Proxy Extension API Sample](extensions/proxy_configuration)Set Chrome-specific proxies; a demonstration of Chrome's Proxy API | <li>browserAction.setBadgeBackgroundColor</li><li>browserAction.setBadgeText</li><li>browserAction.setTitle</li><li>extension.isAllowedIncognitoAccess</li><li>extension.onRequest</li><li>extension.sendRequest</li><li>i18n.getMessage</li><li>proxy.onProxyError</li><li>runtime.lastError</li>
[Speak Selection](extensions/speak_selection)Speaks the current selection out loud. | <li>browserAction.onClicked</li><li>browserAction.setIcon</li><li>extension.getURL</li><li>extension.onRequest</li><li>extension.sendRequest</li><li>tabs.create</li><li>tabs.executeScript</li><li>tabs.sendRequest</li><li>tts.getVoices</li><li>tts.speak</li><li>tts.stop</li><li>windows.getAll</li>
[Talking Alarm Clock](extensions/talking_alarm_clock)A clock with two configurable alarms that will play a sound and speak a phrase of your choice. | <li>browserAction.setIcon</li><li>runtime.connect</li><li>runtime.onConnect</li><li>tts.getVoices</li><li>tts.speak</li><li>tts.stop</li>
[TTS Debug](extensions/ttsdebug)Tool for developers of Chrome TTS engine extensions to help them test their engines are implementing the API correctly. | <li>tts.getVoices</li><li>tts.speak</li><li>tts.stop</li>
[TTS Demo](extensions/ttsdemo)Demo Chrome's synthesized text-to-speech capabilities. | <li>runtime.lastError</li><li>tts.getVoices</li><li>tts.isSpeaking</li><li>tts.speak</li><li>tts.stop</li>
[Sandboxed Frame](howto/sandbox)Demonstrate use of handlebars inside a sandboxed frame | <li>browserAction.onClicked</li>
[Tab Shortcuts](howto/tab_shortcuts)Allows pinning and duplication of tabs via keyboard shortcuts. | <li>commands.onCommand</li><li>tabs.duplicate</li><li>tabs.update</li>
[Event Tracking with Google Analytics](tutorials/analytics)A sample extension which uses Google Analytics to track usage. | 
[Broken Background Color](tutorials/broken_background_color)Fix an Extension! | <li>declarativeContent.PageStateMatcher</li><li>declarativeContent.ShowPageAction</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabs.executeScript</li>
[Getting Started Example](tutorials/get_started)Build an Extension! | <li>runtime.onInstalled</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li>
[Getting Started Example](tutorials/get_started_complete)Build an Extension! | <li>declarativeContent.PageStateMatcher</li><li>declarativeContent.ShowPageAction</li><li>runtime.onInstalled</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabs.executeScript</li><li>tabs.query</li>
[Getting started example](tutorials/getstarted)This extension allows the user to change the background color of the current page. | <li>runtime.lastError</li><li>storage.local</li><li>storage.sync</li><li>storage.StorageArea.get</li><li>storage.StorageArea.set</li><li>tabs.executeScript</li><li>tabs.query</li>
[Hello Extensions](tutorials/hello_extensions)Base Level Extension | 
[OAuth Tutorial FriendBlock](tutorials/oauth_starter)Uses OAuth to connect to Google's People API and display contacts photos. | <li>browserAction.onClicked</li><li>identity.getAuthToken</li><li>tabs.create</li>
[OAuth Tutorial FriendBlock](tutorials/oauth_tutorial_complete)Uses OAuth to connect to Google's People API and display contacts photos. | <li>browserAction.onClicked</li><li>identity.getAuthToken</li><li>tabs.create</li>

---

## File: _archive/mv2/api/bookmarks/basic/manifest.json

{
  "name": "My Bookmarks",
  "description": "A browser action with a popup dump of all bookmarks, including search, add, edit and delete.",
  "version": "1.1",
  "manifest_version": 2,
  "permissions": [
    "bookmarks"
  ],
  "browser_action": {
      "default_title": "My Bookmarks",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'"
}

---

## File: _archive/mv2/api/browserAction/make_page_red/manifest.json

{
  "name": "Page Redder",
  "description": "Make the current page red",
  "version": "2.0",
  "permissions": [
    "activeTab"
  ],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_title": "Make this page red"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/browserAction/print/manifest.json

{
  "name": "Print this page",
  "description": "Adds a print button to the browser.",
  "version": "1.2",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "permissions": [
    "activeTab"
  ],
  "browser_action": {
      "default_title": "Print this page",
      "default_icon": "print_16x16.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/browserAction/set_icon_path/manifest.json

{
  "name": "A browser action which changes its icon when clicked",
  "description": "Click browser action icon to change color!",
  "version": "1.3",
  "background": {
     "scripts": ["background.js"],
     "persistent": false
   },
  "permissions": ["storage"],
  "browser_action": {
      "name": "Click to change the icon's color"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/browserAction/set_page_color/manifest.json

{
  "name": "A browser action with a popup that changes the page color",
  "description": "Change the current page color",
  "version": "1.0",
  "permissions": [
    "activeTab"
  ],
  "browser_action": {
      "default_title": "Set this page's color.",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/browsingData/basic/manifest.json

{
  "name" : "BrowsingData API: Basics",
  "version" : "1.1",
  "description" : "A trivial usage example.",
  "permissions": [
    "browsingData"
  ],
  "browser_action": {
     "default_icon": "icon.png",
     "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/commands/manifest.json

{
  "name": "Sample Extension Commands extension",
  "description": "Press Ctrl+Shift+F to open the browser action popup, press Ctrl+Shift+Y to send an event.",
  "version": "1.0",
  "manifest_version": 2,
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_popup": "browser_action.html"
  },
  "commands": {
    "toggle-feature": {
      "suggested_key": {
        "default": "Ctrl+Shift+Y",
        "mac": "MacCtrl+Shift+Y"
       },
      "description": "Send a 'toggle-feature' event to the extension"
    },
    "_execute_browser_action": {
      "suggested_key": {
        "default": "Ctrl+Shift+F",
        "mac": "MacCtrl+Shift+F"
      }
    }
  }
}

---

## File: _archive/mv2/api/contentSettings/manifest.json

{
  "name" : "Content settings",
  "version" : "0.2",
  "description" : "Shows the content settings for the current site.",
  "permissions": [ "contentSettings", "tabs" ],
  "browser_action": {
     "default_icon": "contentSettings.png",
     "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/contextMenus/basic/manifest.json

{
  "name": "Context Menus Sample",
  "description": "Shows some of the features of the Context Menus API",
  "version": "0.6",
  "permissions": ["contextMenus"],
  "background": {
    "scripts": ["sample.js"]
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/contextMenus/event_page/manifest.json

{
  "name": "Context Menus Sample (with Event Page)",
  "description": "Shows some of the features of the Context Menus API using an event page",
  "version": "0.7",
  "permissions": ["contextMenus"],
  "background": {
    "persistent": false,
    "scripts": ["sample.js"]
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/contextMenus/global_context_search/manifest.json

{
  "name": "Global Google Search",
  "description": "Use the context menu to search a different country's Google",
  "version": "1.0",
  "manifest_version": 2,
  "options_page": "options.html",
  "permissions": ["contextMenus", "storage"],
  "background": {
    "scripts": [ "locales.js", "background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_popup": "options.html"
  },
  "icons": {
   "16": "globalGoogle16.png",
   "48": "globalGoogle48.png",
  "128": "globalGoogle128.png"
 }
}

---

## File: _archive/mv2/api/cookies/manifest.json

{
  "name" : "Cookie API Test Extension",
  "version" : "0.8",
  "description" : "Testing Cookie API",
  "permissions": [ "cookies", "tabs", "http://*/*", "https://*/*" ],
  "icons": { "16": "cookie.png", "48": "cookie.png", "128": "cookie.png" },
  "browser_action": {
    "default_icon": "cookie.png"
  },
  "background": {
    "scripts": ["background.js"]
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/debugger/live-headers/manifest.json

{
  "name": "Live HTTP headers",
  "description": "Displays the live log with the http requests headers",
  "version": "0.7",
  "permissions": [
    "debugger"
  ],
  "background": {
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_icon": "icon.png",
    "default_title": "Live HTTP headers"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/debugger/pause-resume/manifest.json

{
  "name": "JavaScript pause/resume",
  "description": "Pauses / resumes JavaScript execution",
  "version": "0.7",
  "permissions": [
    "debugger"
  ],
  "background": {
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_icon": "debuggerPause.png",
    "default_title": "Pause JavaScript"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/default_command_override/manifest.json

{
  "name": "Tab Flipper",
  "description": "Press Ctrl+Shift+Right or Ctrl+Shift+Left (Command+Shift+Right or Command+Shift+Left on a Mac) to flip through window tabs",
  "version": "1.0",
  "manifest_version": 2,
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_icon": "images/tabFlipper16.png",
    "default_title": "Press Ctrl(Win)/Command(Mac)+Shift+ Left or Right to Flip Tabs"
  },
  "commands": {
    "flip-tabs-forward": {
      "suggested_key": {
        "default": "Ctrl+Shift+Right",
        "mac": "Command+Shift+Right"
      },
      "description": "Flip tabs forward"
    },
    "flip-tabs-backwards": {
      "suggested_key": {
        "default": "Ctrl+Shift+Left",
        "mac": "Command+Shift+Left"
      },
      "description": "Flip tabs backwards"
    }
  },
  "icons": {
    "16": "images/tabFlipper16.png",
    "32": "images/tabFlipper32.png",
    "48": "images/tabFlipper48.png",
    "128": "images/tabFlipper128.png"
  }
}

---

## File: _archive/mv2/api/desktopCapture/manifest.json

{
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjd3VZe2un2t/ju5HGcZrbD862LLhtukwtXeySPzbQaq9zEyFzr+pVd1EeAW7ZPUA86K9/mpWiDycoSMMj9hpm+QQqBnQDrPPtBJfogkFvWsgDQaw6SXZmErTlzz1wukn/0YLQrPLJ7JPj3zGzWcoVj9AhOjQeDpq2E9P3lz85mHwG0RrxgpknP1wGNNkXl/y4WDaWHZyoX1zgcn2r3bzTdb77RWiA9pduXSn6d14GA9B9CdQA4bTDmc9HY1WaVGK0oDX2A2eJEllHqdeBJmpqPqds4cIhm0Gq6lKvxB61I2UZlbCaSIMfTTxBnt+r7NPgpxHBKJIF1xOCpuGtWuc0wIDAQAB",
  "name": "Desktop Capture Example",
  "description": "Show desktop media picker UI",
  "version": "1",
  "manifest_version": 3,
  "icons": {
    "16": "icon.png",
    "128": "icon.png"
  },
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [
    "desktopCapture"
  ]
}

---

## File: _archive/mv2/api/deviceInfo/basic/manifest.json

{
  "name": "My Devices",
  "version": "1.1",
  "description": "A browser action with a popup dump of all devices signed into the same account as the current profile.",
  "permissions": [
     "signedInDevices"
  ],
  "browser_action": {
      "default_title": "My Devices",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "manifest_version": 2,
  "content_security_policy": "script-src 'self' https://ajax.googleapis.com; object-src 'self'"
}

---

## File: _archive/mv2/api/devtools/network/chrome-firephp/manifest.json

{
  "name": "FirePHP for Chrome",
  "version": "1.1",
  "minimum_chrome_version": "10.0",
  "description": "Extends the Developer Tools, adding support for parsing FirePHP messages from server",
  "devtools_page": "devtools.html",
  "background": { "scripts": ["background.js"] },
  "permissions": [
    "http://*/*",
    "https://*/*"
  ],
  "manifest_version": 2
}

---

## File: _archive/mv2/api/devtools/panels/chrome-query/manifest.json

{
  "name": "Chrome Query",
  "version": "1.1",
  "description": "Extends the Developer Tools, adding a sidebar that displays the jQuery data associated with the selected DOM element.",
  "devtools_page": "devtools.html",
  "manifest_version": 2
}

---

## File: _archive/mv2/api/displaySource/tabCast/manifest.json

{
  "name": "tabCast",
  "version": "0.1",
  "manifest_version": 2,
  "description": "Creates a WiFi Display Session from the captured tab media stream using chrome.displaySource API.",
  "permissions": [
    "tabCapture", "tabs", "displaySource"
  ],
  "browser_action": {
      "default_title": "Tab cast",
      "default_popup": "main.html"
  },
  "background": {
      "scripts": ["background.js"],
      "persistent": false
  }
}

---

## File: _archive/mv2/api/document_scan/README.md

# Document Scanning API Sample

This demo interfaces with the Chrome document scanning API to acquire scanned
images.

## APIs

* [Document scanning API](https://developer.chrome.com/apps/documentScan)
* [Runtime](https://developer.chrome.com/apps/runtime)
* [Window](https://developer.chrome.com/apps/app_window)

---

## File: _archive/mv2/api/document_scan/manifest.json

{
  "name": "Document Scanning API Sample",
  "version": "0.1",
  "manifest_version": 2,
  "minimum_chrome_version": "37",
  "app": {
    "background": {
      "scripts": ["background.js"]
    }
  },
  "permissions": [],
  "optional_permissions": [ "documentScan" ]
}

---

## File: _archive/mv2/api/downloads/download_filename_controller/manifest.json

{"name": "Download Filename Controller",
 "description": "Download Filename Controller",
 "version": "0.1",
 "background": {"scripts": ["bg.js"], "persistent": false},
 "options_page": "options.html",
 "permissions": ["downloads"],
 "content_security_policy": "script-src 'self'; default-src 'self'",
 "manifest_version": 2}

---

## File: _archive/mv2/api/downloads/download_links/manifest.json

{
  "name": "Download Selected Links",
  "description": "Select links on a page and download them.",
  "version": "0.1",
  "minimum_chrome_version": "16.0.884",
  "permissions": ["downloads", "<all_urls>"],
  "browser_action": {"default_popup": "popup.html"},
  "manifest_version": 2
}

---

## File: _archive/mv2/api/downloads/download_manager/manifest.json

{"name": "__MSG_extName__",
 "version": "0.3",
 "manifest_version": 2,
 "description": "__MSG_extDesc__",
 "icons": {"128": "icon128.png"},
 "browser_action": {
   "default_icon": {
     "19": "icon19.png",
     "38": "icon38.png"},
   "default_title": "__MSG_extName__",
   "default_popup": "popup.html"},
 "background": {"persistent": false, "scripts": ["background.js"]},
 "default_locale": "en",
 "optional_permissions": ["management"],
 "permissions": ["downloads", "downloads.open", "downloads.shelf"]}

---

## File: _archive/mv2/api/downloads/download_manager/_locales/en/messages.json

{"extName": {
   "message": "Download Manager Button",
   "description": "Extension name"},
 "extDesc": {
   "message": "Browser Action Download Manager User Interface for Google Chrome",
   "description": "Extension description"},
 "badChromeVersion": {
   "message": "The downloads API is only available on the canary, dev, and beta channels.",
   "description": ""},
 "tabTitle": {
   "message": "Downloads",
   "description": "tab title"},
 "searchPlaceholder": {
   "message": "Search Downloads",
   "description": ""},
 "clearAllTitle": {
   "message": "Erase All Visible Downloads",
   "description": ""},
 "openDownloadsFolderTitle": {
   "message": "Open Downloads Folder",
   "description": ""},
 "zeroItems": {
   "message": "There are zero download items.",
   "description": ""},
 "searching": {
   "message": "Teleporting lots of goats...",
   "description": ""},
 "zeroSearchResults": {
   "message": "Zero matches",
   "description": ""},
 "managementPermissionInfo": {
   "message": "Some files were downloaded by an extension.",
   "description": ""},
 "grantManagementPermission": {
   "message": "Show links to extensions that download files.",
   "description": ""},
 "showOlderDownloads": {
   "message": "Show Older Downloads",
   "description": ""},
 "loadingOlderDownloads": {
   "message": "Loading Older Downloads...",
   "description": ""},
 "openTitle": {
   "message": "Open",
   "description": ""},
 "pauseTitle": {
   "message": "Pause",
   "description": ""},
 "resumeTitle": {
   "message": "Resume",
   "description": ""},
 "cancelTitle": {
   "message": "Cancel",
   "description": ""},
 "removeFileTitle": {
   "message": "Remove file",
   "description": ""},
 "eraseTitle": {
   "message": "Erase",
   "description": ""},
 "retryTitle": {
   "message": "Retry",
   "description": ""},
 "referrerTitle": {
   "message": "Referrer",
   "description": ""},
 "month0abbr": {"message": "Jan","description": ""},
 "month1abbr": {"message": "Feb","description": ""},
 "month2abbr": {"message": "Mar","description": ""},
 "month3abbr": {"message": "Apr","description": ""},
 "month4abbr": {"message": "May","description": ""},
 "month5abbr": {"message": "Jun","description": ""},
 "month6abbr": {"message": "Jul","description": ""},
 "month7abbr": {"message": "Aug","description": ""},
 "month8abbr": {"message": "Sep","description": ""},
 "month9abbr": {"message": "Oct","description": ""},
 "month10abbr": {"message": "Nov","description": ""},
 "month11abbr": {"message": "Dec","description": ""},
 "openWhenCompleteFinishing": {
   "message": "Opening in just a moment",
   "description": ""},
 "timeLeftFinishing": {
   "message": "finishing...",
   "description": ""},
 "openWhenCompleteDays": {
   "message": "Opening in $days$d $hours$h",
   "description": "",
   "placeholders": {
     "days": {
       "content": "$1",
       "example": "2"},
     "hours": {
       "content": "$2",
       "example": "23"}}},
 "timeLeftDays": {
   "message": "$days$d $hours$h left",
   "description": "",
   "placeholders": {
     "days": {
       "content": "$1",
       "example": "2"},
     "hours": {
       "content": "$2",
       "example": "23"}}},
 "openWhenCompleteHours": {
   "message": "Opening in $hours$h $mins$m",
   "description": "",
   "placeholders": {
     "hours": {
       "content": "$1",
       "example": "23"},
     "mins": {
       "content": "$2",
       "example": "59"}}},
 "timeLeftHours": {
   "message": "$hours$h $mins$m left",
   "description": "",
   "placeholders": {
     "hours": {
       "content": "$1",
       "example": "23"},
     "mins": {
       "content": "$2",
       "example": "59"}}},
 "openWhenCompleteMinutes": {
   "message": "Opening in $mins$m $sec$s",
   "description": "",
   "placeholders": {
     "mins": {
       "content": "$1",
       "example": "59"},
     "sec": {
       "content": "$2",
       "example": "59"}}},
 "timeLeftMinutes": {
   "message": "$mins$m $sec$s left",
   "description": "",
   "placeholders": {
     "mins": {
       "content": "$1",
       "example": "59"},
     "sec": {
       "content": "$2",
       "example": "59"}}},
 "openWhenCompleteSeconds": {
   "message": "Opening in $sec$s",
   "description": "",
   "placeholders": {
     "sec": {
       "content": "$1",
       "example": "59"}}},
 "timeLeftSeconds": {
   "message": "$sec$s left",
   "description": "",
   "placeholders": {
     "sec": {
       "content": "$1",
       "example": "59"}}},
 "error_FILE_FAILED": {
   "message": "File Failed",
   "description": ""},
 "error_FILE_ACCESS_DENIED": {
   "message": "File-System Access Denied",
   "description": ""},
 "error_FILE_NO_SPACE": {
   "message": "No Space On Disk",
   "description": ""},
 "error_FILE_NAME_TOO_LONG": {
   "message": "Filename Too Long",
   "description": ""},
 "error_FILE_TOO_LARGE": {
   "message": "File Too Large",
   "description": ""},
 "error_FILE_VIRUS_INFECTED": {
   "message": "Virus Infected",
   "description": ""},
 "error_FILE_TRANSIENT_ERROR": {
   "message": "Transient File-System Error",
   "description": ""},
 "error_FILE_BLOCKED": {
   "message": "File Blocked",
   "description": ""},
 "error_FILE_SECURITY_CHECK_FAILED": {
   "message": "Security Check Failed",
   "description": ""},
 "error_FILE_TOO_SHORT": {
   "message": "File Too Short",
   "description": ""},
 "error_NETWORK_FAILED": {
   "message": "Network Failure",
   "description": ""},
 "error_NETWORK_TIMEOUT": {
   "message": "Network Timeout",
   "description": ""},
 "error_NETWORK_DISCONNECTED": {
   "message": "Network Disconnected",
   "description": ""},
 "error_NETWORK_SERVER_DOWN": {
   "message": "Server Down",
   "description": ""},
 "error_SERVER_FAILED": {
   "message": "Server Failure",
   "description": ""},
 "error_SERVER_NO_RANGE": {
   "message": "Server No Range",
   "description": ""},
 "error_SERVER_PRECONDITION": {
   "message": "Server Precondition Failure",
   "description": ""},
 "error_SERVER_BAD_CONTENT": {
   "message": "Bad Content",
   "description": ""},
 "error_USER_CANCELED": {
   "message": "Cancelled",
   "description": ""},
 "error_USER_SHUTDOWN": {
   "message": "Cancelled",
   "description": ""},
 "error_CRASH": {
   "message": "Crash",
   "description": ""},
 "error_1": {
   "message": "File Failed",
   "description": ""},
 "error_2": {
   "message": "File-System Access Denied",
   "description": ""},
 "error_3": {
   "message": "No Space On Disk",
   "description": ""},
 "error_5": {
   "message": "Filename Too Long",
   "description": ""},
 "error_6": {
   "message": "File Too Large",
   "description": ""},
 "error_7": {
   "message": "Virus Infected",
   "description": ""},
 "error_10": {
   "message": "Transient File-System Error",
   "description": ""},
 "error_11": {
   "message": "File Blocked",
   "description": ""},
 "error_12": {
   "message": "Security Check Failed",
   "description": ""},
 "error_13": {
   "message": "File Too Short",
   "description": ""},
 "error_20": {
   "message": "Network Failure",
   "description": ""},
 "error_21": {
   "message": "Network Timeout",
   "description": ""},
 "error_22": {
   "message": "Network Disconnected",
   "description": ""},
 "error_23": {
   "message": "Server Down",
   "description": ""},
 "error_30": {
   "message": "Server Failure",
   "description": ""},
 "error_31": {
   "message": "Server No Range",
   "description": ""},
 "error_32": {
   "message": "Server Precondition Failure",
   "description": ""},
 "error_33": {
   "message": "Bad Content",
   "description": ""},
 "error_40": {
   "message": "Cancelled",
   "description": ""},
 "error_41": {
   "message": "Cancelled",
   "description": ""},
 "error_50": {
   "message": "Crash",
   "description": ""},
 "errorRemoved": {
   "message": "Removed",
   "description": ""},
 "showInFolderTitle": {
   "message": "Show in Folder",
   "description": "Alt text for show in folder icon"}}

---

## File: _archive/mv2/api/downloads/download_open/manifest.json

{"name": "__MSG_extName__",
 "version": "0.1",
 "manifest_version": 2,
 "description": "__MSG_extDesc__",
 "icons": {"16": "icon16.png", "128": "icon128.png"},
 "background": {"persistent": false, "scripts": ["background.js"]},
 "default_locale": "en",
 "permissions": ["contextMenus", "downloads", "downloads.open"]}

---

## File: _archive/mv2/api/downloads/download_open/_locales/en/messages.json

{"extName": {
   "message": "Download and Open Button",
   "description": "Extension name"},
 "extDesc": {
   "message": "Download and Open Context Menu Button",
   "description": "Extension description"},
 "openContextMenuTitle": {
   "message": "Download and Open",
   "description": "context menu button text"}}

---

## File: _archive/mv2/api/downloads/downloads_overwrite/manifest.json

{
  "name": "Downloads Overwrite Existing Files",
  "description": "All downloads overwrite existing files instead of adding ' (1)', ' (2)', etc.",
  "version": "1",
  "minimum_chrome_version": "26.0.1428",
  "background": {
    "scripts": ["bg.js"],
    "persistent": false
  },
  "permissions": [
    "downloads"
  ],
  "manifest_version": 2
}

---

## File: _archive/mv2/api/eventPage/basic/manifest.json

{
  "name": "Event Page Example",
  "description": "Demonstrates usage and features of the event page",
  "version": "1.0",
  "manifest_version": 2,
  "permissions": ["alarms", "tabs", "bookmarks", "declarativeWebRequest", "*://*/*"],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_icon" : "icon.png",
    "default_title": "Start Event Page"
  },
  "commands": {
    "open-google": {
      "description": "Open a tab to google.com",
      "suggested_key": { "default": "Ctrl+Shift+L" }
    },
    "_execute_browser_action": {
      "suggested_key": { "default": "Ctrl+Shift+K" }
    }
  }
}

---

## File: _archive/mv2/api/extension/isAllowedAccess/manifest.json

{
  "name" : "`extension.isAllowedFileSchemeAccess` and `extension.isAllowedIncognitoAccess` Example",
  "version" : "1.0.0",
  "description" : "Demonstrates the `extension.isAllowedFileSchemeAccess` and `extesion.isAllowedIncognitoAccess` APIs",
  "permissions" : [ "file://*" ],
  "browser_action" : {
    "default_popup": "popup.html",
    "default_icon" : "sample-19.png"
  },
  "icons" : {
    "16" : "sample-16.png",
    "48" : "sample-48.png",
    "128" : "sample-128.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/fileSystemProvider/archive/manifest.json

{
  "name": "Fake Archive Handler App",
  "version": "0.1",
  "manifest_version": 2,
  "description": "Demonstrate File System Provider API usage for apps.",
  "permissions": [
    "fileSystemProvider",
    {"fileSystem": ["retainEntries"]},
    "storage"
  ],
  "file_handlers": {
    "fake": {
      "types": ["application/fake"],
      "extensions": ["fake"]
    }
  },
  "file_system_provider_capabilities": {
    "multiple_mounts": true,
    "source": "file"
  },
  "app": {
    "background": {
      "scripts": [
        "background.js"
      ]
    }
  }
}

---

## File: _archive/mv2/api/fileSystemProvider/basic/manifest.json

{
  "name": "File System Provider API Extension Example",
  "version": "0.1",
  "manifest_version": 2,
  "description":
      "Demonstrate features of the API like mounting, listing directories, etc for extensions.",
  "permissions": [
    "fileSystemProvider"
  ],
  "file_system_provider_capabilities": {
    "source": "network"
  },
  "background": {
    "scripts": [
      "background.js"
    ]
  }
}

---

## File: _archive/mv2/api/fontSettings/manifest.json

{
  "name": "Advanced Font Settings",
  "version": "0.67",
  "manifest_version": 2,
  "description": "Customize per-script font settings.",
  "options_page": "options.html",
  "icons": {
    "16": "fonts16.png",
    "128": "fonts128.png"
  },
  "permissions": ["fontSettings"]
}

---

## File: _archive/mv2/api/history/historyOverride/manifest.json

{
  "manifest_version": 2,
  "name": "History Override",
  "description": "Overrides the History Page",
  "version": "1.0",
  "chrome_url_overrides" : {
    "history": "history.html"
  },
  "browser_action": {
    "default_title": "History"
  },
  "permissions": [
    "history",
    "chrome://favicon/"
  ],
  "icons": {
    "16": "history16.png",
    "32": "history32.png",
    "48": "history48.png",
    "128": "history128.png"
  }
}

---

## File: _archive/mv2/api/history/showHistory/manifest.json

{
  "name": "Typed URL History",
  "version": "1.2",
  "description": "Reads your history, and shows the top ten pages you go to by typing the URL.",
  "permissions": [
    "history"
  ],
  "browser_action": {
    "default_popup": "typedUrls.html",
    "default_icon": "clock.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/i18n/cld/manifest.json

{
  "name": "CLD",
  "description": "Displays the language of a tab",
  "version": "0.3",
  "background": {
    "scripts": ["background.js"]
  },
  "browser_action": {
      "default_name": "Page Language"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/i18n/detectLanguage/manifest.json

{
  "name": "Detect Language",
  "description": "Detects up to 3 languages and their percentages of the provided string",
  "version": "1.0",

  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },

  "manifest_version": 2
}

---

## File: _archive/mv2/api/i18n/getMessage/manifest.json

{
  "name": "__MSG_chrome_extension_name__",
  "description": "__MSG_chrome_extension_description__",
  "version": "0.2",
  "default_locale": "en_US",
  "browser_action": {
      "default_title": "__MSG_browser_action_title__",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/i18n/getMessage/_locales/en_US/messages.json

{
  "chrome_extension_name": {
    "message": "AcceptLanguage"
  },
  "chrome_extension_description": {
    "message": "Returns accept languages of the browser"
  },
  "click_here": {
    "message": "Left click to list acceptLanguages."
  },
  "browser_action_title": {
    "message": "Click Me"
  },
  "chrome_accept_languages": {
    "message": "$CHROME$ accepts $languages$ languages",
    "placeholders": {
      "chrome": {
        "content": "Chrome",
        "example": "Chrome"
      },
      "languages": {
        "content": "$1",
        "example": "en-US,sr,de"
      }
    }
  }
}

---

## File: _archive/mv2/api/i18n/getMessage/_locales/es/messages.json

{
  "chrome_extension_name": {
    "message": "AcceptLanguage"
  },
  "chrome_extension_description": {
    "message": "Devuelve los idiomas aceptados por el navegador"
  },
  "click_here": {
    "message": "Click con botón izquierdo para mostrar la lista de acceptLanguages."
  },
  "browser_action_title": {
    "message": "Haz click aquí"
  },
  "chrome_accept_languages": {
    "message": "$CHROME$ acepta los idiomas $languages$",
    "placeholders": {
      "chrome": {
        "content": "Chrome",
        "example": "Chrome"
      },
      "languages": {
        "content": "$1",
        "example": "en-US,sr,de"
      }
    }
  }
}

---

## File: _archive/mv2/api/i18n/getMessage/_locales/sr/messages.json

{
  "chrome_extension_name": {
    "message": "Прихватљиви језици"
  },
  "chrome_extension_description": {
    "message": "Језици које прегледач прихвата"
  },
  "click_here": {
    "message": "Кликните да излистате дозвољене језике."
  },
  "chrome_accept_languages": {
    "message": "$CHROME$ прихвата $languages$ језике.",
    "placeholders": {
      "chrome": {
        "content": "Chrome",
        "example": "Chrome"
      },
      "languages": {
        "content": "$1",
        "example": "en-US,sr,de"
      }
    }
  }
}

---

## File: _archive/mv2/api/i18n/localizedHostedApp/manifest.json

{
  "name": "__MSG_application_title__",
  "description": "__MSG_application_description__",
  "version": "0.2",
  "default_locale": "en",
  "app": {
    "launch": {
      "web_url": "http://example.com/"
    }
  },
  "icons": {
    "128": "icon128.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/i18n/localizedHostedApp/_locales/de/messages.json

{
  "application_title": {
    "message": "Eine lokalisierte gehostete Beispielanwendung"
  },
  "application_description": {
    "message": "Hier steht eine Beschreibung der Applikation, die im Web Store auftauchen wird."
  }
}

---

## File: _archive/mv2/api/i18n/localizedHostedApp/_locales/en/messages.json

{
  "application_title": {
    "message": "Minimal Localized Hosted App",
    "description": "The title of the application, displayed in the web store."
  },
  "application_description": {
    "message": "This is the minimal set of data required to upload a localized hosted application to the web store.",
    "description": "The description of the application, displayed in the web store."
  }
}

---

## File: _archive/mv2/api/idle/idle_simple/manifest.json

{
  "name" : "Idle - Simple Example",
  "version" : "1.0.1",
  "description" : "Demonstrates the Idle API",
  "background" : {
    "scripts": ["background.js"]
  },
  "permissions" : [ "idle" ],
  "browser_action" : {
    "default_icon" : "sample-19.png"
  },
  "icons" : {
    "16" : "sample-16.png",
    "48" : "sample-48.png",
    "128" : "sample-128.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/input.ime/basic/manifest.json

{
  "name": "Test IME",
  "version": "1.0",
  "manifest_version": 2,
  "description": "A simple IME that converts all keystrokes to upper case.",
  "background":  {
    "scripts": ["main.js"]
  },
  "permissions": [
    "input"
  ],
  "input_components": [
    {
      "name": "Test IME",
      "type": "ime",
      "id": "test",
      "description": "Test IME",  // A user visible description
      "language": "en-US",  // The primary language this IME is used for
      "layouts": ["us::eng"]  // The supported keyboard layouts for this IME
    }
  ]
}

---

## File: _archive/mv2/api/messaging/timer/manifest.json

{
  "name": "Message Timer",
  "version": "1.3",
  "description": "Times how long it takes to send a message to a content script and back.",
  "content_scripts": [
    {
      "matches": ["http://*/*", "https://*/*"],
      "js": ["page.js"]
    }
  ],
  "browser_action": {
    "default_title": "Time to current page",
    "default_icon": "clock.png",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/nativeMessaging/README.md

This directory contains an example of chrome application that uses native
messaging API that allows to communicate with a native application.

In order for this example to work you must first install the native messaging
host from the host directory.

## To install the host:


**On Windows:**

  Run install_host.bat script in the host directory.
  This script installs the native messaging host for the current user, by
  creating a registry key
  HKEY_CURRENT_USER\SOFTWARE\Google\Chrome\NativeMessagingHosts\com.google.chrome.example.echo
  and setting its default value to the full path to
  host\com.google.chrome.example.echo-win.json .
  If you want to install the native messaging host for all users, change HKCU to
  HKLM.
  Note that you need to have python installed.

**On Mac and Linux:**

  Run install_host.sh script in the host directory:
    host/install_host.sh
  By default the host is installed only for the user who runs the script, but if
  you run it with admin privileges (i.e. 'sudo host/install_host.sh'), then the
  host will be installed for all users. You can later use host/uninstall_host.sh
  to uninstall the host.

---

## File: _archive/mv2/api/nativeMessaging/app/manifest.json

{
  // Extension ID: knldjmfmopnpolahpmmgbagdohdnhkik
  "key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDcBHwzDvyBQ6bDppkIs9MP4ksKqCMyXQ/A52JivHZKh4YO/9vJsT3oaYhSpDCE9RPocOEQvwsHsFReW2nUEc6OLLyoCFFxIb7KkLGsmfakkut/fFdNJYh0xOTbSN8YvLWcqph09XAY2Y/f0AL7vfO1cuCqtkMt8hFrBGWxDdf9CQIDAQAB",
  "name": "Native Messaging Example",
  "version": "1.0",
  "manifest_version": 2,
  "description": "Send a message to a native application.",
  "app": {
    "launch": {
      "local_path": "main.html"
    }
  },
  "icons": {
    "128": "icon-128.png"
  },
  "permissions": [
    "nativeMessaging"
  ]
}

---

## File: _archive/mv2/api/nativeMessaging/host/com.google.chrome.example.echo-win.json

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

{
  "name": "com.google.chrome.example.echo",
  "description": "Chrome Native Messaging API Example Host",
  "path": "native-messaging-example-host.bat",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
  ]
}

---

## File: _archive/mv2/api/nativeMessaging/host/com.google.chrome.example.echo.json

// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

{
  "name": "com.google.chrome.example.echo",
  "description": "Chrome Native Messaging API Example Host",
  "path": "HOST_PATH",
  "type": "stdio",
  "allowed_origins": [
    "chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"
  ]
}

---

## File: _archive/mv2/api/notifications/manifest.json

{
  "name": "Notification Demo",
  "version": "1.1",
  "description":
    "Shows off desktop notifications, which are \"toast\" windows that pop up on the desktop.",
  "icons": {"16": "16.png", "48": "48.png", "128": "128.png"},
  "permissions": [
    "notifications"
  ],
  "options_page": "options.html",
  "background": { "scripts": ["background.js"] },
  "manifest_version": 2,

  // crbug.com/134315
  "web_accessible_resources": [
    "48.png"
  ]
}

---

## File: _archive/mv2/api/omnibox/newtab_search/manifest.json

{
  "name": "Omnibox New Tab Search",
  "description": "Type 'nt' plus a search term into the Omnibox to open search in new tab.",
  "version": "1.0",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "omnibox": { "keyword" : "nt" },
  "manifest_version": 2,
  "browser_action": {
    "default_icon": {
      "16": "newtab_search16.png",
      "32": "newtab_search32.png"
      }
  },
  "icons": {
    "16": "newtab_search16.png",
    "32": "newtab_search32.png",
    "48": "newtab_search48.png",
    "128": "newtab_search128.png"
  }
}

---

## File: _archive/mv2/api/omnibox/simple-example/manifest.json

{
  "name": "Omnibox Example",
  "description" : "To use, type 'omnix' plus a search term into the Omnibox.",
  "version": "1.1",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "omnibox": { "keyword" : "omnix" },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/override/blank_ntp/manifest.json

{
  "name": "Blank new tab page",
  "description": "Override the new tab page with a blank one",
  "version": "0.2",
  "incognito": "split",
  "chrome_url_overrides": {
    "newtab": "blank.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/override/override_igoogle/manifest.json

{
  "name": "iGoogle new tab page",
  "description": "Override the new tab page with iGoogle",
  "version": "0.2",
  "chrome_url_overrides": {
    "newtab": "redirect.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/pageAction/pageaction_by_content/manifest.json

{
  "name" : "Page action by content",
  "version" : "1.1",
  "description" : "Shows a page action for HTML pages containing a video",
  "background" : {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action" :
  {
    "default_icon" : "video-19.png",
    "default_title" : "There's a <video> in this page!"
  },
  "permissions": [ "declarativeContent" ],
  "icons" : {
    "48" : "video-48.png",
    "128" : "video-128.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/pageAction/pageaction_by_url/manifest.json

{
  "name": "Page action by URL",
  "version": "1.0",
  "description": "Shows a page action for urls which have the letter 'g' in them.",
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "page_action" :
  {
    "default_icon" : "icon-19.png",
    "default_title" : "There's a 'G' in this URL!"
  },
  "permissions" : [
    "declarativeContent"
  ],
  "icons" : {
    "48" : "icon-48.png",
    "128" : "icon-128.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/pageAction/set_icon/manifest.json

{
  "name": "Animated Page Action",
  "description": "This extension adds an animated browser action to the toolbar.",
  "version": "1.2",
  "background": {
    "page": "background.html"
  },
  "page_action": {
    "default_title": "First icon"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/permissions/extension-questions/manifest.json

{
  "name": "Top Chrome Extension Questions",
  "version": "0.3",
  "description": "Sample demonstration of the optional permissions API.",
  "icons": {
    "128": "images/icon.png",
    "48": "images/icon.png",
    "16": "images/icon.png"
  },
  "browser_action": {
    "default_icon": "images/icon.png",
    "default_popup": "popup.html"
  },
  "options_page": "options.html",
  "optional_permissions": ["http://api.stackoverflow.com/"],
  "manifest_version": 2
}

---

## File: _archive/mv2/api/power/manifest.json

{
  "manifest_version": 2,

  "name": "__MSG_extensionName__",
  "description": "__MSG_extensionDescription__",
  "version": "1.9",
  "icons": {
    "16": "images/icon-16.png",
    "48": "images/icon-48.png",
    "128": "images/icon-128.png"
  },

  "permissions": [
    "power",
    "storage"
  ],
  "browser_action": {
    "default_title": "__MSG_disabledTitle__",
    "default_icon": {
      "19": "images/night-19.png",
      "38": "images/night-38.png"
    }
  },
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },

  "default_locale": "en"
}

---

## File: _archive/mv2/api/power/_locales/en/messages.json

{
  "extensionName": {
    "message": "Keep Awake",
    "description": "Extension name."
  },
  "extensionDescription": {
    "message": "Override system power-saving settings.",
    "description": "Extension description."
  },
  "disabledTitle": {
    "message": "Default power-saving settings",
    "description": "Browser action title when disabled."
  },
  "displayTitle": {
    "message": "Screen will be kept on",
    "description": "Browser action title when preventing screen-off."
  },
  "systemTitle": {
    "message": "System will stay awake",
    "description": "Browser action title when preventing system sleep."
  }
}

---

## File: _archive/mv2/api/preferences/allowThirdPartyCookies/manifest.json

{
  "name" : "Block/allow third-party cookies API example extension",
  "version" : "0.1",
  "description" : "Sample extension which demonstrates how to access a preference.",
  "permissions": [ "privacy" ],
  "browser_action": {
     "default_icon": "advicedog.jpg",
     "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/preferences/enableReferrer/manifest.json

{
  "name" : "Block/allow referrer API example extension",
  "version" : "0.1",
  "description" : "Sample extension which demonstrates how to access a preference.",
  "permissions": [ "privacy" ],
  "browser_action": {
     "default_icon": "advicedog.jpg",
     "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/printing/manifest.json

{
  "name": "Print Extension",
  "version": "1.0",
  "description": "Sends print job directly to the printers installed on the Chromebook",
  "permissions": [
    "printing"
  ],
  "browser_action": {
    "default_popup": "printers.html",
    "default_icon": "icons/icon.png"
  },
  "icons": {
    "16": "icons/icon16.png",
    "48": "icons/icon48.png",
    "128": "icons/icon128.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/printingMetrics/manifest.json

{
  "name": "Print Job History",
  "version": "1.0",
  "description": "Reads your print history and displays the recent print jobs.",
  "permissions": [
    "printingMetrics",
    "storage"
  ],
  "browser_action": {
    "default_popup": "print_jobs.html",
    "default_icon": "print.png"
  },
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": false
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/processes/process_monitor/manifest.json

{
  "name": "Process Monitor",
  "version": "1.2",
  "description": "Adds a browser action that monitors resource usage of all browser processes.",
  "permissions": [
    "processes"
  ],
  "browser_action": {
      "default_title": "Process Monitor",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/processes/show_tabs/manifest.json

{
  "name": "Show Tabs in Process",
  "version": "1.0",
  "description": "Adds a browser action showing which tabs share the current tab's process.",
  "permissions": [
    "processes", "tabs", "chrome://favicon/*"
  ],
  "browser_action": {
      "default_title": "Show Tabs in this Process",
      "default_icon": "icon.png",
      "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/storage/stylizr/manifest.json

{
  "name": "Stylizr",
  "description": "Spruce up your pages with custom CSS.",
  "version": "1.0",

  "permissions": [
    "activeTab",
    "storage"
  ],

  "options_page": "options.html",

  "browser_action": {
    "default_icon": "icon.png",
    "default_title": "Stylize!",
    "default_popup": "popup.html"
  },

  "manifest_version": 2
}

---

## File: _archive/mv2/api/tabCapture/manifest.json

{
  "name": "Tab Capture Example",
  "description": "Capture a tab and play in a <video> element in a separate tab.",
  "version": "1",
  "manifest_version": 2,
  "background": {
    "scripts": ["eventPage.js"],
    "persistent": false
  },
  "browser_action": {
    "default_icon": "icon.png"
  },
  "options_ui": {
    "page": "options.html",
    "open_in_tab": false
  },
  "permissions": [
    "storage",
    "tabs",
    "tabCapture"
  ]
}

---

## File: _archive/mv2/api/tabs/inspector/manifest.json

{
  "name": "Tab Inspector",
  "description": "Utility for working with the extension tabs api",
  "version": "0.3",
  "permissions": ["tabs"],
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_title": "show tab inspector"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/tabs/pin/manifest.json

{
  "name": "Keyboard Pin",
  "version": "0.3",
  "description": "Creates a keyboard shortcut (Alt + Shift + P) to toggle the pinned state of the currently selected tab",
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "commands": {
    "toggle-pin": {
      "suggested_key": { "default": "Alt+Shift+P" },
      "description": "Toggle tab pin"
    }
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/tabs/screenshot/manifest.json

{
  "name": "Test Screenshot Extension",
  "version": "1.3",
  "description": "Demonstrate screenshot functionality in the chrome.tabs api.",
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_icon": "camera.png",
    "default_title": "Take a screen shot!"
  },
  "permissions": [
    "activeTab"
  ],
  "manifest_version": 2
}

---

## File: _archive/mv2/api/tabs/zoom/manifest.json

{
  "manifest_version": 2,

  "name": "Tabs Zoom API Demo",
  "description": "This extension allows the user to explore features of the new tabs zoom api.",

  "version": "0.1",

  "icons": {
    "16": "zoom16.png",
    "48": "zoom48.png"
  },

  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },

  "browser_action": {
    "default_icon": "zoom19.png",
    "default_title": "Zoom Extension Demo",
    "default_popup": "popup.html"
  }
}

---

## File: _archive/mv2/api/topsites/basic/manifest.json

{
  "name": "Top Sites",
  "version": "1.2",
  "description": "Shows the top sites in a browser action",
  "permissions": ["topSites"],
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/api/topsites/magic8ball/manifest.json

{
  "name": "NTP prototyping extension",
  "version": "1.1",
  "description": "extension to prototype new NTP designs",
  "chrome_url_overrides" : {
    "newtab": "newTab.html"
  },
  "permissions": [
    "topSites",
    "chrome://favicon/"
  ],
  "manifest_version": 2
}

---

## File: _archive/mv2/api/ttsEngine/console_tts_engine/manifest.json

{
  "name": "Console TTS Engine",
  "manifest_version": 2,
  "version": "2.1",
  "description": "A \"silent\" TTS engine that prints text to a small window rather than synthesizing speech.",
  "permissions": ["ttsEngine", "tabs"],
  "background": {
    "persistent": false,
    "scripts": ["console_tts_engine.js"]
  },
  "tts_engine": {
    "voices": [
      {
        "voice_name": "Console",
        "event_types": ["start", "word", "sentence", "end"]
      }
    ]
  }
}

---

## File: _archive/mv2/api/water_alarm_notification/manifest.json

{
  "name": "Drink Water Event Popup",
  "description": "Demonstrates usage and features of the event page by reminding user to drink water",
  "version": "1.0",
  "manifest_version": 2,
  "permissions": ["alarms", "notifications", "storage"],
  "background": {
    "scripts": ["background.js"],
    "persistent": false
  },
  "browser_action": {
    "default_title": "Drink Water Event",
    "default_popup": "popup.html"
  },
  "icons": {
    "16": "drink_water16.png",
    "32": "drink_water32.png",
    "48": "drink_water48.png",
    "128": "drink_water128.png"
  }
}

---

## File: _archive/mv2/api/webNavigation/basic/manifest.json

{
  "name":           "__MSG_extName__",
  "version":        "0.2",
  "description":    "__MSG_extDescription__",
  "default_locale": "en",
  "background": {
    "persistent": false,
    "scripts": ["navigation_collector.js", "background.js"]
  },
  "browser_action": {
    "default_icon": "icon.png",
    "default_popup": "popup.html"
  },
  "permissions":    [
    "webNavigation", "storage"
  ],
  "manifest_version": 2
}

---

## File: _archive/mv2/api/webNavigation/basic/_locales/en/messages.json

{
  "extName":  {
    "message": "WebNavigation Tech Demo",
    "description": "The extension name."
  },
  "extDescription": {
    "message": "Demonstration of the WebNavigation extension API.",
    "description": "The extension description."
  },

  "navigationDescription": {
    "message": ", requested $NUM$ times.  Loaded in an average of $LOAD$ miliseconds.",
    "description": "The message posted in the popup for each stored navigation.",
    "placeholders": {
      "NUM": {
        "content": "$1",
        "example": "4 (The number of times this URL was accessed.)"
      },
      "LOAD": {
        "content": "$2",
        "example": "12.345 (The average load time in miliseconds.)"
      }
    }
  },

  "inHandler": {
    "message": "In webNavigation[`%s`] handler: %o",
    "description": "Notification displayed for each webNavigation event."
  },

  "inHandlerError": {
    "message": "In webNavigation[`%s`] handler: No data!",
    "description": "Notification displayed in a webNavigation event handler without data!"
  },

  "errorCommittedWithoutPending": {
    "message": "Wha?  `onCommitted` for `%s` called, though it's not pending: %o",
    "description": "Error logged when `onCommitted` is triggered on a non-pending request."
  },
  "errorCompletedWithoutPending": {
    "message": "Wha?  `onCompleted` for `%s` called, though it's not pending: %o",
    "description": "Error logged when `onCompleted` is triggered on a non-pending request."
  },
  "errorErrorOccurredWithoutPending": {
    "message": "Wha?  `onErrorOccurred` for `%s` called, though it's not pending: %o",
    "description": "Error logged when `onErrorOccurred` is triggered on a non-pending request."
  },
  "errorCommittedWithoutPending": {
    "message": "Wha?  `onCompleted` for `%s` called, though it's not pending: %o",
    "description": "Error logged when `onCompleted` is triggered on a non-pending request."
  }
}

---

## File: _archive/mv2/api/webview/capturevisibleregion/manifest.json

{
  "manifest_version": 2,
  "name": "Webview transparency",
  "description": "Sample of the webview.captureVisibleRegion api",
  "version": "1",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": [
    "webview"
  ],
  "webview": {
    "partitions": [
      {
        "name": "partition",
        "accessible_resources": [ "test2.html" ]
      }
    ]
  }
}

---

## File: _archive/mv2/api/webview/comm_demo_app/manifest.json

{
  "manifest_version": 2,
  "name": "WebView Extension Communications Demo: App",
  "version": "1",
  "app": {
    "background": {
      "scripts": ["main.js"]
    }
  },
  "permissions": ["webview"],
  "webview": {
    "partitions": [
      {
        "name": "partition",
        "accessible_resources": [""]
      }
    ]
  }
}

---

## File: _archive/mv2/api/webview/comm_demo_ext/manifest.json

{
    "manifest_version": 2,

    "name": "WebView Extension Communications Demo: Extension",
    "description": "Provides content scripts to an app hosting a WebView.",
    "version": "1.0",

    "background": {
      "scripts": ["background.js"]
    },
    "permissions": [
    ]
}

---

## File: _archive/mv2/api/windows/merge_windows/manifest.json

{
  "name": "Merge Windows",
  "version": "1.0.2",
  "description": "Merges all of the browser's windows into the current window",
  "icons": {
    "48": "merge_windows_48.png",
    "128": "merge_windows_128.png"
  },
  "background": {
    "persistent": false,
    "scripts": ["background.js"]
  },
  "browser_action": {
    "default_icon": "arrow_in.png",
    "default_title": "Merge Windows"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/extensions/app_launcher/manifest.json

{
  "name": "App Launcher",
  "description": "Get access to your apps in a browser action",
  "version": "0.7.3",
  "permissions": ["management"],
  "browser_action": {
    "default_icon": "browser_action_icon.png",
    "default_title": "App Launcher",
    "default_popup": "popup.html"
  },
  "icons": {
    "48": "icon.png"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/extensions/buildbot/manifest.json

{
  "name": "Chromium Buildbot Monitor",
  "version": "0.9.0",
  "description": "Displays the status of the Chromium buildbot in the toolbar.  Click to see more detailed status in a popup.",
  "icons": { "128": "icon.png" },
  "background": {
    "scripts": ["utils.js",
                "prefs.js",
                "try_status.js",
                "active_issues.js",
                "bg.js"]
  },
  "permissions": [
    "notifications",
    "storage",
    "http://build.chromium.org/",
    "http://chromium-status.appspot.com/",
    "https://codereview.chromium.org/"
  ],
  "browser_action": {
    "default_title": "",
    "default_icon": "chromium.png",
    "default_popup": "popup.html"
  },
  "options_page": "options.html",
  "options_ui": {
    "chrome_style": true,
    "page": "options.html"
  },
  "manifest_version": 2
}

---

## File: _archive/mv2/extensions/calendar/manifest.json

{
  "name": "__MSG_name__",
  "description": "__MSG_description__",
  "manifest_version": 2,
  "default_locale":"en",
  "options_page": "views/options.html",
  "options_ui": {
    "page": "views/options.html",
    "chrome_style": true
  },
  "version": "2.0.0",
  "background": {
    "scripts": ["javascript/background.js"],
    "persistent": false
  },
  "permissions": [
    "notifications"
  ],
  "browser_action": {
    "default_icon": {
      "19": "images/icon-19.png",
      "38": "images/icon-38.png"
    },
    "default_title": "__MSG_title__"
  },
  "icons": {
    "128": "images/icon-128.png",
    "48": "images/icon-48.png",
    "16":"images/icon-16.png"
  }
}

---

## File: _archive/mv2/extensions/calendar/_locales/ar/messages.json

{"name":{"message":"Google Calendar Checker (\u062a\u062f\u0639\u0645\u0647\u0627 Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"\u064a\u0645\u0643\u0646\u0643 \u0628\u0633\u0631\u0639\u0629 \u0627\u0644\u062a\u0639\u0631\u0641 \u0639\u0644\u0649 \u0627\u0644\u0648\u0642\u062a \u0627\u0644\u0645\u062a\u0628\u0642\u064a \u0644\u0643 \u0625\u0644\u0649 \u0623\u0646 \u064a\u062d\u064a\u0646 \u0645\u0648\u0639\u062f \u0627\u062c\u062a\u0645\u0627\u0639\u0643 \u0627\u0644\u062a\u0627\u0644\u064a \u0645\u0646 \u0623\u064a \u062a\u0642\u0648\u064a\u0645 \u0645\u0646 \u062a\u0642\u0627\u0648\u064a\u0645\u0643. \u0627\u0646\u0642\u0631 \u0639\u0644\u0649 \u0627\u0644\u0632\u0631 \u0644\u064a\u062a\u0645 \u0646\u0642\u0644\u0643 \u0625\u0644\u0649 \u0627\u0644\u062a\u0642\u0648\u064a\u0645."},"direction":{"message":"rtl"},"notitle":{"message":"(\u0644\u064a\u0633 \u0647\u0646\u0627\u0643 \u0623\u064a \u0639\u0646\u0648\u0627\u0646)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 \u062f\u0642\u064a\u0642\u0629","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 \u0633\u0627\u0639\u0629","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 \u064a\u0648\u0645","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"\u062f\u0639\u0645 \u0645\u062a\u0639\u062f\u062f \u0644\u0644\u062a\u0642\u0648\u064a\u0645"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a."},"status_saving":{"message":"\u062c\u0627\u0631\u0650 \u0627\u0644\u062d\u0641\u0638..."},"multicalendartooltip":{"message":"\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u0631\u0628\u0639 \u0644\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062f\u0639\u0645 \u0627\u0644\u0645\u062a\u0639\u062f\u062f \u0644\u0644\u062a\u0642\u0648\u064a\u0645."},"imagetooltip":{"message":"\u062a\u0642\u0648\u064a\u0645 Google"}}

---

## File: _archive/mv2/extensions/calendar/_locales/bg/messages.json

{"name":{"message":"Google Calendar Checker (by Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"\u0412\u0438\u0436\u0442\u0435 \u0431\u044a\u0440\u0437\u043e \u043a\u043e\u043b\u043a\u043e \u0432\u0440\u0435\u043c\u0435 \u0432\u0438 \u043e\u0441\u0442\u0430\u0432\u0430 \u0434\u043e \u0441\u043b\u0435\u0434\u0432\u0430\u0449\u0430\u0442\u0430 \u0432\u0438 \u0441\u0440\u0435\u0449\u0430 \u043e\u0442 \u0432\u0441\u0435\u043a\u0438 \u0441\u0432\u043e\u0439 \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440. \u041a\u043b\u0438\u043a\u043d\u0435\u0442\u0435 \u0432\u044a\u0440\u0445\u0443 \u0431\u0443\u0442\u043e\u043d\u0430, \u0437\u0430 \u0434\u0430 \u0433\u043e \u043e\u0442\u0432\u043e\u0440\u0438\u0442\u0435."},"direction":{"message":"ltr"},"notitle":{"message":"(\u0411\u0435\u0437 \u0437\u0430\u0433\u043b\u0430\u0432\u0438\u0435)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 \u043c","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 \u0447","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 \u0434","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"\u041f\u043e\u0434\u0434\u0440\u044a\u0436\u043a\u0430 \u043d\u0430 \u043d\u044f\u043a\u043e\u043b\u043a\u043e \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0430"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438\u0442\u0435 \u0441\u0430 \u0437\u0430\u043f\u0430\u0437\u0435\u043d\u0438."},"status_saving":{"message":"\u0417\u0430\u043f\u0430\u0437\u0432\u0430 \u0441\u0435...."},"multicalendartooltip":{"message":"\u041c\u043e\u043b\u044f, \u043f\u043e\u0441\u0442\u0430\u0432\u0435\u0442\u0435 \u043e\u0442\u043c\u0435\u0442\u043a\u0430 \u0432 \u043a\u0432\u0430\u0434\u0440\u0430\u0442\u0447\u0435\u0442\u043e, \u0437\u0430 \u0434\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0430\u0442\u0435 \u043f\u043e\u0434\u0434\u0440\u044a\u0436\u043a\u0430\u0442\u0430 \u043d\u0430 \u043d\u044f\u043a\u043e\u043b\u043a\u043e \u043a\u0430\u043b\u0435\u043d\u0434\u0430\u0440\u0430"},"imagetooltip":{"message":"Google \u041a\u0430\u043b\u0435\u043d\u0434\u0430\u0440"}}

---

## File: _archive/mv2/extensions/calendar/_locales/ca/messages.json

{"name":{"message":"Google Calendar Checker (de Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Comproveu r\u00e0pidament el temps que falta per a la propera reuni\u00f3 a qualsevol dels vostres calendaris. Feu clic al bot\u00f3 per anar-hi."},"direction":{"message":"ltr"},"notitle":{"message":"(Sense t\u00edtol)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 min","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 dies","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Compatibilitat amb m\u00faltiples calendaris"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"S'ha desat la configuraci\u00f3."},"status_saving":{"message":"S'est\u00e0 desant..."},"multicalendartooltip":{"message":"Activeu la casella per activar la compatibilitat amb m\u00faltiples calendaris"},"imagetooltip":{"message":"Google Calendar"}}

---

## File: _archive/mv2/extensions/calendar/_locales/cs/messages.json

{"name":{"message":"Kontrola Kalend\u00e1\u0159e Google (od spole\u010dnosti Google)"},"title":{"message":"Kontrola Kalend\u00e1\u0159e Google"},"description":{"message":"Umo\u017e\u0148uje rychle zobrazit \u010das, kter\u00fd zb\u00fdv\u00e1 do dal\u0161\u00ed sch\u016fzky napl\u00e1novan\u00e9 v kter\u00e9mkoli z va\u0161ich kalend\u00e1\u0159\u016f. Kliknut\u00edm na tla\u010d\u00edtko p\u0159ejdete do kalend\u00e1\u0159e."},"direction":{"message":"ltr"},"notitle":{"message":"(Bez n\u00e1zvu)"},"optionstitle":{"message":"Kontrola Kalend\u00e1\u0159e Google"},"minutes":{"message":"$1 min","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 d","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Podpora n\u011bkolika kalend\u00e1\u0159\u016f"},"extensionname":{"message":"Kontrola Kalend\u00e1\u0159e Google"},"status_saved":{"message":"Nastaven\u00ed byla ulo\u017eena."},"status_saving":{"message":"Ukl\u00e1d\u00e1n\u00ed...."},"multicalendartooltip":{"message":"Za\u0161krtnut\u00edm pol\u00ed\u010dka pros\u00edm povolte podporu v\u00edce kalend\u00e1\u0159\u016f"},"imagetooltip":{"message":"Kalend\u00e1\u0159 Google"}}

---

## File: _archive/mv2/extensions/calendar/_locales/da/messages.json

{"name":{"message":"Google Calendar Checker (fra Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Tjek hurtigt hvor lang tid der er til n\u00e6ste m\u00f8de i en af dine kalendre. Klik p\u00e5 knappen for at \u00e5bne din kalender."},"direction":{"message":"ltr"},"notitle":{"message":"(Ingen titel)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 m","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 t","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 d","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Support til flere kalendere"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Indstillingerne er gemt."},"status_saving":{"message":"Gemmer..."},"multicalendartooltip":{"message":"S\u00e6t kryds i feltet for at aktivere support til flere kalendere"},"imagetooltip":{"message":"Google Kalender"}}

---

## File: _archive/mv2/extensions/calendar/_locales/de/messages.json

{"name":{"message":"Google Calendar Checker"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Werfen Sie schnell einen Blick auf die verbleibende Zeit bis zum n\u00e4chsten Termin in einem Ihrer Kalender. Klicken Sie zum \u00d6ffnen Ihres Kalenders auf die Schaltfl\u00e4che."},"direction":{"message":"ltr"},"notitle":{"message":"(Kein Titel)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 Min.","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 Std.","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 Tage","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Unterst\u00fctzung mehrerer Kalender"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Einstellungen gespeichert"},"status_saving":{"message":"Speichern...."},"multicalendartooltip":{"message":"Aktivieren Sie das Kontrollk\u00e4stchen, um die Unterst\u00fctzung mehrerer Kalender einzuschalten."},"imagetooltip":{"message":"Google Kalender"}}

---

## File: _archive/mv2/extensions/calendar/_locales/el/messages.json

{"name":{"message":"Google Calendar Checker (\u03b1\u03c0\u03cc \u03c4\u03b7\u03bd Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"\u0394\u03b5\u03af\u03c4\u03b5 \u03b3\u03c1\u03ae\u03b3\u03bf\u03c1\u03b1 \u03c0\u03cc\u03c4\u03b5 \u03b5\u03af\u03bd\u03b1\u03b9 \u03b7 \u03b5\u03c0\u03cc\u03bc\u03b5\u03bd\u03b7 \u03c3\u03c5\u03bd\u03ac\u03bd\u03c4\u03b7\u03c3\u03ae \u03c3\u03b1\u03c2 \u03b1\u03c0\u03cc \u03bf\u03c0\u03bf\u03b9\u03bf\u03b4\u03ae\u03c0\u03bf\u03c4\u03b5 \u03b1\u03c0\u03cc \u03c4\u03b1 \u03b7\u03bc\u03b5\u03c1\u03bf\u03bb\u03cc\u03b3\u03b9\u03ac \u03c3\u03b1\u03c2. \u039a\u03ac\u03bd\u03c4\u03b5 \u03ba\u03bb\u03b9\u03ba \u03c3\u03c4\u03bf \u03ba\u03bf\u03c5\u03bc\u03c0\u03af \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03bc\u03b5\u03c4\u03b1\u03c6\u03b5\u03c1\u03b8\u03b5\u03af\u03c4\u03b5 \u03c3\u03c4\u03bf \u03b7\u03bc\u03b5\u03c1\u03bf\u03bb\u03cc\u03b3\u03b9\u03cc \u03c3\u03b1\u03c2."},"direction":{"message":"ltr"},"notitle":{"message":"(\u03a7\u03c9\u03c1\u03af\u03c2 \u03c4\u03af\u03c4\u03bb\u03bf)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1\u03bb","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1\u03c9","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1\u03b7","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"\u03a5\u03c0\u03bf\u03c3\u03c4\u03ae\u03c1\u03b9\u03be\u03b7 \u03c0\u03bf\u03bb\u03bb\u03ce\u03bd \u03b7\u03bc\u03b5\u03c1\u03bf\u03bb\u03bf\u03b3\u03af\u03c9\u03bd"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"\u039f\u03b9 \u03c1\u03c5\u03b8\u03bc\u03af\u03c3\u03b5\u03b9\u03c2 \u03b1\u03c0\u03bf\u03b8\u03b7\u03ba\u03b5\u03cd\u03c4\u03b7\u03ba\u03b1\u03bd."},"status_saving":{"message":"\u0391\u03c0\u03bf\u03b8\u03ae\u03ba\u03b5\u03c5\u03c3\u03b7...."},"multicalendartooltip":{"message":"\u0395\u03c0\u03b9\u03bb\u03ad\u03be\u03c4\u03b5 \u03c4\u03bf \u03c0\u03bb\u03b1\u03af\u03c3\u03b9\u03bf \u03b3\u03b9\u03b1 \u03bd\u03b1 \u03b5\u03bd\u03b5\u03c1\u03b3\u03bf\u03c0\u03bf\u03b9\u03ae\u03c3\u03b5\u03c4\u03b5 \u03c4\u03b7\u03bd \u03c5\u03c0\u03bf\u03c3\u03c4\u03ae\u03c1\u03b9\u03be\u03b7 \u03c0\u03bf\u03bb\u03bb\u03ce\u03bd \u03b7\u03bc\u03b5\u03c1\u03bf\u03bb\u03bf\u03b3\u03af\u03c9\u03bd"},"imagetooltip":{"message":"\u0397\u03bc\u03b5\u03c1\u03bf\u03bb\u03cc\u03b3\u03b9\u03bf Google"}}

---

## File: _archive/mv2/extensions/calendar/_locales/en/messages.json

{"name":{"message":"Google Calendar Checker (by Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Quickly see the time until your next meeting from any of your calendars. Click on the button to be taken to your calendar."},"direction":{"message":"ltr"},"notitle":{"message":"(No Title)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1m","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1d","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Multi Calendar Support"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Settings Saved."},"status_saving":{"message":"Saving...."},"multicalendartooltip":{"message":"Please check the box to enable multiple calendar support"},"imagetooltip":{"message":"Google Calendar"}}

---

## File: _archive/mv2/extensions/calendar/_locales/en_GB/messages.json

{"name":{"message":"Google Calendar Checker (by Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Quickly see the time until your next meeting from any of your calendars. Click the button to be taken to your calendar."},"direction":{"message":"ltr"},"notitle":{"message":"(No Title)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1m","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1d","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Multi-Calendar Support"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Settings Saved."},"status_saving":{"message":"Saving...."},"multicalendartooltip":{"message":"Please tick the box to enable multiple calendar support"},"imagetooltip":{"message":"Google Calendar"}}

---

## File: _archive/mv2/extensions/calendar/_locales/es/messages.json

{"name":{"message":"Google Calendar Checker (de Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Consulta r\u00e1pidamente cu\u00e1nto tiempo falta para tu pr\u00f3xima reuni\u00f3n en cualquiera de tus calendarios. Haz clic en el bot\u00f3n para acceder al calendario."},"direction":{"message":"ltr"},"notitle":{"message":"(Sin t\u00edtulo)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1min","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1d","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Compatibilidad con varios calendarios"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Se ha guardado la configuraci\u00f3n."},"status_saving":{"message":"Guardando...."},"multicalendartooltip":{"message":"Selecciona la casilla para habilitar la compatibilidad con varios calendarios"},"imagetooltip":{"message":"Google Calendar"}}

---

## File: _archive/mv2/extensions/calendar/_locales/es_419/messages.json

{"name":{"message":"Google Calendar Checker (de Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"F\u00edjate r\u00e1pidamente cu\u00e1nto tiempo falta para tu pr\u00f3xima reuni\u00f3n en alguno de tus calendarios. Haz clic en el bot\u00f3n para que te lleve hasta tu calendario."},"direction":{"message":"ltr"},"notitle":{"message":"(Sin t\u00edtulo)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1\u00a0m","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1\u00a0h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1d","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Ayuda de Multi Calendar"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Configuraciones guardadas"},"status_saving":{"message":"Guardando...."},"multicalendartooltip":{"message":"Marca el casillero para habilitar la ayuda del calendario m\u00faltiple."},"imagetooltip":{"message":"Google Calendar"}}

---

## File: _archive/mv2/extensions/calendar/_locales/et/messages.json

{"name":{"message":"Google Calendar Checker (Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Vaadake kiiresti oma j\u00e4rgmise koosolekuni j\u00e4\u00e4nud aega \u00fcksk\u00f5ik millisest oma kalendrist. Kalendrisse minekuks kl\u00f5psake nupul."},"direction":{"message":"ltr"},"notitle":{"message":"(Pealkiri puudub)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 min","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 h","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 p\u00e4ev(a)","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Multi-Calendari tugi"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Seaded salvestatud."},"status_saving":{"message":"Salvestamine ..."},"multicalendartooltip":{"message":"Mitme kalendri toe lubamiseks m\u00e4rkige ruut"},"imagetooltip":{"message":"Google'i kalender"}}

---

## File: _archive/mv2/extensions/calendar/_locales/fi/messages.json

{"name":{"message":"Google Calendar Checker (Googlen tekem\u00e4)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"N\u00e4et nopeasti ajan seuraavaan tapaamiseesi mist\u00e4 tahansa kalenteristasi. Siirryt kalenteriin napsauttamalla painiketta."},"direction":{"message":"ltr"},"notitle":{"message":"(Ei nime\u00e4)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1 min","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1 t","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1 pv","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Useiden kalentereiden tuki"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Asetukset tallennettu."},"status_saving":{"message":"Tallennetaan..."},"multicalendartooltip":{"message":"Ota useiden kalentereiden tuki k\u00e4ytt\u00f6\u00f6n valitsemalla valintaruutu"},"imagetooltip":{"message":"Google-kalenteri"}}

---

## File: _archive/mv2/extensions/calendar/_locales/fil/messages.json

{"name":{"message":"Google Calendar Checker (mula sa Google)"},"title":{"message":"Google Calendar Checker"},"description":{"message":"Mabilisang tingnan ang oras hanggang sa iyong susunod na pagpupulong mula sa alinman sa iyong mga kalendaryo. Mag-click sa pindutan upang mapunta sa iyong kalendaryo."},"direction":{"message":"ltr"},"notitle":{"message":"(Walang Pamagat)"},"optionstitle":{"message":"Google Calendar Checker"},"minutes":{"message":"$1m","placeholders":{"1":{"content":"$1"}}},"hours":{"message":"$1o","placeholders":{"1":{"content":"$1"}}},"days":{"message":"$1a","placeholders":{"1":{"content":"$1"}}},"multicalendartext":{"message":"Suporta sa Maramihang Kalendaryo"},"extensionname":{"message":"Google Calendar Checker"},"status_saved":{"message":"Na-save ang Mga Setting."},"status_saving":{"message":"Sine-save...."},"multicalendartooltip":{"message":"Pakilagyan ng check ang kahon upang paganahin ang suporta sa maramihang kalendaryo"},"imagetooltip":{"message":"Google Calendar"}}

--- METRICS ---
- Files Extracted: 316
- Estimated Token Budget: ~74603 tokens
- Recency Window: Active (< 180 days)
- Canonical Reference: https://codewiki.google/github.com/GoogleChrome/chrome-extensions-samples
