diff --git a/redirects.yaml b/redirects.yaml index e6d20ac6ef2f..fb3dd64553ab 100644 --- a/redirects.yaml +++ b/redirects.yaml @@ -42,6 +42,34 @@ redirects: - from: /docs/webstore/pricing/ to: /docs/webstore/money/ +# CWS payments/apps purge +- from: /docs/webstore/hosted_apps + to: /docs/webstore +- from: /docs/webstore/migrating + to: /docs/webstore +- from: /docs/webstore/get_started_simple + to: /docs/webstore/publish/ +- from: /docs/webstore/apps_vs_extensions + to: /docs/webstore +- from: /docs/webstore/distribution + to: /docs/webstore +- from: /docs/webstore/launching + to: /docs/webstore +- from: /docs/webstore/choosing + to: /docs/webstore +- from: /docs/webstore/samples + to: /docs/webstore +- from: /docs/webstore/get_started + to: /docs/webstore +- from: /docs/webstore/inline_installation + to: /docs/webstore +- from: /docs/webstore/authentication + to: /docs/webstore +- from: /docs/webstore/one_time_payments + to: /docs/webstore +- from: /docs/webstore/payments-iap + to: /docs/webstore + # Fixes #675 - from: /extensions/manifestVersion to: /docs/extensions/mv3/manifest/version/ diff --git a/site/en/docs/webstore/about_webstore/index.md b/site/en/docs/webstore/about_webstore/index.md index fa592c595529..62c6fdf14aa6 100644 --- a/site/en/docs/webstore/about_webstore/index.md +++ b/site/en/docs/webstore/about_webstore/index.md @@ -6,33 +6,24 @@ description: > An explanation of the Chrome Web Store and why you might want to use it. --- -The [Chrome Web Store][1] lets you publish apps and games—either free or paid—where Google Chrome -users can easily find them. Whenever Chrome users create a new window or tab, they see the apps -they've installed, along with a store icon that reminds them to find more apps. +The [Chrome Web Store][1] lets you publish apps and extensions—either free or paid—where Google Chrome +users can easily find them. -If you already have a web app, you can create a metadata file and then publish your app in the store -within minutes. Or you can create and publish an app that's specialized for Chrome, such as an -extension for Chrome or a web app that's been modified to be downloaded and run on the user's -computer. +Your published item can be free, or you can charge for it using any payment system you like. -Your app can be free, or you can charge for it using either Chrome Web Store Payments or your own -custom payment system. A [Licensing API][2] lets you check whether the current user has paid for -your app with Chrome Web Store Payments. - -To upload and publish apps, use the [Chrome Developer Dashboard][3]. +To upload and publish items, use the [Chrome Developer Dashboard][3]. ## Why should I use the Chrome Web Store? -Publishing your app in the Chrome Web Store lets you reach more people. You can also earn revenue or -build Chrome-specific features into your app. +Publishing your app or extension in the Chrome Web Store lets you reach more people. You can also earn revenue or +build Chrome-specific features into it. ## How do I start? 1. Read the [technical overview][4] -2. Publish your first app by following the [Getting Started tutorial][5] +2. Publish your first extension by following the steps in [Publish in the Chrome Web Storel][5] [1]: http://chrome.google.com/webstore -[2]: /docs/webstore/check_for_payment [3]: https://chrome.google.com/webstore/developer/dashboard [4]: /docs/webstore/overview -[5]: /docs/webstore/get_started_simple +[5]: /docs/webstore/publish diff --git a/site/en/docs/webstore/apps_vs_extensions/index.md b/site/en/docs/webstore/apps_vs_extensions/index.md deleted file mode 100644 index 690ad0fa6455..000000000000 --- a/site/en/docs/webstore/apps_vs_extensions/index.md +++ /dev/null @@ -1,186 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: Extensions and Apps in the Chrome Web Store -date: 2010-09-01 -description: How installable web apps differ from Extensions. ---- - -The Chrome Web Store introduces the concept of [installable web apps][1]. These apps will live -alongside extensions and themes in the store, which will become the one-stop shop for all three -types of installable components. So what exactly are installable web apps and how do they differ -from extensions? I'm glad you asked... - -## Apps and Extensions: A Different User Experience - -There's no "better" approach here; apps and extensions are simply different creatures. Let's -understand apps first. They are just how they sound: applications you can run inside your browser -with a dedicated user interface and, typically, rich user interaction. We've already had the concept -of "web apps" in the browser for a few years, as something more rich and interactive than a website, -but less cumbersome and monolithic than a desktop application. Examples include games, photo -editors, and video players; all of these categories are viable as tightly focused apps running -inside the browser. Google Chrome is just formalizing the web app concept in a way that will be -familiar to anyone who's used apps on a smartphone. - -How about extensions? Extensions also provide functionality, but unlike apps, there is little or no -UI component. Instead, they extend the functionality of Google Chrome and the websites being viewed -in it. For example, they can extend Google Chrome by adding a new button to the address bar, such as -an ever-present currency converter. Buttons like this can also apply to the current website being -viewed—for example, click the currency converter button to convert all prices on the website you're -viewing. Similarly, you can introduce new items to the context menu, change the behavior of the -omnibox (the input field on the address bar), access the user's browsing history (with consent), and -[much more][2]. You can alter web pages too—for example, embed a "mail this" button next to every -link in every page, or customize the layout of your favorite website. - -Compared to apps, extensions cut across websites and web apps; they are usually in effect across all -websites (though some are site-specific). Apps don't combine with other apps in this way; they run -standalone, like any regular website. You can get a better idea of what extensions can do by -browsing the [Extensions Gallery][3]. - -## Technical Model: A Consistent Model for Packaging and Distribution - -Apps and extensions may present a very different user experience, but fortunately for developers, -there's a consistent model for packaging and distributing apps. Here's what they have in common: - -**Packaging:** Both are packaged as ".crx" files. These CRX files are special ZIP archives that -contain a manifest.json config file, along with the resources composing the app or extension. - -**Browser Support for Development:** The Google Chrome browser has built-in support to help you -develop your app or extension. You can view all apps and extensions at **chrome://extensions/** -(also accessible via menus), and by clicking on "Developer Mode", you get access to tools for -adding, reloading, and packing your apps and extensions. You can also pack CRX files from the -command line. - -**Installation Process:** These CRX files can live on any server, and a user can install them by -simply clicking on a link to download the file. In many cases, the server the CRX lives on will be -the Chrome Web Store. - -**Permissions:** When users download a CRX file, the browser will indicate which permissions (if -any) it's requesting, according to the included manifest.json config. Installation will only proceed -with the user's consent. Developers can declare that the app or extension should be [autoupdated][4] -whenever a new version is released. Autoupdates happen in the background unless the required -permissions have changed. - -The main difference between apps and extensions, from a technical perspective, is a special "launch" -parameter in the manifest. It's present only in apps, and it tells Google Chrome what to show when -the user starts up an installed app. There are also a whole bunch of parameters specific to -extension functionality—for example, you would use the "page_action" parameter to add a button to -the address bar. So are these things mutually exclusive—you either have a "launch" parameter or have -the extension parameters? Not quite... - -## Hosted Apps, Packaged Apps, and Extensions - -There are actually two kinds of apps: hosted and packaged. A hosted app wraps an online website, so -the CRX package can be as simple as a single manifest.json file pointing to the website. A packaged -app contains the whole kit and kaboodle inside the CRX package—HTML, CSS, and so on, all run from -the user's hard drive. - -Packaged apps are a kind of missing link between extensions and hosted apps. They look the same as a -hosted app to the user, but under the covers, they are really like traditional extensions with that -special "launch" parameter. They have access to almost all functionality afforded to regular -extensions—context menu, background pages, and so on. The only exception is that packaged apps can't -add buttons to the address bar. - -Returning to the example in the previous section, it's perfectly valid for a packaged app to add an -item to Google Chrome's [context menu][5]. However, it's completely invalid for a hosted app to do -the same thing. In some respects, a packaged app lets you have your cake and eat it: the appearance -of a packaged app with the power of an extension. But there are still plenty of reasons to use pure -extensions and hosted apps. - -## When You Need Extension Behavior: Deciding Between Pure Extensions and Packaged Apps - -If you want to extend browser behavior or modify web pages, you have no choice but to use an -extension or a packaged app; hosted apps don't have those privileges. You will then be able to -provide any number of extension behaviors. Should you go down this path, the next decision comes -down to pure extension versus packaged app. It's so easy to add a "launch" parameter to your -manifest, you might be tempted to take a pure extension and tack on a dedicated UI for it. Think -twice. Users don't want apps superfluously appearing on their New Tab page if they aren't adding any -value. So make your extension a packaged app only if it's genuinely useful. - -Certain extensions will really benefit from an app UI. Imagine a news reader extension that shows -users notifications every time a new story is posted. It's easy to see how this extension could -introduce a dedicated UI showing the stream of recent stories—a proper "big page" experience to -augment what was previously transient content. - -Other extensions, not so much. Extensions often have a very specific purpose, so building a new app -UI—even if it is related to the extension's behavior—is probably not what users are after, and it -would be better to build the app UI as a separate app. Imagine a social bookmarking extension -providing a "bookmark this" action via a context menu item. You could imagine the extension becoming -a general-purpose app for the social bookmarking service, but there's a good argument that this is -distinct functionality that should be encapsulated in a separate app, as many users will only want -one or the other, but not both. - -Even if your extension needs a UI, it might be enough to use one of the existing extension mechanism -UIs, instead of the full-page UI offered by apps. Extensions can manifest themselves in the form of -context menu items, custom toolbars, notification dialogs, and buttons on the address bar that -reveal extra content when clicked. Also, note that extensions have the concept of [options -pages][6], so you don't need to create an app just to support option setting. - -## When You Need App Behavior: Deciding Between Packaged Apps and Hosted Apps - -If you want a full-page UI and an icon in the New Tab page, you should opt for an app; that is, your -manifest will include a "launch" parameter. It will be a packaged app if the parameter points to a -local URI ("launch_path") and a hosted app if the URI is online ("web_url"). Incidentally, "pure" -extensions achieved a similar effect in the past by including a hyperlink to a packaged HTML page, -which would then be shown as a full page. We expect many developers will migrate this kind of -extension to a packaged app in the future. - -How to decide between packaged and hosted apps? Let's start with the advantages of packaged apps: - -- As we've already noted, packaged apps can provide extension behavior. Your packaged app might - emphasise the extension behavior (an "extension with a face"), the app behavior ("app with extra") - or it might be a balanced blend of the two styles. The flexibility of packaged apps will be - appealing to developers seeking to improve the experience of their apps and differentiate from - similar products. You can still build a standard web app running on a regular website, but make it - an installable web app and you can add extension behavior to enhance the experience for those who - install it. -- Packaged apps can run in the background, even when the user hasn't launched your app. This is - actually just a special case of the previous point, because a powerful extension privilege is the - ability to run a background page. It starts when the browser starts and is ever-present. Your app - could therefore keep data fresh and show HTML5 notifications (alerts that work even when the user - is in another app). Thus, packaged apps support "always on" functionality, while hosted apps are - only on when they're in the user's active tab. -- Packaged apps will load immediately, being held on the user's hard drive. -- Certain apps, like some games and utilities, will need no network connection at all. These are - ideal candidates for packaged apps because the user will be able to run them offline. That said, - hosted apps can usually achieve the same effect with the judicious use of [Application - Caching][7], a generic HTML5 technology. - -For comparison, these are the advantages of hosted apps: - -- Hosted apps are easier from an infrastructure perspective if you are looking to offer your web app - as a regular site to all browsers. (Incidentally, we think this is fine as long as you follow - basic design principles for installable web apps.) In the case of packaged apps, you'll probably - need to write a script to put your assets inside a CRX file and in some cases, you may need to - refactor your code somewhat. Note, however, packaged apps can still perform requests back to your - website (or indeed any website, since packaged apps can use the "permissions" parameter to perform - cross-domain requests). -- Hosted apps are especially easier if your existing web app uses server-side scripting to generate - your pages and content, or if your app relies on form submissions and full page refreshes. With a - packaged app, you're relying on JavaScript to make any changes to the page. -- Hosted apps may be a better choice if your app and content are very large. The store imposes a 2GB - limit on CRX files, though a packaged app could always download further content via network calls. -- Hosted apps will require less permissions to be granted by the user. This is the flipside to the - benefits of extension behavior that packaged apps enjoy. -- Hosted apps will update automatically, just by updating your server. However, this is not a - significant advantage, because packaged apps support autoupdating, and this is transparent to the - user unless you've changed the required permissions. - -## Summary - -The Chrome Web Store opens up a range of new possibilities for creators of web apps and extensions -alike. It provides a new way for users to explore web apps and brings extension functionality to the -attention of a mainstream audience. Appreciating the difference between apps and extensions, and -choosing the approach that makes sense for your own work, is key to building the best possible -experience for your users. - -To learn more about installable web apps and ask questions to our team, you can visit our -[discussion group][8]. - -[1]: https://developers.google.com/chrome/apps/ -[2]: http://code.google.com/chrome/extensions/overview.html -[3]: https://chrome.google.com/webstore/category/extensions -[4]: http://code.google.com/chrome/extensions/autoupdate.html -[5]: http://code.google.com/chrome/extensions/contextMenus.html -[6]: http://code.google.com/chrome/extensions/options.html -[7]: http://www.html5rocks.com/tutorials/appcache/beginner/ -[8]: http://groups.google.com/a/chromium.org/group/chromium-apps/topics diff --git a/site/en/docs/webstore/authentication/index.md b/site/en/docs/webstore/authentication/index.md deleted file mode 100644 index 0cd9186955a7..000000000000 --- a/site/en/docs/webstore/authentication/index.md +++ /dev/null @@ -1,182 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: Supporting Federated Login with Google Accounts for Chrome Web Store Apps -date: 2010-11-01 -description: > - An overview of federated login and guidelines on how to use federated login - in your Chrome Web Store app. ---- - -When a user installs and launches your app from the Chrome Web Store, odds are they'll be signed in -to their Google Account. If your app requires authentication, then you should significantly -streamline the process for your users by supporting Federated Login to allow users to sign in to -your app using their Google Accounts. In this article, we'll cover some the basics of Federated -Login using Google Accounts, things to consider when designing your authentication flow, some -examples of apps that allow users to sign in using their Google Accounts, and resources to help you -learn more and get started. - -## Overview of Federated Login - -Federated Login, based on the [OpenID][1] standard, frees users from having to set up separate -account credentials for different web apps, and frees developers from the task of implementing login -authentication measures. OpenID achieves this goal by providing a framework in which users can -establish an account with an OpenID provider, such as Google, and use that account to sign in to any -web app that accepts OpenIDs. - -Google supports the OpenID 2.0 protocol, providing authentication support as an OpenID provider. A -third-party site can request Google to authenticate users who are signing in with an existing Google -Account. Google will return an identifier to the third-party site that the site can use to recognize -the user. This identifier is uniquely identifies the user, enabling the third-party site to -recognize the user across multiple sessions. - -## Considerations - -When deciding how to structure the authentication flow for your app, keep the following -considerations in mind. - -### Will you be adding support for Federated Login with Google Accounts on top of an existing authentication system? - -If so, you can provide users a way to link their new accounts with their existing accounts. For more -guidance and best practices for handling and linking legacy accounts, see [this article][2]. In the -[Examples][3] section below, you'll see a walk through of the account creation process for -Springpad, which gives the user the choice to link with an existing account or continue as a new -user. - -### Do you you want to use a different authentication flow if your app is launched via the Google Chrome app launcher? - -You can further streamline the process for users by supporting a different authentication flow when -your app is launched via the Google Chrome app launcher as opposed to a bookmark or link. You can -use JavaScript to check whether `window.chrome.app.isInstalled` is defined. If it is, the app is -running from the Google Chrome app launcher, and you can assume they'll be signing in via their -Google Account. Here's an example of the code you'd use: - -```js -if (window.chrome.app.isInstalled) { - // You're running as an installed app, via the app launcher! -} else { - // You're running via a bookmark or link. -} -``` - -### Must users provide information in order to create a new account in your system? - -With OpenID, you can request information such as first name, last name, email address, region, and -language. You request this additional information by including [attribute exchange parameters][4] in -the authentication requests that you send to the Google OpenID endpoint. What if you require -additional information such as settings related to your app, or if you require a user to accept your -terms of service before creating an account? In those cases, you can prompt the user to provide -additional information after they've opted to sign in with their Google Account. In the -[Examples][5] section below, you'll see a walk through of the account creation process for Manymoon, -which demonstrates this process. If the extra information is optional, then you can also consider -waiting until after a user has created their account to gather this information, in order to -simplify the account creation process. - -### What authentication options will you present to your users? - -The way you decide to design your user interface may be different if you only support Federated -Login with Google Accounts versus supporting Federated Login with Google Accounts and your existing -authentication system. See [Usability Research on Federated Login][6] for more options. - -### Do you want to use a pop-up UI or a browser redirect flow for signing in? - -You have a choice of how users will be prompted for their Google Account credentials. You can prompt -them via a pop-up UI, or you can use a browser redirect flow. Our [PHP sample code][7] demonstrates -how to use the pop-up UI, while the [Java][8] and [Python][9] sample code uses the browser redirect -flow. To try the different styles of authentication yourself, see [these examples][10]. - -### What if a user deletes their Google Account? - -If a user deletes their Google Account, they can no longer sign in to your app using that account. -In this case, you could provide a way of associating accounts in your system with a different OpenID -identifier, similar to a password reset flow. - -## Sample Workflow {: #sample-workflow } - -This sample workflow walks through the authentication process for an app that supports Federated -Login. - - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/1605551445479.png", - alt="A diagram of the authentication flow.", - height="662", - width="800" %} - -## Examples - -The screencasts below show three different account creation and authentication scenarios from a -user's perspective. - -### Basic authentication flow - -This screencast uses the Diary.com app to demonstrate a basic authentication flow. - -{% YouTube id="u4FBk_XUw2Q" %} - -### Requesting additional information during account creation - -In this screencast, the Manymoon app demonstrates an account creation flow where the user is -prompted for additional information. - -{% YouTube id="wV0ModwrCvo" %} - -### Linking with an existing account - -This screencast uses the Springpad app to show how a user can sign in to an app with their Google -Account and then link to an existing Springpad account. - -{% YouTube id="_k7lmFC9IrY" %} - -## Resources and Best Practices - -This section has some final tips about terminology, federated identity, and where you can get more -information. - -For consistency with Google Accounts, we recommend using the following terms to refer to account -creation and authentication: - -- **sign in** -- **sign out** -- **create** - -**Note**: The adjective and noun forms of the first two terms are _sign-in_ and _sign-out_. Also -note that the user _signs in to_ an account (that's three words). - -When a user is creating an account in your app, we recommend displaying a splash page to the user -before prompting them to sign in to their Google Account. Displaying a splash page provides context -to the user about why they're being asked to sign in to their Google Account. The Springpad app in -the [Examples][11] section above demonstrates one possible layout for a splash page. See [Usability -Research on Federated Login][12] for more options. - -Make sure you're using the correct federated identity URL when you request the [OpenID -endpoint][13]. The URL you should use to get the Google OpenID endpoint is -`https://www.google.com/accounts/o8/id`. - -Here are some places where you can find more information about OpenID and Federated Login for Google -Accounts. - -- For technical guidance on using Federated Login for Google Accounts, see the documentation for - [working with OpenID][14]. -- The [Identifying the User][15] section of the Chrome Web Store Developer's Guide provides more - details on when supporting Federated Login with Google Accounts is required and when it's - optional, as well as a listing of OpenID libraries you can use. -- For sample code that demonstrates how to obtain the OpenID identifier for a user and how to use - the Chrome Web Store Licensing API, see these [samples][16] for Java, Python, and PHP. -- Visit the [Google Group on Federated Login][17] for discussion on using Google's OpenID API. - -[1]: http://openid.net -[2]: http://sites.google.com/site/oauthgoog/UXFedLogin/loginlogic -[3]: #examples -[4]: https://developers.google.com/accounts/docs/OpenID#endpoint -[5]: #examples -[6]: http://sites.google.com/site/oauthgoog/UXFedLogin -[7]: /docs/webstore/samples#php -[8]: /docs/webstore/samples#java -[9]: /docs/webstore/samples#python -[10]: http://www.puffypoodles.com/ -[11]: #examples -[12]: http://sites.google.com/site/oauthgoog/UXFedLogin -[13]: https://developers.google.com/accounts/docs/OpenID#endpoint -[14]: https://developers.google.com/accounts/docs/OpenID#working -[15]: /docs/webstore/identify_user -[16]: /docs/webstore/samples -[17]: http://groups.google.com/group/google-federated-login-api diff --git a/site/en/docs/webstore/best_practices/index.md b/site/en/docs/webstore/best_practices/index.md index 37c9641404ce..a016c4952da3 100644 --- a/site/en/docs/webstore/best_practices/index.md +++ b/site/en/docs/webstore/best_practices/index.md @@ -41,7 +41,6 @@ any of these policies. tile, marquee, and screenshots) [should be provided][supplying-images]. Images should not be blurry or too busy. [Privacy information][dashboard-privacy] (permissions justifications, the extension's privacy policy, data use disclosures, etc.) must be accurate and up to date. - ## Support Google Accounts If your app requires user login, we recommend that you provide at least some support for Google @@ -98,9 +97,6 @@ that is most appropriate: [3]: /docs/webstore/identify_user -[4]: /docs/webstore/check_for_payment -[5]: /docs/webstore/check_for_payment#cache -[6]: #top [7]: /docs/webstore/branding [8]: /docs/webstore/images [9]: #top diff --git a/site/en/docs/webstore/branding/index.md b/site/en/docs/webstore/branding/index.md index 1093bd30da1c..efc4a2482f37 100644 --- a/site/en/docs/webstore/branding/index.md +++ b/site/en/docs/webstore/branding/index.md @@ -18,12 +18,12 @@ app][2]. [Developer Agreement][6] This page sets forth the guidelines for use of [Google trademarks][7] you should consider when -naming and describing your application. Your use of any Google trademarks is always subject to the +naming and describing your extension. Your use of any Google trademarks is always subject to the [Google Permissions][8]. ## Using the Chrome Web Store badge -You can let others know that your app, extension or theme is available in the Chrome Web Store by +You can let others know that your extension or theme is available in the Chrome Web Store by using the "Available in the Chrome Web Store" badge on your site. You do not need pre-approval to use this badge. However, be sure that your use of the badge is consistent with the Chrome Web Store [terms of service][6] and these branding guidelines, or we may request that you modify or cease your @@ -61,11 +61,11 @@ follow these rules and restrictions: twenty-one years of age, violates other applicable laws or regulations or is otherwise objectionable. - Make sure that clicking the badge always links to your page in the Chrome Web Store, and that your - app, extension or theme is available in the store at all times that you use the badge. + extension or theme is available in the store at all times that you use the badge. -## Choosing an application or developer name +## Choosing an extension or developer name -Don't use any Google trademarks or any confusingly similar marks as the name of your application or +Don't use any Google trademarks or any confusingly similar marks as the name of your extension or company without [written permission from Google.][19] {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/qn7cPDkh9kYbUmlRiJWO.png", @@ -80,8 +80,8 @@ company without [written permission from Google.][19] ## Using Google logos Don't use Google trademarks or a modified version of a Google trademark as the logo for your -application without written permission from Google. Feel free to continue using our badges in your -application subject to the branding guidelines for each of those badges (for example, [YouTube][20], +extension without written permission from Google. Feel free to continue using our badges in your +extension subject to the branding guidelines for each of those badges (for example, [YouTube][20], [Google Checkout][21]). {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/l1QxerNZuBZBa6dUFOIT.png", @@ -93,7 +93,7 @@ application subject to the branding guidelines for each of those badges (for exa {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/rPqMdiBSYbH6lj1Na2E1.png", alt="Acceptable logo", height="146", width="224" %} -## Describing your application +## Describing your extension If your product is compatible with a Google product, make reference to that Google product by using the text "for", "for use with", or "compatible with", and be sure to include the ™ symbol with the @@ -121,7 +121,7 @@ services. For further details, check out the [Google Permissions][8] page. ## Giving proper attribution -Do give proper attribution to Google for any use of their marks in your application title or in your +Do give proper attribution to Google for any use of their marks in your extension title or in your description. Example: ```text diff --git a/site/en/docs/webstore/choosing/index.md b/site/en/docs/webstore/choosing/index.md deleted file mode 100644 index b27f7f662908..000000000000 --- a/site/en/docs/webstore/choosing/index.md +++ /dev/null @@ -1,73 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: Choosing an App Type -date: 2017-08-30 -description: > - Guidelines on when to publish a hosted app, a Chrome App, or a Chrome Extension. ---- - -Sometimes it's hard to decide whether you need to publish a [hosted app][1] or a [Chrome App][2]—or -maybe even an [Chrome Extension][3]. This page aims to help you choose the right type of app. - -## Overview - -As the following figure shows, if you already have a web app, you don't need to change it; you can -just publish it as a hosted app. If you're willing to modify your app or build one from scratch, you -have more options. - - - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/1605580911516.png", - alt="A flowchart of the decision process.", - height="627", - width="581" %} - -**Note**: **2GB** is the current size limit for packaged apps. If your app (with all its essential -assets) can't fit into a 2GB ZIP file, then your app is too big to be a packaged app. - -## Details - -If you're having trouble deciding what type of app to create, read the article [Extensions, Packaged -Apps, and Hosted Apps in the Chrome Web Store][4]. Here's some additional information to help you -choose: - -- A **hosted** app can work in all web browsers, as long as it doesn't depend on features that not - all browsers support yet, such as [background execution][5] or [WebGL][6]. On the other hand, - because only Chrome supports the Chrome Web Store, you have the option of tailoring your app to - Chrome. -- A **packaged** app will work only in Chrome. However, you can reuse the app's code for ordinary - web apps. -- Only an **extension** can present an icon in the toolbar, using a [page action][7] or [browser - action][8]. -- If you're not sure whether you need a **packaged** app or an **extension**, it should probably be - an extension. - - **Note:** As a rule of thumb, a packaged app should feel like a hosted app, not like an extension. - -- Although an **extension** has little to no UI of its own, it can sometimes have a big effect on - the UI of other pages and web apps. For example, an extension can [replace a standard Chrome - page][9], such as the History page (chrome://history). Or it can change the contents or formatting - of some or all websites—to use different fonts, for example. -- The [Licensing API][10] lets you check programmatically whether the user has paid for your app - using Chrome Web Store Payments. The Licensing API is usually used only by **hosted** apps because - packaged apps are stored locally and [could be modified][11] to circumvent the API call. -- The [chrome.\* APIs][12] let your **packaged** app or **extension** be tightly integrated with - Chrome. They take advantage of Chrome support for functionality such as [idle state][13], - [internationalization][14], [tabs][15], and [windows][16]. - -[1]: /docs/apps -[2]: /docs/apps -[3]: /docs/extensions -[4]: /docs/webstore/apps_vs_extensions -[5]: /docs/extensions/reference/mv3/background_execution -[6]: http://www.khronos.org/webgl/ -[7]: /docs/extensions/reference/browserAction -[8]: /docs/extensions/reference/browserAction -[9]: /docs/extensions/mv3/override -[10]: /docs/webstore/check_for_payment -[11]: /docs/webstore/faq#faq-app-02 -[12]: /docs/extensions/reference -[13]: /docs/extensions/reference/idle -[14]: /docs/extensions/reference/i18n -[15]: /docs/extensions/reference/tabs -[16]: /docs/extensions/reference/windows diff --git a/site/en/docs/webstore/distribution/index.md b/site/en/docs/webstore/distribution/index.md deleted file mode 100644 index e09caa3bce15..000000000000 --- a/site/en/docs/webstore/distribution/index.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: "Distributing Products Built for Chrome" -date: 2014-05-27 -updated: 2018-06-12 -description: > - An overview of the types of products you can distribute on Chrome, - your distribution options, and your monetization options. ---- - -On Chrome, you can build and distribute the following kinds of products: - -
WebsitesWith just an extra bit of metadata, you can integrate your website into the Chrome browser, making your content more accessible to users.
ExtensionsExtensions are small browser add-ons that add new and useful features to Chrome.
Chrome AppsChrome apps are designed specifically for Chrome and only work in the Chrome browser. They allow you to take advantage of cutting-edge technology that is not available to traditional websites.
Important: Chrome will be removing support for Chrome Apps on Windows, Mac, and Linux. Chrome OS will continue to support Chrome Apps. Read the announcement and learn more about migrating your app.
ThemesThemes change the way the Chrome browser looks, adding style to your users' browsing experience.
- -## Distribution Options {: #distribution-options } - -While the Chrome Web Store is the primary hub for distributing Chrome products, several other -distribution options are available. - -
Chrome Web StoreThe Chrome Web Store is an online marketplace where users can browse for Chrome-integrated websites, Chrome apps, extensions, and themes. The store helps users find, purchase, and install your content in the Chrome browser.
Note: Chrome supports Native Client (NaCl) and Portable Native Client (PNaCl) technologies. Products using NaCl must be distributed through the Chrome Web Store.
External InstallationIn certain cases, you might want your product to be installed automatically. External installation allows you to do this.
MobileFor mobile users, you can easily convert your products into native apps for Android and iOS using Apache Cordova.
- -## Monetization Options {: #monetization-options } - -The Chrome platform supports a variety of [payment systems and monetization models][11]. Chrome Web -Store Payments powered by Google Wallet for Digital Goods is especially well-integrated with the -store. Alternatively, you are free to choose whichever payment service provider you prefer. - -The following table covers a few ways to monetize your product. - -
FreemiumA free trial version of your product that prompts users for payment to unlock advanced features or regain access after a time-limit.
One-time PaymentUsers buy your product by providing a one-time payment upfront.
Note: This is the only monetization option for themes.
SubscriptionUsers purchase access to your product on a subscription basis.
CustomYou are free to implement a custom model that works best for you. For in-app payments, consider using the Chrome Web Store API.
- -
Note: Chrome Web Store payment methods are not available for websites.
- -[1]: /docs/extensions/mv2/overview -[2]: /docs/apps/about_apps -[3]: http://blog.chromium.org/2016/08/from-chrome-apps-to-web.html -[4]: /apps/migration -[5]: /docs/extensions/mv2/themes -[6]: https://chrome.google.com/webstore -[7]: /docs/native-client/devguide/distributing -[8]: /docs/extensions/mv2/external_extensions -[9]: /docs/apps/chrome_apps_on_mobile -[10]: http://cordova.apache.org/ -[11]: /docs/webstore/money -[12]: /docs/webstore/payments-iap diff --git a/site/en/docs/webstore/faq/index.md b/site/en/docs/webstore/faq/index.md index 9b48e3b442d8..b8f1c274ff71 100644 --- a/site/en/docs/webstore/faq/index.md +++ b/site/en/docs/webstore/faq/index.md @@ -5,7 +5,7 @@ date: 2020-06-09 description: Frequently asked questions about Chrome Web Store. --- -The [Chrome Web Store][1] lets you publish free or paid apps where Google Chrome users can easily +The [Chrome Web Store][1] lets you publish free or paid extensions where Google Chrome users can easily find them. This FAQ answers many common questions about the Chrome Web Store. If you don't find your answer here, check the [extension hosting changes FAQs][2], the [general extension FAQs][3], or the [chromium-apps group][4]. @@ -16,16 +16,16 @@ Please expand the _Table of Contents_ to quickly navigate this page. ### What is the Chrome Web Store? {: #faq-gen-01 } -The Chrome Web Store is an open marketplace for [Chrome Apps][apps], [Google Chrome -Extensions][ext], and [Google Chrome Themes][themes], where consumers may browse, install, and +The Chrome Web Store is an open marketplace for [Google Chrome +Extensions][ext] and [Google Chrome Themes][themes], where consumers may browse, install, and purchase items and install them in their browser. These items are built with web technologies and run inside of web browsers. ### How many people use Chrome? {: #faq-gen-02 } In 2015, Google announced one billion active users for Chrome. It's also important to note that -Chrome Web Store apps can run in any browser that supports the web technologies used to build the -app. +Chrome Web Store extensions can run in any browser that supports the web technologies used to build the +extension. ### Is there a road map for Chrome? {: #faq-gen-05 } @@ -33,31 +33,26 @@ You can follow the [Google Chrome Releases blog][95] to learn about all the late being made to Chrome. You can create and track bugs and features in the [Chromium bug tracker][96], and we recommend that you download and install the [Dev channel build][97] of Chrome browser. -### Which version of Chrome should I target for my Chrome Web Store apps? {: #faq-gen-06 } +### Why would someone install an extension instead of just using a bookmark or typing in a URL? {: #faq-gen-07 } -You should target Chrome 8 as a minimum, however the Chrome Web Store was made available to all -users in Chrome 9. - -### Why would someone install a web app instead of just using a bookmark or typing in a URL? {: #faq-gen-07 } - -Installing an app ensures it is launchable from the New Tab Page via the Chrome apps launcher. -Installing an app also allows you to grant it privileges such as unlimited local storage and +Installing an extension ensures it is launchable from the New Tab Page via the Chrome extensions launcher. +Installing an extension also allows you to grant it privileges such as unlimited local storage and background pages. -### Is there an approval process for apps in the store? {: #faq-gen-08 } +### Is there an approval process for extensions in the store? {: #faq-gen-08 } -All apps go through an automated review process and in some cases, an app will be published without +All extensions go through an automated review process and in some cases, an extension will be published without further manual review. There may be some instances in which a manual review will be required before -the app is published based on our [program policies][98]. In some cases, where sensitive permissions +the extension is published based on our [program policies][98]. In some cases, where sensitive permissions are requested, review times and/or approval times may be longer. -### How will users find my app? {: #faq-gen-09 } +### How will users find my extension? {: #faq-gen-09 } -The Chrome Web Store will surface web apps in a variety of ways. Of course, each app gets a page in +The Chrome Web Store will surface extensions in a variety of ways. Of course, each extension gets a page in the store, which will be searchable via the store and other search engines. There will be category lists in the store, as well as a variety of curated and algorithmically generated lists. We -recommend that you broadly promote your web app, through marketing websites and other means, so that -users will find your app even outside of the store. +recommend that you broadly promote your extension, through marketing websites and other means, so that +users will find your extension even outside of the store. ### Why am I being asked to pay a registration fee? {: #faq-gen-11 } @@ -85,15 +80,15 @@ you have two options: We recommend option 1 if you want to get up and running as soon as possible. -### What types of apps or extensions are not allowed in the store? {: #faq-gen-22 } +### What types of extensions are not allowed in the store? {: #faq-gen-22 } -While we try to allow most apps and extensions, a small number of extensions are explicitly -disallowed in our [Developer Terms of Service][102] and [Program Policies][103]. Such apps or +While we try to allow most extensions, a small number of extensions are explicitly +disallowed in our [Developer Terms of Service][102] and [Program Policies][103]. Such extensions will be removed when they are brought to our attention. -### How do I report an abusive app or extension? {: #faq-gen-23 } +### How do I report an abusive extension? {: #faq-gen-23 } -To report an app or extension which violates our Terms of Service, locate the corresponding listing +To report an extension which violates our Terms of Service, locate the corresponding listing in the store and use the "Report abuse" link. ### How are items ranked in the store? {: #faq-gen-24 } @@ -126,14 +121,14 @@ Here are a few tips to increase the likelihood that we'll feature your listing: videos) - Promote your listing independently so that it starts to rise in the rankings -### How can my app or extension be selected for a collection? {: #faq-gen-26 } +### How can my extension be selected for a collection? {: #faq-gen-26 } The collections are curated, and are not intended to be comprehensive. A collection is curated using the ranking criteria already listed and may be selected to provide helpful results for certain circumstantial situations, such as work-from-home extensions. Solicitations to be placed in a collection are not accepted. -### How can I provide support for users of my app or extension? {: #faq-gen-27 } +### How can I provide support for users of my extension? {: #faq-gen-27 } You can set up discussion groups to communicate with your users. One way of doing so is through [Google Groups][104]. @@ -166,15 +161,7 @@ more information, please review our [program policies][106]. ### How do I write an extension? {: #faq-dev-01 } -You can find all the information you need to develop extensions and apps at [/docs/extensions/][ext] -and [/docs/apps/][apps], respectively. - -### Should I build a web app or an extension? {: #faq-gen-10 } - -Extensions are primarily used to extend functionality of the user's browser. For instance, -extensions are commonly used to interact with the pages that a user views, add custom context menus, -or manipulate tabs and windows. Web apps, on the other hand, are applications in their own right and -rarely need to extend browser functionality. +You can find all the information you need to develop extensions at [/docs/extensions/][ext]. ### How can I push an update of my code to my users? {: #faq-dev-02 } @@ -182,17 +169,17 @@ Visit [https://chrome.google.com/webstore/devconsole][110] and click on the list update. Once you upload a new version and click **Publish**, your update will automatically be pushed out to users over the next few hours. -### Can I host my own app or extension? {: #faq-dev-03 } +### Can I host my own extension? {: #faq-dev-03 } -Yes, you may host your own app or extension, although you will need to take care of [packaging and +Yes, you may host your own extension, although you will need to take care of [packaging and serving the][111] [auto-update manifest][112] yourself. ## Creating a listing ### In what format should I upload my code? {: #faq-listing-01 } -To upload an item to the Chrome Web Store, submit a ZIP file containing the files used in your app, -theme, or extension. Do not upload a .crx file; the submission will fail. +To upload an item to the Chrome Web Store, submit a ZIP file containing the files used in your +extension. Do not upload a .crx file; the submission will fail. ### How long will it take for my listing to appear in the store? {: #faq-listing-02 } @@ -216,62 +203,63 @@ See [Supplying Images][116] for guidelines on supplying images for the store. So practices to consider: - Write a catchy title, a clear and descriptive short description, and a detailed long description. -- Create screenshots that demonstrate how your app or extension works. +- Create screenshots that demonstrate how your extension works. - Upload a screencast, such as a YouTube video or a Google Docs Presentation, to demonstrate how - your app or extension works. + your extension works. - Post a support link so that users don't clutter your comments thread with bug reports. -### How can I import an existing app or extension into the store? {: #faq-listing-05 } +### How can I import an existing extension into the store? {: #faq-listing-05 } -You may import an app or extension with a pre-existing key into the store (see [instructions][117]). +You may import an extension with a pre-existing key into the store (see [instructions][117]). -### How can I export an app or extension from the store? {: #faq-listing-06 } +### How can I export an extension from the store? {: #faq-listing-06 } Currently we do not support exporting a listing's sources or private key from the store. -### Why did I receive a "Cannot parse the manifest" error when uploading my app or extension? {: #faq-listing-07 } +### Why did I receive a "Cannot parse the manifest" error when uploading my extension? {: #faq-listing-07 } The manifest file needs to be in JSON format. Most likely, you've included a comment in the manifest file that is not recognized by the Chrome Web Store's JSON parser. Try removing any comments from the manifest file and try re-uploading. -### I've verified my domain, and I have a wildcard app URL like \*://example.com, but the Chrome Web Store is still asking me to verify my domain. What gives? {: #faq-gen-15 } +### I've verified my domain, and I have a wildcard URL like \*://example.com, but the Chrome Web Store is still asking me to verify my domain. What gives? {: #faq-gen-15 } If you use a wildcard like \*://example.com, make sure you have verified both http://example.com and https://example.com. -### When I try to upload my app to the Chrome Web Store, I get this error: "(Server rejected) An error occurred: please try again later." What gives? {: #faq-gen-16 } +### When I try to upload to the Chrome Web Store, I get this error: "(Server rejected) An error occurred: please try again later." What gives? {: #faq-gen-16 } This error occasionally occurs if you've been logged into the Chrome Web Store for a long time. If -you sign out of your Google Account and then sign back in, you should be able to upload your app. +you sign out of your Google Account and then sign back in, you should be able to upload your +extension. -### Can I control the regions where my app is listed? {: #faq-gen-18 } +### Can I control the regions where my extension is listed? {: #faq-gen-18 } -Yes, you can select which regions your application appears in. This might be because your app is +Yes, you can select which regions your extension appears in. This might be because your extension is only applicable to the local market, or you might have specific obligations that mean you can only -make your app available in certain regions. +make your extension available in certain regions. ### How do I localize my listing in the store? {: #faq-gen-19 } -There are two points where you need to localize your app for listing in a region that isn't your +There are two points where you need to localize your extension for listing in a region that isn't your home market. -1. Your app package. See [Internationalizing Your App][118] for information on localizing your - app's presence inside Chrome. +1. Your extension package. See [Internationalizing Your App][118] for information on localizing your + extension's presence inside Chrome. 2. Your detailed listing. The developer dashboard now includes the ability for you to select all the regions that you want your application to appear in, allows you to localize the detailed description, price points relative to the market you are in, and screenshots. ### How do I localize my detailed description? {: #faq-gen-20 } -You first need to [internationalize][119] your app and specify a "default_locale" attribute in your -manifest. Once you upload your internationalized app, a selection box will appear at the top of your -app listing, allowing you to switch between languages that you support and change the detailed +You first need to [internationalize][119] your extension and specify a "default_locale" attribute in your +manifest. Once you upload your internationalized extension, a selection box will appear at the top of your +extension listing, allowing you to switch between languages that you support and change the detailed description. ### How do I show different screenshot images per region? {: #faq-gen-21 } -Visit your app page in the [Chrome Web Store Developer Dashboard][120], change the currently +Visit your extension page in the [Chrome Web Store Developer Dashboard][120], change the currently selected language to your desired choice (for example "en-GB") and upload a screenshot as normal. Once the image is uploaded you will be presented with an option to "Show this item in **all** locales" or "Show this item **only** in the 'en-GB' locale". Select the later to show the screenshot @@ -307,31 +295,26 @@ For more information about the developer program policies, see: If your item's status says "pending review" for more than three weeks, you should [contact support][124]. -### Why isn't my app showing up on search? {: #faq-listing-09 } +### Why isn't my extension showing up on search? {: #faq-listing-09 } It depends. There are several reasons why your item may not be showing up in search. -- You just published your app. It might take a few hours before we index it. -- Your app manifest is version 1. We have upgraded to manifest version 2, therefore all manifest v1 - apps are unlisted. Please upgrade your item to manifest v2. See more details [here][125]. -- Your app contains an NPAPI. All apps containing NPAPI are now unlisted. For more details around - our NPAPI deprecation timelines, see our blog post [here][126]. -- Your app is a Google Application Marketplace app. All Google Application Marketplace apps will - only be visible on the corresponding management page for Google Application Marketplace, not on - chrome.google.com/webstore. -- Your app is not listed in the region you are searching in. See more details [here][127]. +- You just published your extension. It might take a few hours before we index it. +- Your extension manifest is out of date. Upgrade your item to a current valid manifest version as + described [here][125]. +- Your extension is not listed in the region you are searching in. See more details [here][127]. -### My app has been removed from the Chrome Web Store. What should I do? {: #faq-listing-10 } +### My extension has been removed from the Chrome Web Store. What should I do? {: #faq-listing-10 } Application removals count as strikes against the good standing of your developer account. Multiple or egregious policy violations may result in termination of your developer account. -- For all policy violation app removals, you will receive a removal notification email with more - details in the developer account listed as the owner of the app. Please make the appropriate - changes so your app complies with all [Developer Program Policies][128], [Branding +- For all policy violation extension removals, you will receive a removal notification email with more + details in the developer account listed as the owner of the extension. Please make the appropriate + changes so your extension complies with all [Developer Program Policies][128], [Branding Guidelines][129] and [Terms of Services][130]. Once you have remedied the violation you can resubmit via your developer dashboard. -- Please do not re-publish a removed application until the policy violation has been remedied. If +- Please do not re-publish a removed extension until the policy violation has been remedied. If you have additional questions or feel your item was wrongly removed, you can reply directly to the removal email and appeal. - If you believe your developer account was wrongly terminated, you can appeal [here][131]. We will @@ -345,203 +328,6 @@ address in Play and CWS. If there is an exact match, the "Available for Android" automatically show up on your item detail page the next time the script runs. At this point, there is no way to enter the information into your listing. -## Installable web apps - -### What is the difference between packaged apps and hosted apps? {: #faq-app-01 } - -Hosted apps operate as traditional web apps (served via web servers and running inside of web -browsers) and do not have access to the extended Chrome APIs that extensions can use. Packaged apps -are bundled into the `.crx` file and can use the extensions APIs. - -### Can I sell a packaged app? {: #faq-app-02 } - -Yes, but there are risks in doing so. Specifically, it is easy for motivated people to bypass -payments for packaged apps. This holds true even if you have used our Licensing API in your locally -stored packaged app, since locally stored content is not secure and can be modified (including calls -to the Licensing API). If you'd like to have the option of blocking access to your app by -unauthorized users, selling a packaged app may not be the right solution for you. An alternative to -consider is moving to a hosted app model with a server-side licensing check. - -### Why do you allow developers the option of paid packaged apps? {: #faq-app-02.5 } - -There are good reasons to offer a paid packaged app, even with the [limitations explained -above][142]. Packaged apps let you easily provide functionality to your users without the overhead -of managing a hosted service. Charging for a packaged app is a quick and simple way to enable a -low-friction transaction if the app provides clear user value. However, it is up to the developer to -decide which solution is right for them. - -### Can installable web apps have page actions? {: #faq-app-03 } - -No. Although packaged apps get most of the functionality of extensions, they can't have page -actions. - -### Can installable web apps have browser actions? {: #faq-app-04 } - -No. Although packaged apps get most of the functionality of extensions, they can't have browser -actions. - -### Can I use Google AdSense in my Chrome product? {: #faq-app-05 } - -According to the Google AdSense [program policies][143], Chrome-integrated websites ('hosted apps') -may use AdSense; Chrome apps ('packaged apps'), extensions, and themes may not. - -### Can I use Google Analytics? {: #faq-app-06 } - -Yes. Packaged apps and extensions can use the [Chrome Platform Analytics][144] library. Hosted apps -can use one of the Google Analytics libraries for standard websites (e.g., [analytics.js][145]). - -### What is the size limit for apps in the store? {: #faq-app-07 } - -The `.crx` file is currently limited to 2GB. - -### Do installable web apps run from the desktop, installed as separate apps, or otherwise operate independently of the browser? {: #faq-app-10 } - -No, Chrome Web Store apps are just web apps written with traditional web technologies, and are run -via the browser. - -### What is actually installed by an installable web app? {: #faq-app-11 } - -Only the `.crx` package is actually installed into the browser; any contents not bundled into the -`.crx` package will continue to be served by web servers. Installable web apps are not installed -into the base operating system, desktop, or outside of the browser. - -### Do Chrome Web Store apps work in browsers other than Chrome? {: #faq-app-12 } - -Hosted apps are built with standard and common web technologies, and depending on the features you -choose, will work in most or all browsers. The `.crx` package information you create to list the app -in the store will not work with other browsers, but users do not need the `.crx` package to access a -hosted web app in other browsers. (They can always directly access the app.) Packaged apps, because -they are packaged in `.crx` files and might access the Google Chrome Extension APIs, will not work -in other browsers. - -### Will users of other browsers be able to install apps directly from the Chrome Web Store? {: #faq-app-13 } - -Not at this point. However, they will be able to access your app via directly typing in the URL, -launching bookmarks, and discovering your app via search engines. We hope that some form of -installable web apps is a concept that appeals to other browsers and will eventually be a -cross-browser feature. - -### Do installable web apps work on different operating systems? {: #faq-app-14 } - -Yes. They are just web apps, and are typically written with web technologies like HTML, CSS, and -JavaScript. - -### How do I store my content for offline access? {: #faq-app-15 } - -This answer to this depends on the type of content and the storage requirements. - -- For a packaged app or extension, you can put all HTML, CSS, JavaScript, images, and other assets - into your `.crx` file. This embeds everything you need into the installable `.crx` file. This - bundling might be good for apps with content that rarely changes, such as ebooks. Chrome provides - an update mechanism to automatically deliver your updates to your users. -- The [App Cache][146], an HTML5 feature, is a good way to locally cache resources such as HTML, - CSS, and JavaScript. These resources aren't included in the `.crx` file, but are downloaded the - first time the app is accessed. They are not downloaded again until the App Cache file itself is - changed. The App Cache is good for enabling fast startup, while retaining control over asset - versioning. -- Local Storage, another HTML5 feature, is a key/value storage system that can store strings. Local - Storage is often used in place of some cookies, and it lives longer than the session. There is no - way, however, to send a populated Local Storage database on application install or load. You will - need to populate the Local Storage programmatically. -- WebSQL DB is a full SQL database embedded in the Chrome browser. While stalled in the standards - process, this is a very powerful way to store highly structured data. Again, there is no way to - send a populated database on application install or load, so you will have to programmatically - populate the database. Also, this database can only store text, but you can use the data URI - scheme to store binary data. -- In the future, the [File APIs][147] will be a useful addition to this array of offline storage - options, as they allow your web app to read and write files to a locally managed file store. These - APIs are not fully supported by Chrome, but follow the [Google Chrome Releases blog][148] to stay - up to date. - -For more details, read [a more detailed article on HTML5 offline options][149]. - -### What makes a good web app? {: #faq-app-16 } - -While this is a subjective question, we have some notes in the article [Thinking in Web Apps][150]. -Briefly, and generally speaking, apps that are Big Screen, have a Rich Experience, are Good At One -Thing, are Visually Appealing, and are Fast will be web apps that people love to use. - -### What is the screen resolution for Chrome Web Store apps? {: #faq-app-17 } - -Typical screen resolutions are 1024x768 and 1280x1024, but because users are free to resize their -browser windows, we recommend fluid, full screen layouts that resize gracefully down to 1024x768 -(but then should scale up to very large, as well). Consider using Google Analytics to see what the -most common screen resolutions are for your app's users. - -### Do apps run in full screen? {: #faq-app-18 } - -Apps can run in full screen mode using the [Fullscreen API][151]. See this [HTML5Rocks update][152] -for more information on using this API in your application. - -### Will apps work on Android? {: #faq-app-19 } - -If your app is pure HTML, CSS3, and JavaScript and is hosted on your servers there is a good chance -that it will work in the browser on Android. However, `.crx` files (including packaged apps) are not -supported on Android. Users cannot install their apps onto the Android browser, but they can most -likely use those apps by directly accessing the app's URL. - -### Will apps work on Google TV? {: #faq-app-20 } - -Google TV runs the Chrome browser, so it should be able to run your hosted web app. Installing apps -directly from Chrome Web Store will not be available on Google TV at launch however. Users may -directly type the URL for your hosted app, or use traditional search to find and start your app. - -### What can I do to protect the content of my web app? {: #faq-app-21 } - -You can determine if a user has paid for access to your app by using the Chrome Web Store Licensing -API. If the user hasn't bought the app you deny access to that resource. Ultimately, Chrome Web -Store apps are just web apps, so the same considerations for content protection must be taken into -account. - -### What happens when a user clicks an external link in my app? {: #faq-app-22 } - -The same thing as if they clicked a link that's internal to your app: the browser follows the link, -using the current tab. - -### How should my app handle the back button? {: #faq-app-23 } - -As with all web apps, you cannot rely on the back button always being present. Users might hide -them, screen readers might not use them correctly, and so on. You should design your app to -correctly support both back buttons and application-defined navigation. - -### How can I detect whether my app is running as an installed web app and via the Chrome app launcher (and not just via a bookmark or link)? {: #faq-app-24 } - -Use JavaScript to check whether `window.chrome.app.isInstalled` is defined. If it is, the app is -running from the Chrome app launcher. Here's an example of the code you'd use: - -```js -if (window.chrome.app.isInstalled) { - // You're running as an installed app, via the app launcher! - } else { - // You're running via a bookmark/link. -} -``` - -### My app is available in multiple regions. Can I list it in different categories for each region? {: #faq-app-25 } - -No, the categories will be consistent across regions. If you list in one category, you will be -listed in that category in all regions. - -## Extensions - -### Can I sell extensions in the store? {: #faq-extensions-01 } - -Yes! You can sell your Chrome Extension using [one-time payments][153]. - -### Can I use the Licensing API with extensions? {: #faq-extensions-02 } - -Yes, see the section on [verifying payment and offering free trial][154] . - -## Themes - -### Can I sell themes in the store? {: #faq-themes-01 } - -Yes! You can sell your Chrome Theme using [one-time payments][156]. - -### Can I use the Licensing API with themes? {: #faq-themes-02 } - -No, themes have no code or server-side components. - ## Additional Troubleshooting If you've fixed all errors produced by the tools and continue experiencing issues, please [contact @@ -671,7 +457,7 @@ Business related issues by contacting CWS support. [122]: https://www.google.com/about/company/unwanted-software-policy.html [123]: /docs/webstore/program_policies [124]: https://support.google.com/chrome_webstore/contact/developer_support/?hl=en -[125]: /docs/extensions/mv2/manifestVersion +[125]: /docs/extensions/mv3/manifestVersion [126]: http://blog.chromium.org/2013/09/saying-goodbye-to-our-old-friend-npapi.html [127]: https://support.google.com/chrome_webstore/answer/1254182?hl=en&ref_topic=1734051 [128]: /docs/webstore/program_policies diff --git a/site/en/docs/webstore/get_started/index.md b/site/en/docs/webstore/get_started/index.md deleted file mode 100644 index 004d63eb519d..000000000000 --- a/site/en/docs/webstore/get_started/index.md +++ /dev/null @@ -1,398 +0,0 @@ ---- -layout: 'layouts/doc-post.njk' -title: "Tutorial: Licensing API" -date: 2017-08-30 -description: > - How to create an app that uses the Chrome Web Store Licensing API. ---- - -This tutorial walks you through creating an app that uses the Chrome Web Store Licensing API. You -have many choices when implementing an app for the Chrome Web Store, but this tutorial features a -common use case: a hosted app that's implemented in Java, with the help of Google App Engine and the -Eclipse IDE. - -You should be able to follow this tutorial even if you've never used Java, Google App Engine, or -Eclipse. You'll get more out of this tutorial if you read the [Overview][1] first. - -{% Aside %} -You only need to use the Licensing API if you use Chrome Web Store Payments. For -information on other payment options, see [Charging for your app][2] in the Overview. -{% endAside %} - -## Step 1: Get ready - -Before you start, make sure you're using the Dev channel version of Google Chrome, and learn how to -find the Chrome Developer Dashboard. - -1. Subscribe to the Dev channel by following the instructions in [Early Access Release - Channels][3]. -2. Find the Chrome Developer Dashboard. Until the Chrome Web Store is public, you can get to the - dashboard from the Extensions Gallery. - - 1. Go to the extensions management page, either by entering **chrome://extensions** in the - address bar or by choosing the **Tools > Extensions** menu item from the wrench menu. (On - the Mac, go to the **Window** menu and choose **Tools**.) - 2. Go to the Extensions Gallery by clicking the **Get more extensions** or **browse the - gallery** link on the extensions management page. - 3. On the left side, look for the **Publish your extensions** link. At the bottom of the page, - look for the **Developer Dashboard** link. Clicking either one takes you to the dashboard. - -## Step 2: Upload app info to the dashboard - -Before you can write code that uses the Licensing API, you need to upload your app with the Chrome -Developer Dashboard. In this step, you'll create and upload a ZIP file containing the first draft of -a manifest for your app. - -1. Create a directory to contain your app's manifest and, eventually, icons. -2. In this directory, create a file named `manifest.json` and copy the following code into it: - - ```json - { - "name": "Hello License!", - "description": "Try this awesome app", - "version": "0.0.0.1", - "app": { - "urls": [ - "*://example.com/" - ], - "launch": { - "web_url": "http://example.com/mine/" - } - } - } - ``` - - {% Aside %} - This manifest uses dummy data because you can always change it later. The important - thing, for now, is to have correct formatting. For information about what the manifest for a - hosted app should really contain, see [Hosted Apps][5]. - {% endAside %} - -3. Create a ZIP archive of the directory that contains `manifest.json`. -4. Upload the ZIP file to the Chrome Developer Dashboard. - - 1. Go to the Chrome Developer Dashboard and sign in. - 2. Click the **Add new item** button. - If you've never uploaded an item before, you need to accept the developer agreement before - going on. - 3. Click **Choose file**, navigate to your ZIP file, and click **Upload**. - - Within seconds you should see an edit page for your app. At the top, you'll see a warning that - you must verify ownership for example.com. Ignore it. You can update the manifest and verify - ownership of your site later. - -5. At the bottom of the edit page, click **Save draft and return to dashboard**. You'll return to - the Chrome Developer Dashboard, which lists installable web apps, extensions, and themes that - you've uploaded. -6. Go back to the edit page by clicking the **Edit** link for your app. -7. Get the app ID by inspecting the page's URL. - The URL in the browser's address bar should look something like this: - - ```text - https://chrome.google.com/extensions/developer/edit/abcdefghijklmnopqrstuvwxyzabcdef - ``` - - That long string of gibberish—abcdefghijklmnopqrstuvwxyzabcdef, in this example—is your app's - ID. Save it, so you can use it in your code. - -## Step 3: Get the OAuth token - -In this step, you get the OAuth access token and access token secret that allow you to use the -Licensing API. To get these, you first need to tell the store that your app will use Chrome Web -Store Payments. - -1. In the edit page for your app, click the **Change pricing** button. -2. Choose **This application uses Chrome Web Store Payments**, and save. -3. Return to the Chrome Developer Dashboard, and click the **OAuth setup** link for your app. - - {% Aside %} - The OAuth setup link appears _only_ if you've set the pricing of your app to use - Chrome Web Store Payments. - {% endAside %} - - A page comes up with information about the Licensing API and its use of OAuth. - -4. Click the **Generate new token** button at the bottom of the OAuth page. - - {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/WAH6o7pV8RwTgYb1NDrN.png", - alt="A screenshot showing the bottom of the OAuth page before generating the new token", - height="66", width="456" %} - -5. Save the values that appear next to **oauth_token_secret** and **oauth_token**. - - {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/ShWIu4C7l4ZTcu1P2Fgy.png", - alt="A screenshot showing the generated token and secret at bottom of the OAuth page", - height="58", width="456" %} - -{% Aside 'caution' %} -Keep your access token and token secret safe and private. (The screenshot shows -sample values that won't work.) If you lose the token or secret, you'll need to generate them again. -{% endAside %} - -## Step 4: Set up your development environment - -Now that you have the IDs and tokens you need, it's time to code. But first, you need to set up your -development environment. - -{% Aside %} -This tutorial uses Google App Engine, but you can use whatever technologies you like when -you create your own apps. -{% endAside %} - -1. Sign into [Google App Engine][8], and create an application with the following information: - - - Identifier: Any unique identifier that makes sense to you. This identifier is used in the - default app location; for example, choosing "hellolicense" results in a default app location - of [http://hellolicense.appspot.com][9] - - Title: Hello License! - - Authentication Options: Click the **Edit** link, and choose **Open to all users with an OpenID - Provider**. - - Note: If you've never used Google App Engine before, it will make you verify your account before - you create an application. - -2. Install the [Google App Engine SDK for Java][10]. -3. Install the [Eclipse IDE for Java Developers][11]. -4. Install the [Google Plugin for Eclipse][12]. - -For details see the [Google App Engine documentation][13], in particular [Getting Started: -Java][14]. - -## Step 5: Create your app - -In this step, you'll write your web app's code, using the Eclipse IDE as your development -environment. - -1. In Eclipse, create a new web app project: **File > New > Web Application Project**. Name your - project **HelloLicense**, set the package name to **com.example**, and uncheck the Google Web - Toolkit option. Then click **Finish**. -2. Get the following two JAR files, which are required by [OAuth Signpost][16], the OAuth library - that this example uses to sign requests to the license server. - - * `signpost-core-1.2.1.1.jar`: Download this file from - [http://code.google.com/p/oauth-signpost/downloads/list][17]. - - * `commons-codec-1.4.jar`: Download `commons-codec-1.4-bin.tar.gz` or `commons-codec-1.4-bin.zip` from - [http://commons.apache.org/codec/download_codec.cgi][18], extract the files, and get - `commons-codec-1.4.jar` from the top directory. - - Put these two JAR files in your Eclipse project's `war/WEB-INF/lib` directory. - -3. Now tell Eclipse about those JAR files. - - 1. In Eclipse, refresh the display of your project. You can do this by opening a context menu - in your project (such as by right-clicking your project's name in the Package Explorer) and - choosing **Refresh**. - 2. Get to the Properties panel for your app. You can do this by opening a context menu again - and choosing **Properties**. - 3. Go to the **Java Build Path** property list, choose the **Libraries** tab, and then click - **Add JARs**. - 4. Navigate to the directory you just put the JAR files in, select the JAR files, and click - **OK**. - -4. Copy the sample code to your main servlet. - - 1. In the Project Explorer, go to **HelloLicense > src > com.example**, and double-click - **HelloLicenseServlet.java**. - 2. Replace the contents of **HelloLicenseServlet.java** with the contents of [this file][19]. - - The code you paste in uses the Licensing API to check whether the user has access to this app. - For code snippets and instructions on using the Licensing API, see [Checking for Payment][20]. - -5. In the code you just pasted in, fill in the APP_ID, TOKEN, and TOKEN_SECRET constants with the - values you got in Steps 2 and 3. These constants are necessary for using the Licensing API. For - example: - - ```java - public static final String APP_ID = "abcdefghijklmnopqrstuvwxyzabcdef"; - private static final String TOKEN = "1/knWSSAiX_-4o8abb-uSFk2_DaSrnpx9Y2udck-OuA7A"; - private static final String TOKEN_SECRET = "t8KgYCxRv+0jNVY7DdrBQvto"; - ``` - -6. Take a look at the code in **HelloLicenseServlet.java**: - - - The following lines get the OpenID URL for the user's Google Account, as described in - [Identifying the User][21]. If you don't use Google App Engine, then instead of using - UserService, you need to use an OpenID library and the Google OpenID endpoint. - - ```java - UserService userService = UserServiceFactory.getUserService(); - ... - if (userService.isUserLoggedIn()) { - User user = userService.getCurrentUser(); - /* user.getFederatedIdentity() is the OpenID URL. */ - } - ``` - - - The following code creates, signs, and sends a request to the license server, using the [OAuth - Signpost library][22] and the standard [URLConnection][23] class. The Licensing API URI in the - request has the form https://www.googleapis.com/chromewebstore/v1/licenses/_appId_/_userId_. - To sign the request, the OAuth library needs the app's access token and token secret, as well - as the consumer key and secret (both "anonymous"). - - ```java - public static final String SERVER_URL = - "https://www.googleapis.com/chromewebstore/v1/licenses/%s/%s"; - public static final String CONSUMER_KEY = "anonymous"; - public static final String CONSUMER_SECRET = CONSUMER_KEY; - ... - OAuthConsumer oauth = new DefaultOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); - oauth.setTokenWithSecret(TOKEN, TOKEN_SECRET); - URLConnection http = - new URL( - String.format( - SERVER_URL, - APP_ID, - URLEncoder.encode(user.getFederatedIdentity(), "UTF-8") - ) - ).openConnection(); - oauth.sign(http); - http.connect(); - ``` - - - The response from the license server is in JSON format, by default. The following code uses - the `JSONObject.get` method to parse the response to figure out whether the user should have - access to the app. If the "result" field value is "YES", then the user has either full or free - trial access, depending on the value of the "accessLevel" field. - - ```java - JSONObject json = new JSONObject(file); - output.printf( - "Hello %s license!", - "YES".equals(json.get("result")) ? - "FULL".equals(json.get("accessLevel")) ? "full" : "free trial" : - "no" - ); - ``` - - {% Aside %} - Until users can buy apps, the value of the "result" field will always be "NO" unless - you use a [special test user ID][24]. - {% endAside %} - -For more information about using the Licensing API, see [Checking for Payment][25]. - -## Step 6: Test and deploy your app - -In this step, you'll make sure your app works, and you'll deploy it to the web. - -1. Still in Eclipse, choose **Run > Run As > Web Application**. - If it doesn't run, make sure you followed these instructions exactly, and try again. If it does - run, you'll see the server location in the Eclipse Console. -2. In a browser, visit the server location (for example, http://localhost:8888/) and click the link - to **HelloLicense**. - You should see a simple page with a **Sign in** link. -3. Sign in as text@example.com. - If you get an error page, then make sure you entered the app ID, OAuth access token, and access - token secret correctly. - - {% Aside %} - Currently, there's no way to pay, so you'll always be told that the user doesn't have - access. However, in this developer release, you can modify the user ID that you supply so that - you get a different answer. For details, see [Special user IDs for testing][27]. - {% endAside %} - -4. Once you successfully run your app locally, deploy it: - - 1. Click the App Engine deploy button on the toolbar: - {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/GgDrbzu3jMJ4Pa8Rv7D3.png", alt="The deply button", height="22", width="22" %} - A Deploy dialog comes up. - 2. Set the identifier to be used for Google App Engine. This is different from the Google - Chrome app ID; it's the string you chose in [Step 4][28]. To set it, click the **App Engine - project settings** link in the Deploy dialog, and then set the **Application ID** field to - the string from Step 4—for example, "hellolicense". - 3. Click the **Deploy** button. - The Eclipse Console displays the status of the upload. - -5. When your app is deployed, visit its new location under http://_identifier_.appspot.com. For an - example, the app with the identifier "hellolicense" is at - [http://hellolicense.appspot.com/hellolicense][29]. - -## Step 7: Install your app into Google Chrome - -Once your website is up and running, you can update the manifest and test installing the app in -Google Chrome. This section won't lead you through that process in detail, but here's a manifest for -the Hello License app that's served at http://hellolicense.appspot.com/hellolicense: - -```json -{ - "name": "Hello License!", - "description": "Try this awesome app", - "version": "0.0.0.2", - "app": { - "urls": [ - "*://hellolicense.appspot.com/" - ], - "launch": { - "web_url": "http://hellolicense.appspot.com/hellolicense" - } - }, - "icons": { - "24": "icon_24.png", - "128": "icon_128.png" - } -} -``` - -Note that you need to add icons to the manifest and ZIP file, so that your app can be installed. -Once you install this app, the large icon appears in the New Tab page. Clicking the icon takes you -to http://hellolicense.appspot.com/hellolicense. - -For details on manifest contents and on installing an app that isn't yet packaged in a `.crx` file, -see [Hosted Apps][31]. - -## Step 8: Finish your app's listing - -Use the edit page to add all the store listing information that isn't in the ZIP file, such as a -long description, screenshots, videos, and links to related sites. You can preview what users will -see for your app by clicking the **Preview changes** button at the bottom of the edit page. - -For details on finishing and publishing an app, see [Publishing Your App][33]. - -## What next? - -Here are some choices for where to go next: - -* [Overview][35]: Get the conceptual background you need to use the Chrome Web Store well. -* [Checking for Payment][36]: Learn how to use the Licensing API to check whether the user has paid for your app. -* [Samples][37]: Find samples in multiple languages of hosted apps that use the Licensing API. - -If you just want to write your app, see the developer doc for the type of app you're interested in: - -- [Installable Web Apps][38] -- [Themes][39] -- [Extensions][40] - -[1]: /docs/webstore/ -[2]: /docs/webstore/#charging -[3]: http://www.chromium.org/getting-involved/dev-channel -[5]: https://developers.google.com/chrome/apps/docs/developers_guide -[8]: https://appengine.google.com/ -[9]: http://hellolicense.appspot.com -[10]: https://developers.google.com/appengine/downloads#Google_App_Engine_SDK_for_Java -[11]: http://www.eclipse.org/downloads/ -[12]: https://developers.google.com/eclipse/docs/download -[13]: https://developers.google.com/appengine/docs/ -[14]: https://developers.google.com/appengine/docs/java/gettingstarted/ -[16]: http://code.google.com/p/oauth-signpost/ -[17]: http://code.google.com/p/oauth-signpost/downloads/list -[18]: http://commons.apache.org/codec/download_codec.cgi -[19]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-java/HelloLicenseServlet.java -[20]: /docs/webstore/check_for_payment -[21]: /docs/webstore/identify_user -[22]: http://code.google.com/p/oauth-signpost/ -[23]: http://download-llnw.oracle.com/javase/6/docs/api/java/net/URLConnection.html -[24]: /docs/webstore/check_for_payment#testids-user -[25]: /docs/webstore/check_for_payment -[27]: /docs/webstore/check_for_payment#testids-user -[28]: #prepare -[29]: http://hellolicense.appspot.com/hellolicense -[31]: https://developers.google.com/chrome/apps/docs/developers_guide -[33]: /docs/webstore/publish -[35]: /docs/webstore/ -[36]: /docs/webstore/check_for_payment -[37]: /docs/webstore/samples -[38]: https://developers.google.com/chrome/apps/ -[39]: http://code.google.com/chrome/extensions/themes.html -[40]: http://code.google.com/chrome/extensions/index.html diff --git a/site/en/docs/webstore/get_started_simple/index.md b/site/en/docs/webstore/get_started_simple/index.md deleted file mode 100644 index 356a98b1534f..000000000000 --- a/site/en/docs/webstore/get_started_simple/index.md +++ /dev/null @@ -1,337 +0,0 @@ ---- -layout: 'layouts/doc-post.njk' -title: "Tutorial: Getting Started" -date: 2017-08-30 -description: > - How to add an existing web app to the Chrome Web Store. ---- - -Got a web app? Follow this tutorial to add your existing web app to the Chrome Web Store. - -If you don't already have a web app, you can still follow this tutorial with any other website you -own. Any website can be an installable web app, although the site should follow a few [design -principles][1]. - -{% Aside %} -If you're interested in developing a [Chrome Extension][2] or [Chrome App][3] instead of a -web app, follow the [extension tutorial][4] or the [Chrome App tutorial][5]. Then return to this -page, and start at [Step 5: Zip up your app][6]. -{% endAside %} - -## Step 1: Get ready - -Before you start, choose your web app and make sure that you can verify your ownership of its site. -Also, note the location of the [Chrome Web Store Developer Dashboard][7]. - -1. Choose the web app that you want to publish, making a note of its homepage URL and any other - URLs that it includes. - - Don't have a web app? For the purposes of this tutorial, you can [create a blog][8] on Blogger - and treat it like an app. Why Blogger? Because it automatically registers you as the owner of - the blog's subdomain, which makes publishing your app a bit easier. - -2. Make sure that you'll be able to prove ownership of the site that hosts your web app. (Don't - worry about this if you created a Blogger blog; you already own it.) For information about - claiming ownership, see the Google Webmaster Tools help article [Adding a site][9]. - - {% Aside %} - You can wait to actually verify ownership until just before you publish the app. - {% endAside %} - -3. Bookmark the [Chrome Web Store Developer Dashboard][10]. - -## Step 2: Create a manifest file - -Every app needs a manifest—a JSON-formatted file named `manifest.json` that describes the app. - -1. Create a directory called `myapp` to contain your app's manifest. - - {% Aside %} - You can use a different directory name, if you like. The only name that can't change - is `manifest.json`. - {% endAside %} - -2. In this new directory, create a text file named `manifest.json` and copy the following code into - it, changing the italicized text to reflect your app: - - ```json - { - "name": "Great App Name", - "description": "Pithy description (132 characters or less, no HTML)", - "version": "0.0.0.1", - "manifest_version": 2, - "icons": { - "128": "icon_128.png" - }, - "app": { - "urls": [ - "http://mysubdomain.example.com/" - ], - "launch": { - "web_url": "http://mysubdomain.example.com/" - } - } - } - ``` - -All new apps must specify manifest version 2 without quotes (see [manifest version -documentation][12]). The remaining fields are fairly straightforward, except for `"urls"` and -`"web_url"`. In this example, those fields have the same values but mean different things. - -* `"web_url"`: Specifies the page that the browser shows when a user launches the app. -* `"urls"`: Specifies the starting URLs of all other web pages that are in the app. In this example, both - http://mysubdomain.example.com/page1.html and - http://mysubdomain.example.com/subdir/page2.html would be in the app. You don't need to - specify the URLs for included files or for assets such as images. Currently, the domain name must be - followed by at least one character ("/"). - -{% Aside %} -If your app has only one page, you can omit the "urls" field. -{% endAside %} - -For more information about what the manifest for a hosted app can contain, see [Hosted Apps][13]. - -## Step 3: Get images - -Your app needs an icon, plus at least one screenshot and one promotional image. The icon is used in -the New Tab page and may also be used in the store; the screenshot is used in the store's listing -for your app; the promotional image is used on the store's main page and in other places where the -store presents multiple apps. - -1. Create or find an icon that follows the guidelines in the [App icon][15] section of Supplying - Images. -2. Put the icon in the `myapp` directory, with the name `icon_128.png`. -3. Take at least one screenshot of your app, following the guidelines in the [Screenshots][16] - section of Supplying Images. -4. Edit each screenshot to be 1280x800 or 640x400 pixels. Larger screenshots look better on - high-resolution displays. -5. Create at least one promotional image. It must be 440x280 and follow the guidelines in the - [Promotional images][17] section of Supplying Images. You can also provide 920x680 and 1400x560 - promotional images. - - {% Aside %} - Promotional images are the main way that people will notice your app. Make them pretty - and informative! - {% endAside %} - -{% Aside %} -If you don't have an icon yet, you can continue with this tutorial by temporarily removing -the following lines from the `manifest.json` file: `"icons": { "128": "_icon_128.png_" },` -{% endAside %} - - - -## Step 4: Verify that the app works - -In this step, you'll load the unpacked app into the browser, so you can confirm that the app is -valid. - -1. Bring up the extensions management page: chrome://extensions. -2. If **Developer mode** has a + by it, click the +. - The + changes to a -, and more buttons and information appear. -3. Click the **Load unpacked extension** button. - A file dialog appears. -4. In the file dialog, choose the `myapp` directory. - Unless you get an error dialog, you've now installed the app. - - {% Aside %} - If you get an error dialog saying you could not load the extension, make sure your - manifest file has valid JSON formatting and is called `manifest.json` (not `manifest.json.txt` - or `manifest.json.rtf`, for example). You can use a [JSON validator][19] to make sure your - manifest's format is valid. Often, formatting issues are related to commas (`,`) and quotation - marks (`"`)—either too many or not enough. For example, the last entry in the manifest should - not have a comma after it. - {% endAside %} - -5. Create a new tab. - The icon for the newly installed app appears in Google Chrome's launcher on the New Tab page. If - the Apps area is minimized, then instead of the icon you specified, you should see the website - favicon. -6. Click the icon for the app. - You've now launched the app. You should see its website in your browser window. If you don't, - try changing the value of "web_url" in the manifest, reload the app, and click its icon again. - -## Step 5: Zip up your app - -Create a ZIP archive of the directory that contains `manifest.json` and the icon. On Windows, you -can do this by right-clicking `myapp` and choosing the menu item **Send to > Compressed (zipped) -folder**. On Mac OS X, control-click `myapp` and choose **Compress "myapp"**. - -If you like to use the command line, you might enter this: - -```text -zip -r myapp.zip myapp -``` - -{% Aside %} -If your app is an extension or a packaged app that uses Native Client, you can structure -your application directory hierarchy and ZIP file in a way that reduces the size of the user -download package. For details, see [Reducing the size of the user download package][21]. -{% endAside %} - -## Step 6: Upload your app - -In this step, you upload the ZIP file that you created in Step 5. - -1. Decide which Google Account is your **developer account**—the account that you'll use to verify - ownership and publish your app. Instead of using your personal Gmail account, you might want to - create a dedicated account for your apps. For details, see [Choose a developer account][23] in - Publishing Your App. - - {% Aside %} - If you created a blog, choose the account that you used to create that blog. - {% endAside %} - -2. Go to the [Chrome Web Store Developer Dashboard][24], and sign into your developer account. - - {% Aside %} - If you don't have a developer account, then when you try and access the dashboard you'll be - asked to [register as a Chrome Web Store developer][25] now and pay a one-time fee. If you - already have a developer account, but have never paid the one-time fee, you'll see the same - retistration page and will need to pay the one-time fee now. - {% endAside %} - - Once you sign in, you'll see a list of any installable web apps, extensions, and themes that - you've already uploaded. - -3. Click the **Add new item** button in the dashboard. - If you've never uploaded an installable web app, extension, or theme before, you need to accept - the developer agreement before going on. -4. Click **Choose file**, choose the ZIP file you created in Step 5, and click **Upload**. - If you see an error message, fix the error, zip up the directory again, and upload the ZIP file. - -Within seconds you should see the Edit page for your app. At the top, you might see a warning that -you must verify ownership for whatever sites you specified in the "urls" and "web_url" fields. That -warning has a link that takes you to Google Webmaster Tools, where you can verify ownership at any -time before you publish the app. - -## Step 7: Fill out the form, and upload images - -In this step, you use the dashboard's Edit page to provide information for the store's listing of -your app. - -1. In the **Detailed description** section, enter text that describes your app. -2. In the **Icon** section, upload the same 128x128 icon that you put into the ZIP file. -3. In the **Screenshots** section, upload at least one screenshot of the app (1280x800 or 640x400). - Four or five would be better. -4. In the **Promotional images** section, upload your promotional images (you must upload at least - the 440x280 image). -5. Under the **Verified website** section, select the website for which the app is an "official - item". The drop-down lists only the domains for which you're the verified owner. -6. In the **Categories** section, select at least one category for your app. For more information, - see [Choose your app's category well][27] in Best Practices. -7. If you want to charge for your app, specify the price and the payment system in the **Pricing - and Payments** section. You can use the built-in Chrome Web Store Payments system if you are in - a [supported region][28]. For more information about payment options, see [Monetizing Your - App][29]. -8. At the bottom of the edit page, click **Save draft and return to dashboard**. - -{% Aside %} -If you are already hosting your app in Google Play, and you want your Chrome Web Store app -listing to show an "Available for Android" link, your app must have the same name as your Google -Play listing and both apps must be owned by the same developer account. To have your CWS item -transferred to a different developer account, you must submit this [form][30]. -{% endAside %} - -## Step 8: Preview and improve your app's listing - -Now you get to see what your app's listing in the store will look like. - -1. In the [dashboard][32], click your app's "Edit" link to return to its Edit page. -2. At the bottom of the Edit page, click **Preview changes**. You should see a page that looks - something like this: - - {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/DnAipknPku2gPKNyqXpG.png", - alt="a screenshot of the store listing", height="328", width="550" %} - - {% Aside %} - If you haven't provided a screenshot yet, your page will have a big blank space at the - upper left. - {% endAside %} - -3. Make sure that the images and text look good and that any links you provide are valid. If you - refer to Google brands, follow the [Branding Guidelines][33]. -4. At the top of the page, click the "Edit" link to return to the Edit page. -5. After making any improvements you'd like, click **Save draft and return to dashboard**. - -{% Aside %} -Before finalizing your app's listing, think about how users are going to find your app, -and make sure the detailed description includes the terms they're likely to search for. Check out -listings for similar apps to get ideas for how you should present your app. -{% endAside %} - -## Step 9: Test, deploy, publish, improve, repeat - -1. Test your app to make sure its users will have a good experience with it. If your app uses - features such as geolocation or notifications that require user consent, consider adding a - permissions field to the [manifest][35]. -2. If you don't already have a support site, create one. Providing a link to a support site in your - app's listing gives users an alternative to using the User reviews section as a way of reporting - issues. -3. Once your app and the sites it depends on are ready, deploy the app to the web (if it isn't - already public). -4. In the [Chrome Web Store Developer Dashboard][36], click the "Publish" link to publish your - app's listing in the Chrome Web Store. - - When you publish your app, its listing becomes visible to you and to anyone who has access to - the Chrome Web Store. People can buy your app (if you charge) and install it. When they install - your app, they download a `.crx` file that contains everything you uploaded in the ZIP file. - -5. After you publish your app, whenever you want to change your app's listing or `.crx` file, use - the dashboard to update them. To push an updated `.crx` file for your app, just increment the - version number in the manifest, upload a new ZIP file to the dashboard, and publish the change. - People who have already installed your app will automatically get the update. - -## What next? - -Here are some choices for where to go next: - -* [Overview][38]: Get the conceptual background you need to use the Chrome Web Store well. -* [Checking for Payment][39]: Learn how to use the Licensing API to check whether the user has paid for your app. -* [Samples][40]: Find samples in multiple languages of hosted apps that use the Licensing API. -* [Tutorial: Licensing API][41]: Walk through a full example of creating an app that uses the Licensing API to check whether the user -has paid. - -If you just want to write your app, see the developer doc for the type of app you're interested in: - -- [Installable Web Apps][42] -- [Chrome Apps][43] -- [Themes][44] -- [Extensions][45] - -[1]: https://developers.google.com/chrome/apps/articles/thinking_in_web_apps -[2]: /docs/extensions/mv2/overview -[3]: /docs/apps/about_apps -[4]: /docs/extensions/mv2/getstarted -[5]: /docs/apps/first_app -[6]: #step-5-zip-up-your-app -[7]: https://chrome.google.com/webstore/developer/dashboard -[8]: https://www.blogger.com -[9]: https://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=34592 -[10]: https://chrome.google.com/webstore/developer/dashboard -[12]: /docs/extensions/mv2/manifestVersion -[13]: https://developers.google.com/chrome/apps/docs/developers_guide -[15]: /docs/webstore/images#icons -[16]: /docs/webstore/images#screenshots -[17]: /docs/webstore/images#promo -[19]: https://www.google.com/search?q=json+validator -[21]: https://developers.google.com/native-client/dev/devguide/distributing#multi-platform-zip -[23]: /docs/webstore/publish#step1 -[24]: https://chrome.google.com/webstore/developer/dashboard -[25]: /docs/webstore/register -[27]: /docs/webstore/best_practices#categories -[28]: /docs/webstore/pricing#seller -[29]: /docs/webstore/money -[30]: https://support.google.com/chrome_webstore/contact/dev_account_transfer -[32]: https://chrome.google.com/webstore/developer/dashboard -[33]: /docs/webstore/branding -[35]: /docs/extensions/mv2/tabs -[36]: https://chrome.google.com/webstore/developer/dashboard -[38]: /docs/webstore/ -[39]: /docs/webstore/check_for_payment -[40]: /docs/webstore/samples -[41]: /docs/webstore/get_started -[42]: /docs/chrome/apps/ -[43]: /docs/apps/about_apps -[44]: /docs/extensions/mv2/themes -[45]: /docs/extensions diff --git a/site/en/docs/webstore/hosted_apps/index.md b/site/en/docs/webstore/hosted_apps/index.md deleted file mode 100644 index ebefd186f536..000000000000 --- a/site/en/docs/webstore/hosted_apps/index.md +++ /dev/null @@ -1,265 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: "Hosted Apps" -#date: TODO -#updated: TODO -description: How to create a hosted app. ---- - -Read this page to learn how to create and load a **hosted app**—a regular web app, plus some -metadata. - -If you're interested in creating a **packaged app**—a web app that's bundled up as an extension, so -that the user downloads all of its content—see [Packaged Apps][1] in the [extensions -documentation][2]. - -## Creating hosted apps {: #creating } - -A hosted app requires a _`.crx` file_ that contains metadata describing the app. (The `.crx` file -format is just a variation of ZIP that's used by Google Chrome.) An app's `.crx` file can be hosted -on your own server or, more typically, by the Chrome Web Store. - -The `.crx` file for a hosted app must contain an icon and a manifest that has details about how the -app should function. - -{% Aside %} - -**Note:** Unlike extensions and packaged apps, a hosted app has no access to the files inside its -`.crx` file. - -{% endAside %} - -### Making a web app installable {: #live } - -You can easily make any existing web app installable, letting you publish it as a hosted app. -There's no need to rewrite the web app or change technologies. All you need to provide are an icon -and a manifest. - -Here is a typical manifest for a hosted app: - -```json -{ - "name": "Google Mail", - "description": "Read your gmail", - "version": "1", - "app": { - "urls": [ - "*://mail.google.com/mail/", - "*://www.google.com/mail/" - ], - "launch": { - "web_url": "http://mail.google.com/mail/" - } - }, - "icons": { - "128": "icon_128.png" - }, - "permissions": [ - "unlimitedStorage", - "notifications" - ] -} -``` - -This manifest and the icon it points to (`icon_128.png`) make the Google Mail web app installable as -a hosted app. When someone installs this app, the specified icon appears on Chrome's New Tab page. -Clicking that icon launches the app by bringing up the page specified by the "web_url" field. - -The "permissions" field lets you specify HTML5 permissions that the app requires. By specifying -"unlimitedStorage" and "notifications", this app is able to use those HTML5 features without having -to repeatedly ask the user for permission. During app installation, the user is told which -permissions the app needs; installing the app implicitly grants those permissions for all pages -whose URLs match those in the "apps" field of the manifest. - -### Details: The manifest {: #manifest } - -The manifest is a file named `manifest.json` that can have the following fields: - - -name: - -: _Required._ The name of the application. This is displayed in the store and in Chrome's launcher. - -description: - -: _Recommended._ A brief description of the app. - -version: - -: _Required._ The version of this metadata. Each time you update the metadata this number must be - incremented. Up to four dot-separated integers are allowed. - -app: - -: _Required._ The URLs that the app uses, including the _launch page_ for the app—the page that the - browser goes to when the user clicks the app's icon in the New Tab page. If your hosted app is - listed in the Chrome Web Store, you must prove that you control each domain specified in this field. - For help in proving your ownership, see the [Chrome Developer Dashboard][3]. - -app.urls: - -: The URLs for the pages in the hosted app, not necessarily including the launch page. Once the app is - installed, these pages and the launch page have the permissions requested in the manifest. - - {% Aside %} - **Note:** You don't need to specify the URLs for included files or for assets such as images. - {% endAside %} - - Each URL must begin with `http`, `https`, or `*` (which matches both `http` and `https`). You can - use wildcards for subdomains—for example, "\*://\*.example.com/". - - {% Aside 'caution' %} - - **Important:** _Do not_ put port numbers in the value of "urls". Port numbers aren't necessary there - (all ports are valid), and values with port numbers are silently ignored, leaving the corresponding - pages without the requested permissions. - - {% endAside %} - - You need to specify only the start of the app's URLs. For example, - "https://www.google.com/accounts/" matches every URL that starts with that string, such as - https://www.google.com/accounts/ and https://www.google.com/accounts/b/0/ManageAccount. - - {% Aside 'caution' %} - - **Important:** If you provide multiple apps, **avoid overlapping URLs**. If a user tries to install - an app whose "web_url" or "urls" values overlap with those of an already installed app, the second - installation will fail due to URL conflict errors. For example, an app that specifies a "urls" value - of "http://mail.example.com/" would conflict with an app that specifies - "http://mail.example.com/mail/". - - {% endAside %} - - If the user downloads the app's `.crx` file from a server that's not the Chrome Web Store, only one - domain is allowed, and it must be the same as the domain that serves the `.crx` file. For more - information on hosting options, see the extensions documentation for [Hosting][4]. - -app.launch: - -: _Required._ Specifies what happens when the user launches the app. - -web_url: - -: _Required._ Specifies the launch page as an absolute URL. - -container: - -: The value "panel" makes the app appear in an app panel. By default, or when you specify "tab", the - app appears in a tab. - -height: - -: If the container is set to "panel", this integer specifies the height of the panel in pixels. For - example, you might specify `"height":400`. Note that you don't use quotation marks in the value. - This field specifies the height of the area to display contents in; window decorations add a few - more pixels to the total height. If the container isn't a panel, this field is ignored. - -width: - -: Similar to "height", but specifies the width of the panel. - -background_page: - -: Specifies an HTTPS URL to load in a background window. If you use this, you must also specify the - "background" permission. - -icons: - -: _Recommended._ Specifies the icon shown in the launcher. - -128: - -: The 128x128 icon shown in the app launcher. Only about a 96x96 area should be visible; the rest - should be transparent. For details, see the Chrome Web Store [image guidelines][5]. - -key: - -: The public key value for your app. Usually, you don't need to specify this field; it's set - automatically when the `.crx` file is created, such as when you upload your app to the Chrome Web - Store. For more information, see [Packaging][6] and [key field details][7] in the extensions - documentation. - -minimum_chrome_version: - -: The version of Chrome that your app requires. - -offline_enabled: - -: Whether the app is expected to work offline. When Chrome detects that it is offline, apps with this - field set to true are highlighted on the New Tab page. For help on enabling offline access for your - app, see [these articles][8]. - - {% Aside %} - - **Version note:** Before Chrome 15, this flag is valid but ignored. - - {% endAside %} - -permissions: - -: Any combination of "[background][9]", "clipboardRead", "clipboardWrite", "geolocation", - "notifications", and "unlimitedStorage". - -update_url: - -: The URL of the XML file used to autoupdate your app. Don't specify this field unless you host your - own autoupdates. See [Autoupdating][10] for details. - -The format of the app manifest file is based on the manifest files for Chrome extensions, and most -of the fields are the same. For more details on manifest files and their fields, see the [extension -manifest documentation][11]. - -## Loading hosted apps {: #installing } - -The following instructions tell you how to load an installable web app that isn't yet packaged in a -`.crx` file—a handy technique while you're working on an app. - -1. Create a folder (you might name it `maps_app`) and put the following files into it: - - - [manifest.json][12] - - [128.png][13] - - You've just created the metadata for a hosted app. Now you can load the app. - -2. In Chrome, bring up the extensions management page by clicking the wrench icon and choosing - **Tools > Extensions**. -3. If **Developer mode** has a + by it, click the +. - The + changes to a -, and more buttons and information appear. -4. Click the **Load unpacked extension** button. - A file dialog appears. -5. In the file dialog, navigate to the folder where you put the app's files, and click **OK**. - You've now installed the app. -6. Create a new tab. - The icon for the newly installed app appears in Chrome's launcher on the New Tab page. -7. Click the icon for the app. - You've now launched the app. - -For a full tutorial on converting your existing web app into a hosted app (and publishing it), see -the Chrome Web Store [Getting Started tutorial][14]. - -## Hosted apps and the Chrome Web Store {: #webstore } - -The [Chrome Web Store][15] is an open marketplace for web apps that enables you to reach millions of -users with your apps. The store is integrated with Chrome, making it easy for Chrome users to -discover apps and install them directly from the store. For details, see the developer documentation -for the store, especially the [Overview][16] and [Getting Started tutorial][17]. - -[1]: /docs/extensions/mv2/apps/ -[2]: /docs/extensions/ -[3]: https://chrome.google.com/webstore/devconsole -[4]: /docs/extensions/mv2/hosting -[5]: /webstore/images -[6]: /docs/extensions/mv2/packaging -[7]: /docs/extensions/mv2/manifest/key -[8]: http://www.html5rocks.com/en/tutorials/#offline -[9]: /docs/extensions/mv2/declare_permissions#background -[10]: /docs/extensions/mv2/autoupdate -[11]: /docs/extensions/mv2/manifest -[12]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/extensions/maps_app/manifest.json?content-type=text/plain -[13]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/extensions/maps_app/128.png -[14]: get_started_simple -[15]: http://chrome.google.com/webstore -[16]: /docs/webstore/ -[17]: /docs/webstore/get_started_simple diff --git a/site/en/docs/webstore/identify_user/index.md b/site/en/docs/webstore/identify_user/index.md index cb082f946cfc..32becc55c918 100644 --- a/site/en/docs/webstore/identify_user/index.md +++ b/site/en/docs/webstore/identify_user/index.md @@ -6,10 +6,7 @@ description: How to get the Google Account identity of a Chrome Web Store user. --- This page tells you how to get the Google Account identity of a user, using Google's OpenID -endpoint. You need this identity if you support Chrome Web Store Payments, because payment -information is tied to the user's Google Account. - -Even if you don't use Chrome Web Store Payments, consider using Google Accounts if your app needs a +endpoint. You can use this identity to manage user payments and licensing, or if you need a login system. Google Accounts can help you provide a better user experience, since users of the Chrome Web Store are likely to be logged in already, and they won't have to set up and remember yet another username and password. @@ -18,7 +15,40 @@ another username and password. The following table summarizes when you should support Google Account logins using OpenID. -
App costPayment plan/systemSupport for Google Accounts (using OpenID)
PaidChrome Web Store Payment SystemRequired
The Licensing API relies on Google Account user IDs.
PaidCustom payment solutionRecommended
Users from the Chrome Web Store will have a better experience if you support the Google Account that they're already logged into.
FreeYou might charge for the app in the futureRecommended
Supporting Google Accounts might make adding payments simpler.
FreeNo plans to charge for the app in the futureOptional
If you want to identify individual users, Google Accounts are a reasonable way to do so.
+ + + + + + + + + + + + + + + + + + + + + + + +
App costPayment plan/systemSupport for Google Accounts (using OpenID)
PaidCustom payment solution + Recommended +
Users from the Chrome Web Store will have a better experience if you support the Google Account that they're already logged into. +
FreeYou might charge for the app in the future + Recommended +
Supporting Google Accounts might make adding payments simpler. +
FreeNo plans to charge for the app in the future + Optional + +
If you want to identify individual users, Google Accounts are a reasonable way to do so. +
## How to use OpenID with Google Accounts @@ -32,79 +62,10 @@ Here's what the login page looks like. Note that it has a Google URL, not a URL {% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/yDxgjzMfnbRFJi9XlGyj.png", alt="The Google login page.", height="368", width="644" %} -If you're writing a hosted app with Google App Engine, supporting Google Accounts is easy. You just -use the default Google Accounts API authentication and the Users service. For details, see the user -authentication docs (for [Java][1] or [Python][2]). Here's an example (taken from the [Licensing -API][3] tutorial's [HelloLicenseServlet.java][4] file) of the code you use to get the current user's -OpenID URL if you're implementing a Java app with Google App Engine: - -```java -UserService userService = UserServiceFactory.getUserService(); - -if (userService.isUserLoggedIn()) { - User user = userService.getCurrentUser(); - /* ...Do something with user.getFederatedIdentity(), which is the OpenID URL. */ -} -``` - -If you aren't using Google App Engine, you can get the Google OpenID endpoint by sending a request +You can get the Google OpenID endpoint by sending a request to `https://www.google.com/accounts/o8/id`. See [Federated Login for Google Account Users][5] for details. -## How to skip the OpenID approval screen - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/yDxgjzMfnbRFJi9XlGyj.png", alt="the Google Accounts approval page", height="368", width="644" %} - -Normally, the first time your app uses the -Google OpenID endpoint to authenticate a particular user, the user must approve your access to their -account. To the right, you can see a typical OpenID approval screen. - -Your users will have a better experience if they never see the approval screen. The screen is -skipped if **both** of the following are true: - -* Your app requests only the OpenID URL. If your app requests something else—the user's - email address, for example—the approval screen is shown. -* You specify your app's OpenID realm in the Edit page. - -Here's how to specify your OpenID realm: - -1. In the Chrome Developer Dashboard, go to the Edit page for your app. -2. In the **OpenID** section, select the checkbox. -3. In the text field that appears, enter the realm that your app will use to query Google's OpenID - service. - This must be exactly the same as the value of the `openid.realm` field in your authentication - requests. -4. Save your changes. - They'll take effect the next time you publish your app. - -If your app's code doesn't specify the value of the `openid.realm` parameter, look at your OpenID -library to see how it sets that value. For details on how `openid.realm` is used, see [Request -parameters][6] in the Google OpenID documentation. - -## OpenID resources - -You should use an existing OpenID library rather than implement your own. In addition to Google App -Engine's Users service, you can find OpenID libraries in a number of languages. Here are a few -libraries we've used: - -- Java: [OpenID4Java][7] -- Python: [GAE Django OpenID][8] -- PHP: [LightOpenID][9] -- Ruby: [ruby-openid][10] and [rack-openid][11], used together - -You can find more libraries at Janrain's [OpenID Enabled][12], and a full list at the [OpenID -Foundation][13]. - -The following pages have detailed explanations of how to use OpenID with Google Accounts: - -- [Supporting Federated Login with Google Accounts for Chrome Web Store Apps][14] -- [Federated Login for Google Account Users][15] -- [Using Federated Authentication via OpenID in Google App Engine][16] - -## What next? - -If you're using the Licensing API, your next stop is [Checking for Payment][17]. Otherwise, go on to -[Supplying Images][18]. [1]: https://developers.google.com/appengine/docs/java/users/overview [2]: https://developers.google.com/appengine/docs/python/users/overview diff --git a/site/en/docs/webstore/images/index.md b/site/en/docs/webstore/images/index.md index adea57704f84..5772e33cd162 100644 --- a/site/en/docs/webstore/images/index.md +++ b/site/en/docs/webstore/images/index.md @@ -28,8 +28,7 @@ image. Follow our [Image best practices][11] to increase your chance of being fe ## Extension icon -You must provide a 128x128-pixel extension icon image in the [ZIP file of your -][6]. Some requirements +You must provide a 128x128-pixel extension icon image in the [ZIP file of your extension][6]. Some requirements for the image: - The actual icon size should be **96x96** (for square icons); an additional 16 pixels per side diff --git a/site/en/docs/webstore/inline_installation/index.md b/site/en/docs/webstore/inline_installation/index.md deleted file mode 100644 index b296bf63fd63..000000000000 --- a/site/en/docs/webstore/inline_installation/index.md +++ /dev/null @@ -1,248 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: Using Inline Installation -date: 2018-06-12 -description: How to use inline installations. ---- - -{% Aside 'warning' %} -As of 06/12/2018, inline installation is deprecated. For more information, read our -[Chromium Blog post][1] and [Migration FAQ][2]. -{% endAside %} - -Once you've [published][3] your app or extension, you may be wondering how users will find and -install your app. For users who browse the Chrome Web Store and find your item, its a very easy -one-click process to install it. However, if a user is already on your site, it can be cumbersome -for them to complete the installation - they would need to navigate away from your site to the -store, complete the install process, and then return. - -As of Google Chrome 15, you can initiate app and extensions installations "inline" from your site. -These apps and extensions are still hosted in the Chrome Web Store, but users no longer have to -leave your site to install them. - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/iOr6LOVuZYykpCTpthlq.png", alt="Inline installation dialog", height="241", width="401" %} - -When users install the app, they -will see an installation confirmation dialog similar to the one pictured on right. Just like the -dialog displayed when installing directly from the Chrome Web Store, it lists all of the permissions -that your app or extension is requesting. Additionally, this dialog includes the average Chrome Web -Store rating and the number of users, giving users extra confidence about what they are about to -install. - -## Overview - -Inline installation is composed of two parts: a declarative `` tag and a call to the -JavaScript function `chrome.webstore.install()`. In addition, you must also verify an association -between the site that triggers inline installation and the relevant item(s) in the Chrome Web Store. - -## Adding a Chrome Web Store link - -The HTML page on your site from which you want inline installation to occur must contain one or more -`` tags in the `` section referencing the items that the user can install. Each `` -tag must have the following format: - -```html - -``` - -The URL in the `` tag must be exactly as specified above, except that you should replace -`_itemID_` with the actual ID value for your item. To determine the ID value for a specific item, go -to the [Chrome Developer Dashboard][4] and click the name of the relevant app or extension. The ID -value for that item will be shown in the browser address bar; it is a string of 32 Latin characters -at the end of the URL in the address bar. Do not use the URL in the address bar as the URL in the -`` tag (the URL in the address bar uses a new format that includes the app name–this new -format does not work for inline installation). Instead, copy the ID value from the URL in the -address bar and paste the ID value into the URL specified in the `` tag above. - -As an example, the `` tag for the [Google Drive][5] app would look like this: - -```html - -``` - -## Triggering inline installation - -To actually begin inline installation, the -`chrome.webstore.install(_url_, _successCallback_, _failureCallback_)` function must be called. This -function can only be called in response to a user gesture, for example within a click event handler; -an exception will be thrown if it is not. The function can have the following parameters: - -* url (optional string) - * If you have more than one `` tag on your page with the `chrome-webstore-item` relation, you - can choose which item you'd like to install by passing in its URL here. If it is omitted, then the - first (or only) link will be used. An exception will be thrown if the passed in URL does not exist - on the page. -* successCallback (optional function) - * This function is invoked when inline installation successfully completes (after the dialog is shown - and the user agrees to add the item to Chrome). You may wish to use this to hide the user interface - element that prompted the user to install the app or extension. -* failureCallback (optional function) - * This function is invoked when inline installation does not successfully complete. Possible reasons - for this include the user canceling the dialog, the linked item not being found in the store, or the - install being initiated from a non-verified site. The callback is given a failure detail string as a - parameter. You may wish to inspect or log that string for debugging purposes, but you should not - rely on specific strings being passed back. - -## User interface elements for inline installation - -One of the key concepts behind inline installation is that it allows you, the app developer, to -choose when to prompt the user to install the app or extension. If the item is critical to your -site, you may wish to have a modal dialog or other distinctive noticeable user interface element for -prompting the user. If the item only provides secondary functionality, inline installation may be -hidden away on a secondary page of your site. - -Since inline installation has to be triggered via a user gesture (for example, a mouse click) it is -therefore suggested that you tie the action to a clickable user interface element such as a button. -It is suggested that you use the same button label as the Chrome Web Store itself (in English, this -is "Add to Chrome"). - -## Checking if an item is already installed - -You may wish to only show user interface elements that prompt the user to install the item if it's -not already installed. - -To check if an app is already installed, you can use the [`chrome.app.isInstalled`][6] property. By -querying it from a page contained within your app's [URLs][7], you can show or hide interface -elements as appropriate. For example: - -```html - - -``` - -Extensions can [communicate][8] with the embedding page via content scripts to let it know that they -are already installed. For example, you could have a content script that targets the installation -page: - -```js -var isInstalledNode = document.createElement('div'); -isInstalledNode.id = 'extension-is-installed'; -document.body.appendChild(isInstalledNode); -``` - -Then your installation page can check for the presence of that DOM node, which signals that the -extension is already installed: - -```js - - -``` - -## Verified site requirement - -For security reasons, inline installations can only be initiated by a page on a site that is -[verified][9] (via [Webmaster Tools][10]) as being associated with that item in the Chrome Web -Store. Note that if you verify ownership for a domain (for example, `http://example.com`) you can -initiate inline installation from any subdomain or page (for example, `http://app.example.com` or -`http://example.com/page.html`). We may revoke your app or extension's ability to use Inline -Installation if we detect any association with deceptive practices, including deceptive ads and -landing pages, or installation patterns that suggest user confusion. - -## Enforcement FAQ - -**Why are we disabling inline installation for certain extensions?** -Inline installation is a powerful distribution mechanism that offers users a smoother experience -installing Chrome extensions and helps developers reach more users. While the vast majority of -developers have used this feature as intended, we have seen instances where an inline installation -has been paired with ads and landing pages that confuse and mislead users into installing extensions -they may not want. In response to this, we [launched][11] our inline installation enforcement effort -in September 2015, which we updated in March 2016. - -**What happens when inline installation is disabled?** -When an extension's inline installation is disabled, attempts to trigger inline installation for -your extension will result in a redirect to your item's Chrome Web Store listing. Inline -installation enforcement does not result in removal of your extension from the Chrome Web Store. -Users will still be able to access and install your extension through the Chrome Web Store. Repeated -abuse of inline installation, however, may lead to further enforcement actions. - -Starting in July 2017, inline installation may also be selectively disabled for malicious or -deceptive webpage leading to your extension, on a per-install basis. When inline installation is -disabled in this way, it will not affect other inline installations of the same extension -originating from non-deceptive sources. - -**Will I know if my inline installation has been disabled?** -If inline installation has been disabled at the extension level, you will receive an alert to -developer email account. If inline installation is disabled at the installation level, due to a -deceptive or malicious installation context and not the extension itself, the developer will receive -not receive an alert. - -**What are the criteria for disabling inline installation?** -The Chrome Web Store has two separate processes that govern inline installation. The first is run -completely by an automated enforcement system. This system regularly scans all extensions hosted on -the Chrome Web Store and tracks various signals associated with potential abuse of the inline -installation mechanism. These signals include anomalous installations patterns and user complaints. -Inline installation is automatically disabled for an extension when it significantly exceeds the -typical values for these inline installation abuse metrics. - -In January 2018, we updated our automated enforcement systems to incorporate additional signals and -disable deceptive or confusing flows faster. - -In addition to the automated enforcement system, the Chrome Web Store team periodically conducts -manual reviews of landing pages and ads associated with an extension's inline installation. If the -team encounters a landing page or ad that violates the [Unwanted Software Policy][12] or any other -aspect of the [Developer Program Policies][13], inline installation for the associated extension -will be permanently disabled. For violations involving malware or social engineering, further -enforcement action may result. - -Please note that we may periodically adjust our enforcement signals. If we detect repeated or -egregious violations or any attempts to game or manipulate our signals in any way, we may apply -further enforcement actions. - -**How can I have inline installation reenabled for my extension?** -Once an extension's inline installation has been disabled by our automated enforcement system, we -closely track the extension's installation patterns. If our system determines that user intent -remains strong after a redirect to the extension's Chrome Web Store listing, the system will -automatically reenable inline installation. This process takes at least 30 days. If our system finds -that user intent dramatically weakens following a redirect to the extension's listing, inline -installation will remain disabled. - -For cases where inline installation has been permanently disabled by our manual review process, -there is no path to reenable that particular extension's inline installation. - -**How can I ensure inline installation remains enabled for my extension?** -In general, we urge Chrome Web Store developers to ensure their inline installation landing pages -prominently feature their extensions' core features and deliver experiences that align with the -expectations conveyed by the ads and landing pages associated with the installation flow. For more -guidance on how to build clear and transparent landing pages, please refer to our [Unwanted Software -Policy][14] as well as our AdWords policies on [misrepresentation][15] and [abuse of the ad -network][16]. - -Additionally, we recommend that Chrome Web Store developers carefully track any user feedback that -indicate their extension's installation may have led to any confusion or unexpected changes, in -addition to installation metrics that may convey low user satisfaction, e.g., high churn rates. - -**Is there any way that I can request a re-review, or appeal this decision?** -Yes, appeals can be made through the instructions included in the notification email you will -receive to the email address listed under your CWS developer account. Our enforcement team will -process the appeal within 48 hours. - -**Why do you have an automated enforcement system?** -Our automated disable was built to ensure we are responsive to user feedback on unwanted extensions -in a scalable, fair, and objective manner. - -[1]: https://blog.chromium.org/2018/06/improving-extension-transparency-for.html -[2]: /docs/extensions/mv2/inline_faq -[3]: /docs/webstore/publish -[4]: https://chrome.google.com/webstore/developer/dashboard -[5]: https://chrome.google.com/webstore/detail/apdfllckaahabafndbhieahigkjlhalf -[6]: /docs/webstore/faq#faq-app-24 -[7]: https://developers.google.com/chrome/apps/docs/developers_guide#manifest -[8]: http://code.google.com/chrome/extensions/content_scripts.html#host-page-communication -[9]: http://www.google.com/support/webmasters/bin/answer.py?hl=en&answer=34592 -[10]: http://www.google.com/webmasters/ -[11]: http://blog.chromium.org/2015/08/protecting-users-from-deceptive-inline.html -[12]: https://www.google.com/about/company/unwanted-software-policy.html -[13]: /docs/webstore/program_policies#spam -[14]: https://www.google.com/about/company/unwanted-software-policy.html -[15]: - https://support.google.com/adwordspolicy/answer/6020955?hl=en&vid=1-635766371629017731-609235876 -[16]: https://support.google.com/adwordspolicy/answer/6020954?hl=en&ref_topic=1626336 diff --git a/site/en/docs/webstore/inline_installation/inline_install_dialog.png b/site/en/docs/webstore/inline_installation/inline_install_dialog.png deleted file mode 100644 index a5a381b33a10..000000000000 Binary files a/site/en/docs/webstore/inline_installation/inline_install_dialog.png and /dev/null differ diff --git a/site/en/docs/webstore/launching/index.md b/site/en/docs/webstore/launching/index.md deleted file mode 100644 index 569833da85fd..000000000000 --- a/site/en/docs/webstore/launching/index.md +++ /dev/null @@ -1,266 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: Launching Your App in the Chrome Web Store -date: 2010-10-01 -description: An overview of how to launch an app in the Chrome Web Store. ---- - -The Chrome Web Store is an upcoming new way to distribute and sell your web apps. It [recently -opened up for developer preview][1], and web app developers are beginning to build and package their -apps for the launch of the store later this year. We're going to walk you through launching an app -so you have a smooth experience and are well positioned for a successful consumer launch. - -## Bootstrap: Join the apps developer discussion group - -Chat with your peers and ask questions of the community in the [apps developer discussion group][2]. - -## Step One: Design your app - -Before diving into the technical details of the Chrome Web Store, it's important to focus first on -the design of your web app. Paying careful attention to your target users and what goals they are -trying to accomplish will ensure you are building the right app. Web apps are more action, or verb, -oriented than traditional websites, and successful web apps have a targeted set of use cases in -mind. - -The design of your app will be influenced by your target audience, the message you want to send, the -emotions you want to evoke, the brand you are trying to cultivate, and of course the functionality -of the app itself. Design is not just the choice of button colors, but is a holistic approach to -shaping how your users perceive and interact with your product. A well executed design permeates -every aspect of the web app development process. - -We've written about design principles we think are important for well executed web apps. [Thinking -in Web Apps][3] lists five design principles: - -- Tight focus -- Big screen -- Rich experience -- Beauty -- Speed - -Web apps should be focused on doing one thing very well, with a tight focus that helps a user -accomplish a goal. We believe "big screen" web apps allow developers to maximize usage of modern -wide screen devices, with flexible scalable layouts that fill the available browser window. Users -have come to expect a rich experience from their web apps, full of audio, video, graceful -transitions, graphical feedback, and access to modern features such as geolocation. Beautiful web -apps exploit modern web standards such as CSS3 and web fonts to present information and the design -in visually stunning ways, while never getting in the way of the functionality. Of course, a web app -is designed with speed in mind, on both the server and the client, using local storage, web workers, -advanced caching and syncing, and CSS3 transitions and animations. - -Ideally, a user should forget they are using a browser and simply be drawn into the web app. You may -find some design inspiration at [Lovely Web Apps][4]. - -When designing your application, remember you can assume that users will be using Google Chrome, -which means you can use any number of advanced HTML5 and CSS3 features. - -## Step Two: Build your app - -The actual web app construction phase occurs once you have a handle on the design direction for your -application. This is where the rubber hits the road, as you build the web app and test its features. - -There are many technologies to pick from, which is one of the great aspects of the open web. Below -are some options: - -- **HTML5** - the family of HTML5, CSS, and JavaScript technologies powering the modern web. Learn - more at [HTML5 Rocks!][5] and [HTML5 Boilerplate][6]. -- **Native Client** - run your native C/C++ code in the browser's sandbox! Get started with the - [Native Client SDK][7]. (Note: this technology is still in development, but you can try it out - now.) -- **Adobe Flash** - probably the most widely distributed browser plug-in. -- **A mix** - mix and match these technologies as best as you see fit. - -Iterate quickly, gathering constant feedback from your testers and users. If you are building a new -app, release with the minimal viable product and add features and enhancements with each iteration. -The beauty of web app development is the ease in which you can respond to customer feedback, without -a cumbersome re-deployment process. - -During this phase you'll no doubt be exploring and implementing the many HTML5 features that will -help deliver a "next generation" app look and feel. Because the Chrome Web Store is initially -targeted at Google Chrome, you can build the app with two assumptions in mind: you have a wide array -of modern HTML5 features available, and your initial set of users will be using Google Chrome. - -There are [two different types of installable web apps][8]: packaged and hosted. Hosted web apps are -regular web apps, served from web servers. Packaged web apps are bundled and are completely -installed into the user's browser. You'll decide which type of installable web app to build during -this step. Hosted web apps are most familiar to you, and packaged web apps might appeal to you if -you don't want to run any servers or need to access the Google Chrome extension APIs. Regardless of -type, you'll still need a ZIP file that includes a [manifest file][9] and any icons required (always -a 128x128; also a 16x16 for packaged web apps). You can find more details in the documentation for -[hosted apps][10] and [Chrome Apps][11]. - -If your web app is using the integrated payment system (Chrome Web Store Payments) you'll need to -build in support for both OpenID to [identify the user][12] and the Chrome Web Store Licensing API -to [see if that user has successfully paid][13]. - -We also recommend that you [add support for Google Chrome Frame][14], a plugin that adds Google -Chrome's capabilities, including its HTML5 features, to legacy browsers such as IE6, IE7, and IE8. -Enabling support is as simple as sending an HTTP header or adding a tag to your pages. When -you support Chrome Frame, you are helping legacy browser users access the full potential of your web -app. - -## Step Three: Determine how to monetize - -It's obviously important to be able to monetize your web app. The Chrome Web Store offers one-time -payments as well as monthly and yearly subscriptions through Chrome Web Store Payments (which -currently requires a US bank account). Picking a price point is up to you (and the market), and we -encourage you to determine the value proposition of the app and what it might be worth to your -users. - -If the Chrome Web Store Payments system does not meet your needs, you are free to use a third-party -payment processor. You are free to monetize using any mechanism that makes sense for your app and -your users. - -The Chrome Web Store also supports a free trial option. The free trial offers a low barrier to entry -and allows users to try your web app for free. How you distinguish between the free and paid -versions is totally up to you; the Chrome Web Store does not dictate exactly what free trial means -to your app. Many web apps will find free trial to be a great way to encourage users to install the -app and get a feel for it before purchase. - -Other monetization options include displaying ads (an option for hosted web apps), or simply -offering your web app for free. - -For new web apps, don't be afraid to try different payment options. You are free to change the -amounts or mechanisms based on feedback and experiments. Incorporate analytics and metrics from day -one to track your web app's usage and growth. - -[Integrating with the Chrome Web Store Payments][15] system is easy, using a simple JSON (or Atom) -REST-based service. Requests are signed by OAuth, and you can [test your integration with the -Licensing API][16] using special user IDs and our [OAuth Playground][17]. - -## Step Four: Package and publish your app - -Detailed documentation is available to help you [publish your app into the Chrome Web Store][18]. -The steps involve writing a manifest file, zipping it up, uploading the ZIP file to the [Chrome -Developer Dashboard][19], and providing configuration and content about your web app. - -A one-time registration fee of \$5, designed to [create better safeguards][20] against fraudulent -web apps in the gallery, is required before you can use the Chrome Web Store developer dashboard. -You must also verify your domain with [Google Webmaster Tools][21] in order to identify "official" -web apps in the Chrome Web Store. - -## Step Five: Get your app noticed - -One of the primary goals for the Chrome Web Store is to enhance the discoverability and distribution -of your web apps. Numerous in-store mechanisms, both curated and algorithmic, will help users find, -evaluate, purchase, and install your web app. However, we encourage you to take a broader approach -to marketing your web app. - -To start, building a consistently designed marketing site for your web app will help ensure users -notice, and learn more, about your web app. You will have total control over the design and -execution of this marketing site, and thus can craft the perfect message for your current and future -users. You can deep-link to the Chrome Web Store's listing for your app, leading people right to -your web app. - -Of course, using social media is a great way to share your web app. Google Buzz, Twitter, and -Facebook are excellent ways to encourage your users to become followers, and your followers to -become your advocates. - -The Chrome Web Store itself will offer opportunities to be _featured_, both in storewide curated -lists as well as inside of individual categories. Featured apps tend to get noticed, and the best -way to be featured is to build a great app that people will love and that really highlights what the -modern web is capable of. - -The Chrome Web Store's listing for your app allows you to display a few [screenshots][22] and a -YouTube video. Use these opportunities to show off your app, and use the video to highlight key -features and explain the use cases. - -Hosting your web app in the Chrome Web Store is the primary way to get noticed, and a broad -marketing campaign can expand your message's reach, get your app noticed, and find more users. - -## Step Six: Solicit feedback, measure, and track your users - -Listening to users is extremely important, and we recommend that you provide a way for users to give -you feedback. Numerous services can help you do this, from [Google Groups][23] to community -management apps such as [UserVoice][24] or [Get Satisfaction][25]. Remember that it's not enough to -offer a place for users to voice their ideas. You should also respond and ensure that your users -feel like their voices are heard. - -Tracking which features and pages of your app are actually used, where your users are coming from, -and even what screen size is most popular is very important. [Google Analytics][26] can track a -tremendous amount of aggregate data and provide you with the statistics you need to make informed -decisions. Note that you can also add Google Analytics to your app's Chrome Web Store page. - -A/B testing is a great way to determine which technique works best, by offering both options to -different pools of users. For example, you could try two different calls to action and measure which -phrase leads to more conversions. - -Think Vitamin has an informative article titled [How to Track Six Key Metrics for Your Web App][27]. -Metrics such as churn (percentage of customers that cancel each month), CMRR (contracted monthly -recurring revenue), and LPC (lifetime profit per customer) are explained, including formulas and -spreadsheet examples. - -We recommend the "measure, iterate, listen, repeat" cycle for constant change based on real-life -facts and data. - -## Pre-launch checklist - -The Chrome Web Store opens for consumers later this year. Let's run through the preflight checklist: - -- Did you join the [apps developer discussion group][28]? -- Did you test your web app in the [Dev channel of Google Chrome][29]? -- Did you upload the ZIP file of the manifest and icons into the [Chrome Web Store Developer - Dashboard][19]? -- Did you verify your domain with the Google Webmaster Tools? -- Did you test both success and failure scenarios with the Chrome Web Store Licensing API, or - whatever registration and payment systems you are using? -- Did you upload compelling screenshots to the store? -- Did you create an informative video for the store page? -- Did you create a marketing website for your app? -- Did you install an analytics package on the store's page for your app? -- Did you install an analytics package in your app? -- Did you configure a user feedback tool? -- Are you tracking key metrics? -- Did you test what happens if a user has cookies turned off? Or JavaScript disabled? -- Did you check the spelling in your app? -- Is your app accessible to people with disabilities? -- Does each action or app state have a unique URL that a user can bookmark or share? -- Is your web app's favicon configured? -- Do you have the proper copyrights? -- Is your web app's 404 page configured? -- Did you add support for [Chrome Frame][31]? - -[Launchlist][32] has as even longer checklist for a successful web app launch. - -## Launch! - -You can upload your web app into the Chrome Web Store today. It's the perfect time to test and -experiment before the consumer release. - -We hope this post helps you get started with the Chrome Web Store. For more information, read about -[web app design principles][33], check out the [Chrome Web Store FAQ][34], and browse our [developer -documentation][35]. We look forward to seeing your app in the store! - -[1]: http://blog.chromium.org/2010/08/get-your-apps-ready-for-chrome-web.html -[2]: https://groups.google.com/a/chromium.org/group/chromium-apps/topics -[3]: https://developers.google.com/chrome/apps/articles/thinking_in_web_apps -[4]: http://lovelywebapps.blogspot.com/ -[5]: http://html5rocks.com/ -[6]: http://html5boilerplate.com/ -[7]: http://code.google.com/p/nativeclient-sdk/ -[8]: /docs/webstore/apps_vs_extensions#pkgVsHost -[9]: http://code.google.com/chrome/extensions/manifest.html -[10]: https://developers.google.com/chrome/apps/docs/developers_guide -[11]: /docs/apps/ -[12]: /docs/webstore/identify_user -[13]: /docs/webstore/check_for_payment -[14]: https://developers.google.com/chrome/chrome-frame/ -[15]: /docs/webstore/check_for_payment -[16]: /docs/webstore/check_for_payment#test -[17]: http://googlecodesamples.com/oauth_playground/ -[18]: /docs/webstore/publish -[19]: https://chrome.google.com/extensions/developer/dashboard -[20]: http://blog.chromium.org/2010/08/security-improvements-and-registration.html -[21]: http://www.google.com/webmasters/ -[22]: /docs/webstore/images#screenshots -[23]: http://groups.google.com -[24]: https://uservoice.com/ -[25]: http://getsatisfaction.com/ -[26]: http://www.google.com/analytics -[27]: http://thinkvitamin.com/web-apps/how-to-track-six-key-metrics-for-your-web-app/ -[28]: https://groups.google.com/a/chromium.org/group/chromium-apps/topics -[29]: http://www.chromium.org/getting-involved/dev-channel -[31]: https://developers.google.com/chrome/chrome-frame/ -[32]: http://launchlist.net/ -[33]: https://developers.google.com/chrome/apps/articles/thinking_in_web_apps -[34]: /docs/webstore/faq -[35]: /docs/webstore/overview diff --git a/site/en/docs/webstore/migrating/index.md b/site/en/docs/webstore/migrating/index.md deleted file mode 100644 index 638c52394c6c..000000000000 --- a/site/en/docs/webstore/migrating/index.md +++ /dev/null @@ -1,87 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: "Migrating from Packaged App to Chrome App or Extension" -#date: TODO -#updated: TODO -description: Guidelines on converting your packaged app to a Chrome App or Extension. ---- - -{% Aside 'caution' %} - -**Important:** Chrome will be removing support for Chrome Apps on Windows, Mac, and Linux. Chrome OS -will continue to support Chrome Apps. Additionally, Chrome and the Web Store will continue to -support extensions on all platforms. [Read the announcement][1] and learn more about [migrating your -app][2]. - -{% endAside %} - -Since their initial introduction, packaged apps have evolved into Chrome Apps and Chrome Extensions. -If your your legacy packaged app has an active user base, you will likely want to migrate to a new -Chrome App or Extension, rather than publishing a new seperate item in the Chrome Web Store. - -## Quick Overview of Migration {: #overview } - -- You'll need to decide whether your new item should be either a Chrome App or a Chrome Extension. -- Convert your legacy app to the new type, test it, and package it as a ZIP file. -- In the CWS Developer Dashboard, upload the new ZIP. - -## Step 1: Determine item type. {: #step1 } - -First you'll need to determine the item type that best fits your application. - -If your legacy app interacts with open-web content that your users browse to, expects to be in a -Chrome tab, or needs a UI surface in the Chrome address bar, then it should become an extension. If, -on the other hand, your legacy app is more like a native application and could be implemented as its -own top-level window running side-by-side with Chrome rather than in a Chrome tab, then it should -become a Chrome App. - -## Step 2: Prepare for the new CWS {: #step2 } - -You will also need to prepare for the new Chrome Web Store requirements. - -The first requirement is that your manifest be updated to Version 2. Read the tutorial for migration -to Manifest v2. In addition to certain manifest naming changes and the removal of certain deprecated -APIs, Manifest Version 2 includes a default Content Security Policy. In the case of extensions, it's -a good idea to update to CSP, but for Chrome Apps, it's a requirement. Finally, remove -app:launch:local_path from your legacy app's manifest. This was the manifest key that determined -that your app was a legacy packaged app. The next steps depend on which new item type you're -targeting. - -## Step 3: Update your code. {: #step3 } - -If you've decided your app should be a Chrome Extension, you'll want to familiarize yourself with -all the details about Chrome Extensions. The principal difference between a legacy packaged app and -a Chrome Extension is that packaged apps had their own Chrome tab to themselves, whereas extensions -generally enhance other web content that your users are browsing in Chrome. So you'll need to decide -whether to modify your legacy app to operate as an enhancement to web content, or else fit its UI -into the surfaces offered by browser actions or page actions. - -If you've decided to convert your packaged app to a Chrome App, you'll need to understand the Chrome -Apps lifecycle, and how to create an event page as the starting point for your app. The easiest -first step will be to resurrect your legacy app in a Chrome App window. To do so, create an event -page, and in the chrome.app.runtime.onLaunched() event handler, call chrome.app.window.create(), and -for the url parameter, pass in the URL of the start page you had been using for -app:launch:local_path in your legacy app manifest. Reloading your app should bring up a new window -outside Chrome with your legacy app's content inside, and you can iterate from that point onward to -restore any missing functionality. Once your app is running again, have a look at the new Chrome App -APIs that are now available to your app. You might be inspired to take your legacy app in a whole -new product direction! - -## Step 4: Test your app {: #step4 } - -Some things to look out for: is user data preserved? Are all UI elements still reachable? If you're -struggling to fit concepts from your app into the new type, consider whether you should change your -app-or-extension decision. - -## Step 5: Upload and Publish. {: #step5 } - -Once you upload the new version of your product, the Store will automatically detect that it's a new -type. - -## Step 6: Promote your new item {: #step6 } - -Congratulations! Your legacy app is now migrated. Let your users know about the change, and go find -new users! - -[1]: http://blog.chromium.org/2016/08/from-chrome-apps-to-web.html -[2]: /apps/migration diff --git a/site/en/docs/webstore/one_time_payments/index.md b/site/en/docs/webstore/one_time_payments/index.md deleted file mode 100644 index aa74b54619b0..000000000000 --- a/site/en/docs/webstore/one_time_payments/index.md +++ /dev/null @@ -1,268 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: One-Time Payments -date: 2017-08-30 -description: How to set up one-time payments with Chrome Web Store Payments. ---- - -If you choose to charge users for your Chrome App, Chrome Extension, or Chrome Theme in the Chrome -Web Store, there are several options available to you. The Chrome Web Store has a built-in one-time -payment system called Chrome Web Store Payments. - -Alternatively for Chrome Apps, you have the option of selling virtual goods with [Payments Merchant -Account][1] along with the Chrome Web Store API. - -
Note: Chrome Web Store payment methods are not available for hosted apps.
- -## Offering a free trial {: #offering-free-trial } - -For Chrome Apps and Chrome Extensions, you can provide a free trial version that either gives the -user full access for a limited period of time or restricts which features are available. You can -enable the free trial by checking the appropriate box in the Developer Dashboard, then using the -Licensing API to confirm what kind of license the user has and how long they've had it, with an -upgrade path to the paid version. - -## Chrome Web Store Licensing API {: #cws-licensing-api } - -You can use the Chrome Web Store Licensing API to determine whether the user has paid for your item -or how long they've been using their free trial. The Licensing API is a simple REST-based API that -lets you query the Chrome Web Store license server to find out whether a particular user is using a -free trial or if they have paid for your item. - -## Contents - -1. [Before you get started][2] -2. [Using one-time payments][3] -3. [Verifying payment and offering free trial][4] -4. [Migrating from a free to a paid experience][5] -5. [Sample Chrome App][6] - -## Before you get started {: #before-starting } - -If you don't have one already, you must [open a Google Payments Merchant account][7], and associate -that account with the store. - -
Note: See Payments: Regions, fees and tiers for more information about fees and locations where you can sell your app.
- -## Using one-time payments {: #using-otps } - -You can set up the one-time payment and offer a free trial option on the listing page of the [Chrome -Web Store Developer Dashboard][9]. The Chrome Web Store manages the licenses for each user and -exposes that information through a REST API. - -To enable one-time payments: - -1. Choose and set the price in the Chrome Web Store listing. -2. Enable the Chrome Web Store API in the [Google APIs Console][10]. -3. Update the `manifest.json` to add the [necessary scope and permission][11]. -4. Add code to your app to verify the license. - -### Update your Chrome Web Store listing {: #update-cws-listing } - -Follow the steps below to enable one-time payments for your item: - -1. Click **Change pricing** in the Pricing and payments section of the listing. -2. Choose **This item uses Chrome Web Store Payments**, and choose **One-time payment** in the drop - down. -3. If applicable, check the **This item supports a free trial mode** if you plan to offer a free - trial for your item. -4. Finally, click **OK** to return to the dashboard for your item. - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/VwqkyI8cJ1YVQR010lzh.png", - alt="A screenshot of the change payment UI", height="560", width="795" %} - -#### Choosing a price {: #choosing-a-price } - -When you use Chrome Web Store Payments, you can choose from 18 tiers or set your own custom price -for each supported region. - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/fovAcun6Xbv1izwOcfh8.png", - alt="A screenshot of the supported regions UI", height="523", width="652" %} - -To change the price of your item, select the tier you'd like in the Pricing and payments section of -the listing. You can also set a custom price for each region, by choosing Mixed, and then select the -price for each region in the Regions section. - -
See Payments: Regions, fees and tiers for more information about the different tiers and prices in local currencies.
- -## Verifying payment and offering free trial {: #verifying-payment } - -To verify if the user has a license, you can query the Chrome Web Store Licensing API. - -Here's an overview of the process required to use the licensing API - -- Get the identity token for the current user. -- Make an authenticated request to the licensing server. -- Verify the response. - -### Update the manifest.json {: #update-manifest } - -Before you can use the licensing API, you'll need to modify the `manifest.json` file and add a new -scope and potentially a new permission. - -1. If you haven't already, enable the Chrome Identity API, see [User Authentication][13] for more - information. -2. If you haven't already, enable the Chrome Web Store API in the [Google APIs Console][14]. -3. In the `manifest.json` file: - 1. Add `https://www.googleapis.com/` to the `permissions` section. - 2. Add `https://www.googleapis.com/auth/chromewebstore.readonly` to the `scopes` subsection of - the `oauth2` section. - -```json -{ - "permissions": [ - "storage", - "identity", - "https://www.googleapis.com/" - ], - "oauth2": { - "client_id": "665859454684-s6nmohpktccl2srxvc67thbmpclpa36v.apps.googleusercontent.com", - "scopes": [ - "https://www.googleapis.com/auth/plus.login", - "https://www.googleapis.com/auth/chromewebstore.readonly" - ] - } -} -``` - -### Verifying the license {: #verify-code } - -To verify the user has either purchased your Web Store item or are using a free trial, do the -following: - -1. Get the current users authentication token using `chrome.identity.getAuthToken()`. -2. Make an XHR with the users access token and your app ID to - `https://www.googleapis.com/chromewebstore/v1.1/userlicenses/`. -3. Parse the JSON response, verify the license and store the result. - -```js -var CWS_LICENSE_API_URL = 'https://www.googleapis.com/chromewebstore/v1.1/userlicenses/'; -var req = new XMLHttpRequest(); -req.open('GET', CWS_LICENSE_API_URL + chrome.runtime.id); -req.setRequestHeader('Authorization', 'Bearer ' + token); -req.onreadystatechange = function() { - if (req.readyState == 4) { - var license = JSON.parse(req.responseText); - verifyAndSaveLicense(license); - } -} -req.send(); -``` - -
Note: You cannot offer free trial experiences for Themes because themes do not execute any JavaScript and cannot verify a license.
- -### Handling and parsing the response {: #parse-response } - -The response you get from the license server tells you three things: whether the user has access, -the level of access the user should have, and how much longer the response is valid. If you just -want to know whether the user has access, check the value of the `result` field. If you want to know -whether the user should get a free trial version, check the value of the `accessLevel` field. - -Sample JSON license object - -```json -{ - "kind": "chromewebstore#license", - "itemId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "createdTime": "1377660091254", - "result": true, - "accessLevel": "FULL", - "maxAgeSecs": "2052" -} -``` - -
Field NameDescription
kindIdentifies a Chrome Web Store license
itemIdYour app or extension ID
createdTimeThe date that the license was created, returned as a Unix timestamp. You can use to limit functionality of a free trial to a specific period of time.
resultWhether the user has a license (full or trial), true or false
accessLevelFREE_TRIAL, FULL or NONE
maxAgeSecsThe length of time the response is valid for, once that time has passed your app should query the license server again to check whether the user's access has changed.
- -### Caching the response {: #cache-response } - -To improve the performance and avoid running into rate limits, you should cache the license data -locally using the [`chrome.storage.sync`][15] API and only refresh it on a periodic basis. By -storing the license data in the sync data, it will be synced across all machines that the users is -logged into. - -In addition, do not block the user interface or lock the user out of your Chrome App or Extension -while waiting for the licensing server to respond, but instead, allow the user to continue for a -limited grace period until a response is received. Providing a grace period of at least a day or two -will ensure that your Chrome App or Extension continues to work properly in an offline situation -where the user may not be connected to the network. - -## Handling the free trial experience {: #handling-trial } - -If you decide to offer a free trial to users, there are several ways that you can allow users to try -before they make the purchase. The two most common ways are providing full access for a limited -time, or offering a limited feature set. Of course, you can also combine these two, or provide your -own incentives to encourage users to upgrade to the paid version. - -### Limited time access {: #trial-limited-time } - -The license API makes it easy to provide a limited time trial experience by including the date the -license was first issued to the user. Comparing the `createdDate` to the current date will tell you -how long the user has been using the free trial. - -```js -var licenseStatus; -if (license.result && license.accessLevel == "FULL") { - console.log("Fully paid & properly licensed."); - licenseStatus = "FULL"; -} else if (license.result && license.accessLevel == "FREE_TRIAL") { - var daysAgoLicenseIssued = Date.now() - parseInt(license.createdTime, 10); - daysAgoLicenseIssued = daysAgoLicenseIssued / 1000 / 60 / 60 / 24; - if (daysAgoLicenseIssued <= TRIAL_PERIOD_DAYS) { - console.log("Free trial, still within trial period"); - licenseStatus = "FREE_TRIAL"; - } else { - console.log("Free trial, trial period expired."); - licenseStatus = "FREE_TRIAL_EXPIRED"; - } -} else { - console.log("No license ever issued."); - licenseStatus = "NONE"; -} -``` - -
Note: After major updates or a significant period of time, you may want to allow the user to try your item again so they can try the new features and see how the item has changed.
- -### Limited feature set {: #trial-limited-feature } - -Another way that you can provide a free trial to users is by offering them a limited feature set -until they've upgraded to the paid version. For example, you might limit the number of files open at -any given time, or the total number of files that the user can edit before being prompted for -payment. - -## Migrating from a free to a paid experience {: #free2paid } - -If you decide to migrate from a free experience to a paid experience, you should consider what -experience you want to provide for any user who installed your item prior to the change. We strongly -recommend grandfathering these users into the full, paid experience though the decision is yours. - -Users who installed your item prior to the change will have a `FREE_TRIAL` license. To determine if -a user installed your item prior to the price change, you can check the `createdTime` value in the -license to determine when they first installed it. - -## Sample Chrome App {: #sample-app } - -For a simple Chrome App that demonstrates how to use the Chrome Web Store Licensing API, see: - -- [source code][16] -- [published app][17] - -You can install and run the published app from the Chrome Web Store to try out free trial -experience. - -[1]: /docs/webstore/payments-iap -[2]: #before-starting -[3]: #using-otps -[4]: #verifying-payment -[5]: #free2paid -[6]: #sample-app -[7]: https://payments.google.com/merchant/signup -[8]: /docs/webstore/pricing#seller -[9]: https://chrome.google.com/webstore/developer/dashboard -[10]: https://cloud.google.com/console -[11]: #update-manifest -[12]: /docs/webstore/pricing#matrix -[13]: /docs/extensions/reference/app_identity -[14]: https://code.google.com/apis/console -[15]: /docs/extensions/reference/storage -[16]: https://github.com/GoogleChrome/chrome-app-samples/tree/master/one-time-payment -[17]: https://chrome.google.com/webstore/detail/one-time-payment-sample/ebcgmmcbgnpoclkoibogeiokfdmjbbob diff --git a/site/en/docs/webstore/payments-iap/index.md b/site/en/docs/webstore/payments-iap/index.md deleted file mode 100644 index 2b71c97456ef..000000000000 --- a/site/en/docs/webstore/payments-iap/index.md +++ /dev/null @@ -1,373 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: "In-App Payments with Payments Merchant Account and the Chrome Web Store API" -date: 2014-02-28 -updated: 2018-06-15 -description: How to handle in-app purchases. ---- - -
Important: Chrome will be removing support for Chrome Apps on Windows, Mac, and Linux. Chrome OS will continue to support Chrome Apps. Additionally, Chrome and the Web Store will continue to support extensions on all platforms. Read the announcement and learn more about migrating your app.
- -You can use a [Payments Merchant Account][3] and the Chrome Web Store API to sell virtual goods -within your Chrome App or Chrome Extension. - -The [Chrome Web Store Developer Dashboard][4] makes it easy to easy to create and manage virtual -goods. You can provide localized descriptions for each product and offer items in local currencies. -It also can help you to verify and manage licenses for the virtual goods purchased by each user. - -In order to sell virtual goods, you'll need to: - -1. Create a [Google Payments Merchant account][5]. -2. Create the items you wish to sell via the Developer Dashboard in the Chrome Web Store. -3. Include the appropriate [`buy.js`][buy-js] file in your package. -4. Wire up the sales flow. - -The [`buy.js`][buy-js] file provides four functions: - -[`google.payments.inapp.getSkuDetails`][8] - -: Returns an array of active items provided by your product from the Chrome Web Store. Maps to the Web - Store API [In-App Products List Method][9]. - -[`google.payments.inapp.buy`][10] - -: Purchases an item. - -[`google.payments.inapp.getPurchases`][11] - -: Returns an array of items purchased by the user. Maps to the Web Store API [Payments List -Method][12]. - -[`google.payments.inapp.consumePurchase`][13] - -: Consumes an item. - -
Note: See Payments: Regions, fees and tiers for more information about fees and locations where you can sell your virtual goods.
- -## Purchase flow {: #purchase-flow } - -You can use `google.payments.inapp.getSkuDetails` to get the list of available products, and then -show those to the user. - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/EZULNCIw4clveEnCqfvT.png", - alt="A screenshot of an example purchase flow.", height="566", width="800" %} - -
Best Practice: Before showing the user all of the items that are available, compare the list of items that they've already purchased (using google.payments.inapp.getPurchases) and provide some indication that the items have already been purchased.
- -When a customer clicks a **Purchase** button within your Chrome App or Extension, Chrome uses the -Google account of the user signed into Chrome to display the Google payment processing window. - -When the user clicks the **Accept and Buy** button in the payment processing window, the Google -payment server processes the payment and displays a purchase confirmation dialog to the user. The -`success` or `failure` callback is invoked appropriately. - -Items uploaded to the Web Store are unable to be purchased through the same developer account. -Instead, use a trusted tester account to run a trial purchase flow. - -
Note: if the user doesn't have a Google account, they are taken through the sign-up flow.
- -## Using the Chrome Web Store API for In-App Purchases {: #how-to-use } - -The Chrome Web Store (CWS) API can be used to handle in-app purchases without the use of any -server-side coding as was previously required by the deprecated Google Wallets for Digital Goods -API. - -- The Chrome Web Store handles the list of virtual goods available for sale, eliminating the need to - create, store, or manage JSON Web Tokens. -- You can get the list of available virtual goods through the `getSkuDetails` function. -- You must include the [`buy.js`][buy-js] library with your package, and load the library from its - location in your package. -- You must call the `buy()` method with an extra parameter called `parameters`. -- The UI to process payments is displayed in a separate window, rather than in an iframe. -- The Chrome Web Store manages the list of purchased virtual goods (licenses) for each user and - exposes that list to you through the `getPurchases()` function. - -### Setting up your account {: #setup-account } - -In order to use the Chrome Web Store API to handle in-app purchases, you'll need to create a [Google -Payments Merchant account][16]. - -Once you've created the Merchant account, it will be automatically associated with your Chrome App -or Extension listing in the Chrome Web Store. - -### Creating and Managing your virtual goods {: #create-digital-goods } - -Before you can sell any virtual goods, you need to create the list of in-app products that are -available for purchase. The Chrome Web Store simplifies this process for us by providing an -interface for creating in-app products and licenses. This interface can be found in the In-app -Products tab in the Chrome app listing page of the Chrome Web Store Developer Dashboard. Once you -have created your in-app products, you can continue to use this interface to manage them. - -{% Img src="image/BrQidfK9jaQyIHwdw91aVpkPiib2/BboETdjxoq0zsejDhhkL.png", - alt="A screenshot of the in-app product dashboard", height="614", width="800" %} - -1. Open the [Chrome Web Store Developer Dashboard][17] and edit the listing for your app. -2. Switch to the **In-app Products** tab at the top of the page. -3. Click **Add new product**. -4. Provide the necessary information: - - Product ID - - : An identifier (SKU) you'll use to identify that specific product. Product IDs must start with a - lowercase letter or number and can only contain lowercase letters(a-z), numbers(0-9), dots(.) - and underscores(\_). - - Title - - : A friendly name of your product that will be shown to users on the purchase confirmation page. - - Description - - : A short description of the item that will be shown to users on the purchase confirmation page. - -5. Choose the price tier or create a custom price within the tier range that you wish to sell the - item for. -6. Click **Save** to save the item. -7. Activate by changing the state to **Active**. - -If you want to prepare digital goods for release on a specific day, you can leave the state set to -`Inactive` until you're ready to make those available. This means you can launch new features or -levels, but keep them hidden until you're ready. - -- You can have up to 100 items (active, inactive, or archived) at any given time. -- You should move older items that are no longer for sale to archived. -- Be careful when deleting items as users may already have purchased them and may lose their - license. -- Once a product ID has been used, it cannot be used again, even if it has been deleted. - -#### Querying available items {: #query-items } - -The `getSkuDetails` function returns a list of all active virtual goods available from the Chrome -Web Store available for purchase by the user, including the product ID (SKU), title, description, -and price. You can provide an optional SKU argument to the function, which will then return only the -details for that specific item. - -```js -google.payments.inapp.getSkuDetails({ - 'parameters': {'env': 'prod'}, - 'success': onSkuDetails, - 'failure': onSkuDetailsFail -}); -``` - -
Note: The parameters field is required and must be set to {'env': 'prod'} to tell Chrome to use the production instance of the API. Review the Testing your app section for details on how to test your app without incurring a charge. You can learn about adding trusted testers when you publish your app here.
- -The response will look like: - -```json -{ - "response": { - "details": { - "kind": "chromewebstore#inAppProductList", - "inAppProducts": [ - { - "kind": "chromewebstore#inAppProduct", - "sku": "70darkchocolate", - "item_id": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "type": "inapp", - "state": "ACTIVE", - "prices": [ - { - "valueMicros": "990000", - "currencyCode": "USD", - "regionCode": "US" - } - ], - "localeData": [ - { - "title": "Dark Chocolate (70%)", - "description": "The best chocolate available.", - "languageCode": "all" - } - ] - }, - { - ... - } - ] - } - } -} -``` - -
You can find the full description of In-App Products Representation and Methods in the Web Store API Reference.
- -For example, you might want to list the details of each object you get back from the function: - -```js -function onSkuDetails(skus) { - var products = response.response.details.inAppProducts; - var count = products.length; - for (var i = 0; i < count; i++) { - addProductToUI(products[i]); - } -} -``` - -#### Responding to a purchase request {: #respond-to-purchase } - -The following code snippet shows how to initiate the purchase flow for an item managed through the -Chrome Web Store: - -```js -var sku = "giant_tv"; -google.payments.inapp.buy({ - 'parameters': {'env': 'prod'}, - 'sku': sku, - 'success': onPurchase, - 'failure': onPurchaseFail -}); -``` - -When the purchase completes, Chrome will call the defined callback with the a parameter that looks -like: - -```json -{ - "jwt": "eyJhb...0oFuU", - "request": { - "cartId": "00000000000000000000.0000000000000000000" - }, - "response": { - "orderId": "00000000000000000000.0000000000000000000" - } -} -``` - -#### Verifying what items the user has purchased {: #get-purchases } - -If you want to verify that the user has purchased an item and has a current license, you can call -`google.payments.inapp.getPurchases`. The function will always return the most up to date -information, and will reflect if the purchase was cancelled by the user, or refunded through the -[Payments Merchant console][21]. - -```js -google.payments.inapp.getPurchases({ - 'parameters': {'env': 'prod'}, - 'success': onLicenseUpdate, - 'failure': onLicenseUpdateFail -}); -``` - -The Chrome Web Store will return the list of SKUs that the user has purchased: - -```json -{ - "response": { - "details": [ - { - "kind": "chromewebstore#payment", - "itemId": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", - "sku": "giant_tv", - "createdTime": "1387221267248", - "state": "ACTIVE" - } - ] - } -} -``` - -
Note: See the Web Store API Reference for more details on the payment methods.
- -```js -function onLicenseUpdate(licenses) { - var licenses = response.response.details; - var count = licenses.length; - for (var i = 0; i < count; i++) { - var license = licenses[i]; - saveLicense(license);pay - } -} -``` - -#### Consume purchased item {: #consume-purchase } - -If you want to consume an item that a user has purchased, so that the user can purchase again, you -can call `google.payments.inapp.consumePurchase`. The function will change the license status from -"active" to "cancelled_by_developer". - -```js -google.payments.inapp.consumePurchase({ - 'parameters': {'env': 'prod'}, - 'sku': sku, - 'success': onConsume, - 'failure': onConsumeFail -}); -``` - -After consuming a license, if you make a `getPurchase` call, you'll get: - -```json -{ - "response": { - "details": [ - { - "kind":"chromewebstore#payment", - "itemId":"bgjmpalnjpigmmelcdiakkfofbofhege", - "sku":"bullet", - "createdTime":"1424800615789", - "state":"CANCELLED_BY_DEVELOPER" - } - ] - } -} -``` - -
Note: The consumePurchase API won't work with in-app subscriptions.
- -## Subscriptions {: #subscription } - -Developers can also offer in-app subscriptions. - -If a free trial is specified, users will go through the purchase flow for a 0 amount, and the first -recurring order will occur automatically as soon as the free trial period expires. Note that once a -subscription item is activated, developers can no longer inactivate it or change the price or -period. However, the free trial period can be changed at any time. While non-subscription items will -have the type "inapp", subscription items will have the type "subs". For example, getSkuDetails will -return a result for a subscription item that resembles: - -```json -{ -"kind":"chromewebstore#inAppProduct", -"sku":"banana", -"item_id":"bgjmpalnjpigmmelcdiakkfofbofhege", -"type":"subs", -"state":"ACTIVE", -"prices":[{"valueMicros":"990000","currencyCode":"USD","regionCode":"US"}],"localeData":[{"title":"Bullet","description":"a bullet","languageCode":"en-US"} -``` - -## Testing purchases {: #testing } - -Prior to publishing your app to the world, you can test the In-App Payment experience by publishing -it only to **trusted testers**. When your app is published to trusted testers, the purchase flow -will proceed normally, except they will not be charged. - -## Sample Chrome App {: #sample-app } - -For a simple app that demonstrates how to use CWS API for in-app products, you can download the -[source code][23] here. - -Note, this app is not published in the Chrome Web Store to prevent accidental purchases. - -[1]: http://blog.chromium.org/2016/08/from-chrome-apps-to-web.html -[2]: /apps/migration -[3]: https://payments.google.com/merchant/signup -[4]: https://chrome.google.com/webstore/developer/dashboard -[5]: #setup-account -[8]: /docs/webstore/payments-iap#query-items -[9]: /docs/webstore/webstore_api/inAppProducts/list -[10]: /docs/webstore/payments-iap#respond-to-purchase -[11]: /docs/webstore/payments-iap#get-purchases -[12]: /docs/webstore/webstore_api/payments/list -[13]: /docs/webstore/payments-iap#consume-purchase -[14]: /docs/webstore/pricing -[16]: https://payments.google.com/merchant/signup -[17]: https://chrome.google.com/webstore/developer/dashboard -[18]: /docs/webstore/payments-iap#testing -[19]: /docs/webstore/publish#testaccounts -[20]: /docs/webstore/webstore_api/inAppProducts#resource -[21]: https://payments.google.com/merchant -[22]: /docs/webstore/webstore/webstore_api/payments/list -[23]: https://github.com/GoogleChrome/chrome-app-samples/tree/master/samples/managed-in-app-payments - -[buy-js]: https://github.com/GoogleChrome/chrome-extensions-samples/blob/main/apps/samples/managed-in-app-payments/scripts/buy.js diff --git a/site/en/docs/webstore/rating/index.md b/site/en/docs/webstore/rating/index.md index 1be4463d6b3b..e1a0e345b963 100644 --- a/site/en/docs/webstore/rating/index.md +++ b/site/en/docs/webstore/rating/index.md @@ -11,27 +11,31 @@ description: Guidelines about how the Chrome Web Store rates the maturity of con [Branding Guidelines][3] | **Rating Guidelines** | [Program Policies][4] | [User Data FAQ][5] | [Developer Agreement][6] -Content ratings help users determine whether your application and its content are mature in nature. -Ratings are not intended to reflect the quality or complexity of your app. - -As the developer, you are ultimately responsible for rating your application appropriately. Use the -following rules as guidance in determining whether your app should be rated "Mature." When -determining your app's rating, consider all the content in your app, including user generated -content and ads, and content that your app links to. Note that regardless of the rating you give -your app, all applications must still adhere to the terms of the Chrome Web Store Program Policy and +Content ratings help users determine whether your extension and its content are mature in nature. +Ratings are not intended to reflect the quality or complexity of your extension. + +As the developer, you are ultimately responsible for rating your extension appropriately. Use the +following rules as guidance in determining whether your extension should be rated "Mature." When +determining your extension's rating, consider all the content in your extension, including user generated +content and ads, and content that your extension links to. Note that regardless of the rating you give +your extension, all extensions must still adhere to the terms of the Chrome Web Store Program Policy and the Chrome Web Store Developer Agreement. ## Sexual and suggestive content Apps that focus on sexual content or sexually suggestive content should be rated "Mature." For -example, an app that is a collection of images of men or women in lingerie posing suggestively +example, an extension that is a collection of images of men or women in lingerie posing suggestively should be rated "Mature." Note that pornography and sexually explicit content are not allowed in the Chrome Web Store. -As you consider how to rate your app, here is more guidance on apps that we would consider to be +As you consider how to rate your extension, here is more guidance on extensions that we would consider to be sexually explicit, mature, and not mature. -
Not matureMatureSexually explicit (not allowed)
  • Images of people kissing and hugging
  • Dating app that is not focused on sexual relations
  • App to help a woman choose the right bra size
  • Close-up images of people wearing thongs
  • Apps with sexual themes like adult "Truth or Dare" apps
  • Sex position app with no porn, but has detailed descriptions
  • Apps containing images or videos with nudity or sex acts
  • Apps that contain prominent links to porn sites
+
Not matureMatureSexually explicit (not +allowed)
  • Images of people kissing and hugging
  • Dating extension that +is not focused on sexual relations
  • App to help a woman choose the right bra +size
  • Close-up images of people wearing thongs
  • Apps with sexual +themes like adult "Truth or Dare" extensions
  • Sex position extension with no porn, but has detailed descriptions
  • Apps containing images or videos with nudity or sex acts
  • Apps that contain prominent links to porn sites
## Strong language diff --git a/site/en/docs/webstore/samples/index.md b/site/en/docs/webstore/samples/index.md deleted file mode 100644 index ac4dad902045..000000000000 --- a/site/en/docs/webstore/samples/index.md +++ /dev/null @@ -1,66 +0,0 @@ ---- -layout: "layouts/doc-post.njk" -title: "Samples" -date: 2017-08-30 -description: Code samples demonstrating how to use the Chrome Web Store Licensing API. ---- - -The following basic samples demonstrate how to use the Chrome Web Store Licensing API. Each sample -app obtains the user's OpenID identifier (as described in [Identifying the User][1]) and makes an -OAuth request with it to the Licensing API (as described in [Checking for Payment][2]) to determine -whether the user has paid for the app. - -## Java {: #java } - -A sample Java app that runs on Google App Engine and takes advantage of App Engine's native OpenID -support. To enable OAuth signing, this app uses the [OAuth Signpost][3] library. - -This sample is featured in the [Licensing API tutorial][4]. - -You can browse the source, download all the files, or see the app in action: - -- [Browse code repository][5] -- [Download ZIP file][6] -- [Try live demo][7] - -## Python {: #python } - -A sample Python app that runs on Google App Engine and takes advantage of App Engine's native OpenID -support. To enable OAuth signing, this app uses the [Python OAuth2][8] library. - -You can browse the source or download all the files: - -- [Browse code repository][9] -- [Download ZIP file][10] - -## PHP {: #php } - -A sample PHP app that uses the [LightOpenId][11] and [OAuth for PHP][12] libraries. - -You can browse the source, download all the files, or see the app in action: - -- [Browse code repository][13] -- [Download ZIP file][14] -- [Try live demo][15] - -[1]: /docs/webstore/identify_user -[2]: /docs/webstore/check_for_payment -[3]: http://code.google.com/p/oauth-signpost/ -[4]: /docs/webstore/get_started -[5]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-java/ -[6]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-java.zip -[7]: http://hellolicense.appspot.com/ -[8]: http://github.com/simplegeo/python-oauth2 -[9]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-python/ -[10]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-python.zip -[11]: http://gitorious.org/lightopenid -[12]: http://oauth.googlecode.com/svn/code/php/ -[13]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-php/ -[14]: - http://src.chromium.org/viewvc/chrome/trunk/src/chrome/common/extensions/docs/examples/apps/hello-php.zip -[15]: http://googlecodesamples.com/chrome_webstore/hello-php/index.php diff --git a/site/en/docs/webstore/troubleshooting/index.md b/site/en/docs/webstore/troubleshooting/index.md index db0d009e0525..4bed957327b0 100644 --- a/site/en/docs/webstore/troubleshooting/index.md +++ b/site/en/docs/webstore/troubleshooting/index.md @@ -604,7 +604,7 @@ Keyword Spam: We don't allow extensions with misleading, improperly formatted, n irrelevant, excessive, or inappropriate metadata, including but not limited to the extension's description, developer name, title, icon, screenshots, and promotional images. Developers must provide a clear and well-written description. We also don't allow unattributed or anonymous user -testimonials in the app's description. +testimonials in the extension's description. ``` This policy is to ensure quality of the products on the Chrome Web Store and prevent products from