first set of mobile files
This commit is contained in:
Родитель
f58c003312
Коммит
a2b3effd56
|
@ -0,0 +1,162 @@
|
|||
<h1>Data Compression Proxy</h1>
|
||||
|
||||
<h2 id="faster">Faster, safer, and cheaper mobile web browsing
|
||||
with data compression</h2>
|
||||
|
||||
<p>
|
||||
The latest Chrome browsers for <a href="https://play.google.com/store/apps/details?id=com.android.chrome">Android</a>
|
||||
and <a href="https://itunes.apple.com/us/app/chrome/id535886823?mt=8">iOS</a> can reduce cellular data usage and
|
||||
speed up mobile web browsing by using proxy servers hosted at Google to optimize website content. In our internal testing,
|
||||
this feature has been shown to <strong>reduce data usage by 50%</strong> and speed up page load times on cellular networks!
|
||||
To enable it, visit "<strong>Settings > Bandwidth Management > Reduce data usage</strong>" and toggle the option – easy as that.
|
||||
</p>
|
||||
|
||||
<p><strong>Note:</strong> The data compression feature is currently available to a subset of Android and iOS users - if you don't see the option, stay tuned, as we are rolling out the feature over the coming months. If you can't wait, you can install <a href="https://play.google.com/store/apps/details?id=com.chrome.beta">Chrome Beta for Android</a> and enable the data compression feature right away.</p>
|
||||
</p>
|
||||
|
||||
<h2 id="features">Features and implementation</h2>
|
||||
|
||||
<p>
|
||||
The core optimizations,
|
||||
which allow us to reduce overall data usage and speed up the page load times,
|
||||
are performed by Google servers.
|
||||
When the Data Compression Proxy feature is enabled,
|
||||
Chrome Mobile opens a dedicated SPDY connection
|
||||
between your phone and one of the optimization servers running in Google’s datacenters
|
||||
and relays all HTTP requests over this connection.
|
||||
</p>
|
||||
|
||||
<p><div style="text-align:center"><img width="550" alt="How data compression proxy works" src="/chrome/mobile/images/spdy-proxy.png"/></div></p>
|
||||
|
||||
<p>
|
||||
The proxy server receives the request initiated on the mobile device,
|
||||
initiates a request for the required resource on your behalf,
|
||||
and then optimizes each asset before delivering it back to the client.
|
||||
The content optimization is performed by our
|
||||
<a href="https://developers.google.com/speed/pagespeed/">open-source PageSpeed libraries</a>,
|
||||
which are specifically tuned for the Chrome Mobile browser. The rendering of the page, and all JavaScript execution, is performed by the client’s browser.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Also, note that <strong>secure connections (HTTPS) are routed directly
|
||||
from your mobile device to the destination</strong>,
|
||||
bypassing the optimization proxy –
|
||||
only HTTP requests are routed through and optimized by the proxy.
|
||||
Further,
|
||||
the use of the service does not require a Google account;
|
||||
navigation in incognito tabs bypasses the proxy;
|
||||
original IP address of your device is forwarded to the destination
|
||||
via the <code>X-Forwarded-For</code> header –
|
||||
the data compression service is a transparent proxy.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Curious to see the bandwidth savings provided by the proxy? On Android, you can visit "Settings > Bandwidth Management > Reduce data usage".
|
||||
There, as the screenshot below illustrates, you will find a graph of the original data size vs. the optimized version that your browser received.
|
||||
The bandwidth savings add up quickly!
|
||||
</p>
|
||||
|
||||
<p><div style="text-align:center"><img width="575" alt="Bandwidth usage" src="/chrome/mobile/images/bandwidth-usage.png"/></div></p>
|
||||
|
||||
<p>Let’s take a closer look at some of the specific optimizations enabled by the data compression proxy.
|
||||
</p>
|
||||
|
||||
<h3 id="spdy">SPDY for speed</h3>
|
||||
|
||||
<p>
|
||||
The connection from the mobile device to the proxy runs over <a href="http://www.chromium.org/spdy">SPDY</a>,
|
||||
an optimized protocol for the Web that is supported by Chrome, Firefox and Opera,
|
||||
and is also the basis for the forthcoming HTTP/2.0 standard being developed in the IETF.
|
||||
</p>
|
||||
|
||||
<p><div style="text-align:center"><img width="575" alt="SPDY to http-https" src="/chrome/mobile/images/http-https.png"/></div></p>
|
||||
|
||||
<p>
|
||||
By using SPDY,
|
||||
the proxy is able to multiplex multiple request and response streams
|
||||
in parallel over a single TCP connection,
|
||||
which has numerous performance benefits:
|
||||
it amortizes TCP handshake overhead for multiple requests,
|
||||
enables higher throughput by removing the TCP slow-start phase incurred by each new connection,
|
||||
and enables intelligent request and response prioritization between the streams.
|
||||
In fact,
|
||||
our studies show that just the
|
||||
<a href="http://googledevelopers.blogspot.com/2012/05/spdy-performance-on-mobile-networks.html">use of SPDY alone can reduce page load times by 23% on cellular networks</a>,
|
||||
and this is before we have even talked about optimizing any of the content!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Further, there are many secondary benefits to using SPDY:
|
||||
</p>
|
||||
|
||||
<ul>
|
||||
<li>DNS late-binding: DNS lookups are performed by the proxy, instead of on the phone, which means that the resolutions can be done much, much quicker.</li>
|
||||
<li>Less network activity and faster load times also mean that the mobile radio has to be active for shorter periods of time, which translates into longer battery life!</li>
|
||||
<li>The SPDY connection runs over SSL, which enables safer and more secure browsing.</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="content-optimization">Content optimization</h3>
|
||||
|
||||
<p>
|
||||
Unfortunately,
|
||||
many web-sites are not optimized for the mobile web,
|
||||
which results in inefficient content delivery and slow rendering times.
|
||||
However, our experience with PageSpeed shows that many content optimizations can,
|
||||
in fact, be automated, which is precisely what the data compression proxy does on your behalf!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Transcoding images:</strong>
|
||||
Over 60% of the transferred bytes, for an average page, are images.
|
||||
Hence, the proxy takes great care to optimize and transcode all images to the
|
||||
<a href="https://developers.google.com/speed/webp/">WebP</a> format,
|
||||
which requires fewer bytes than other popular formats, such as JPEG and PNG.
|
||||
The proxy supports the new
|
||||
<a href="https://developers.google.com/speed/webp/docs/webp_lossless_bitstream_specification">WebP lossless format</a> for certain images,
|
||||
and also optimizes the perceptual quality of each image
|
||||
based on device screen resolution and pixel density of your device.
|
||||
By combining all these features the resulting images are up to 80% smaller!
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Content-aware compression:</strong>
|
||||
The proxy performs intelligent compression and minification of HTML, JavaScript and CSS resources,
|
||||
which removes unnecessary whitespace, comments, and other metadata
|
||||
which is not essential to the rendering of the page.
|
||||
These optimizations, combined with mandatory gzip compression for all resources,
|
||||
can yield substantial bandwidth savings for the client.
|
||||
</p>
|
||||
|
||||
<p>
|
||||
<strong>Safer, more secure browsing:</strong>
|
||||
The browser-to-proxy connection runs over SSL,
|
||||
meaning that your browsing session is encrypted between your device and Google’s servers.
|
||||
The proxy also implements
|
||||
<a href="http://blog.chromium.org/2012/01/all-about-safe-browsing.html">Safe Browsing</a>
|
||||
for Chrome Mobile,
|
||||
by informing the browser when you attempt to visit a known malware or phishing site.
|
||||
This causes a warning interstitial page to be displayed,
|
||||
which you can click through if you wish to visit the site.
|
||||
This allows the list of harmful sites to be continuously updated on the proxy,
|
||||
without incurring the overhead of updating it over the air.
|
||||
</p>
|
||||
|
||||
<h3 id="faster-mobile-web">Building a faster mobile web</h3>
|
||||
|
||||
<p>
|
||||
This is just the beginning of what a powerful proxy service can provide
|
||||
to make the mobile web experience a faster and a more enjoyable one,
|
||||
regardless of whether you are on a latest 4G connection, or using an older generation mobile network.
|
||||
We are continuously improving the service and experimenting with new optimizations
|
||||
— stay tuned for more.
|
||||
</p>
|
||||
|
||||
<h2 id="about">About the authors</h3>
|
||||
|
||||
<p>
|
||||
<strong>Matt Welsh</strong> is the head of the Mobile Web Performance team at Google’s Seattle office.
|
||||
<a href="https://plus.google.com/109706986708019547706/posts?e=-RedirectToSandbox">Follow Matt on Google+</a>.<br>
|
||||
<strong>Ilya Grigorik</strong> is a Developer Advocate on the Chrome team at Google in Mountain View.
|
||||
<a href="https://plus.google.com/114552443805676710515/posts?e=-RedirectToSandbox">Follow Ilya on Google+</a>.
|
||||
</p>
|
||||
|
|
@ -0,0 +1,110 @@
|
|||
<h1>FAQ</h1>
|
||||
|
||||
<h2>Chrome for Android</h2>
|
||||
|
||||
|
||||
<dl>
|
||||
<dt>Is Chrome for Android open source?</dt>
|
||||
<dd>Chrome for Android is derived from Chromium. Since the launch of the first version, we have steadily open sourced all the critical components. You can build various Chromium components for Android as used in Chrome for Android using the instructions <a href="http://code.google.com/p/chromium/wiki/AndroidBuildInstructions">here</a>.</dd>
|
||||
|
||||
<dt>Does Chrome for Android follow the same release cycles as desktop Chrome?</dt>
|
||||
<dd>Chrome for Android is expected to follow the desktop Chrome release cycles starting early 2013. </dd>
|
||||
|
||||
<dt>Can I make Chrome for Android auto-update?</dt>
|
||||
<dd>You can make it auto-update by checking either the per-app or global auto-update setting in Android Market.</dd>
|
||||
|
||||
<dt>What are the differences between Android Browser and Chrome for Android?</dt>
|
||||
<dd>Chrome for Android provides the same fast, secure, and stable web browsing experience you’ve come to enjoy when using Chrome on desktop. We’ve taken a different approach to tabs and overall navigation. By signing in to Chrome on Android, users can have a unified, personalized Chrome experience across all their devices.</dd>
|
||||
<dd>From a developer perspective, we are introducing support for Chrome Developer Tools, Indexed DB, requestAnimationFrame, WebSockets and Web Workers.</dd>
|
||||
|
||||
<dt>How do I add a bookmark in Chrome to my home screen?</dt>
|
||||
<dd>Create a bookmark via the menu, find it in the bookmark list, long-press on it, and tap "Add to home screen".
|
||||
|
||||
<dt>I’ve written my mobile web app to use feature X, but Chrome for Android doesn’t support it.</dt>
|
||||
<dd>Please see if this is already a <a href="http://code.google.com/p/chromium/issues/list?q=label%3AOS-Android">known issue</a> and star it if it is. Otherwise, please log a bug.</dd>
|
||||
|
||||
<dt>Does Chrome for Android now support the embedded WebView for a hybrid native/web app?</dt>
|
||||
<dd>We are evaluating ways we can support WebView with Chrome but do not have any plans to announce at this time.</dd>
|
||||
|
||||
<dt>Does Chrome for Android support apps and extensions?</dt>
|
||||
<dd>Chrome apps and extensions are currently not supported on Chrome for Android. We have no plans to announce at this time.</dd>
|
||||
|
||||
<dt>Can I write and deploy web apps on Chrome for Android?</dt>
|
||||
<dd>Though Chrome apps are not currently supported, we would love to see great interactive web sites accessible by URL.</dd>
|
||||
|
||||
<dt>What version of Flash is supported on Chrome for Android?</dt>
|
||||
<dd>Chrome for Android will not be supporting Flash. As you may have seen in November, 2011, Adobe <a href="http://blogs.adobe.com/conversations/2011/11/flash-focus.html">announced</a> it has stopped investing in Flash for mobile browsing. Google has long been committed to making the web platform more powerful through open web technologies like HTML5 and is working with Adobe and other partners to further advance the web standard.</dd>
|
||||
|
||||
<dt>What HTML5 features does Chrome for Android support?</dt>
|
||||
<dd>See this <a href="/chrome/mobile/docs/overview">overview</a>.</dd>
|
||||
|
||||
<dt>How do I debug my mobile web page?</dt>
|
||||
<dd>Chrome Developer Tools are available for remote debugging with Chrome for Android. See the article on <a href="/chrome/mobile/docs/debugging">Remote Debugging</a> for more information.</dd>
|
||||
|
||||
<dt>Can I hide the URL bar?</dt>
|
||||
<dd>The URL bar in Chrome for Android is Chrome’s Omnibox, with all of the built-in search and navigation features. For this initial release, we decided to show the Omnibox at all times. We are monitoring usage patterns and feedback to decide how to evolve this feature in future iterations of the application.</dd>
|
||||
|
||||
<dt>How similar is Chrome for Android with the desktop/laptop version of Chrome?</dt>
|
||||
<dd>Chrome for Android is based on the same source as Chrome for desktop. Chrome for Android brings desktop-class browsing to mobile devices. We plan to continually evaluate applicability of other features from desktop to the mobile platform.</dd>
|
||||
|
||||
<dt>Is Canvas hardware accelerated?</dt>
|
||||
<dd>Yes.</dd>
|
||||
|
||||
<dt>What about WebGL support?</dt>
|
||||
<dd>WebGL is currently not supported, and we have no plans to announce at this time.</dd>
|
||||
|
||||
<dt>Does Native Client work on Chrome for Android?</dt>
|
||||
<dd>It does not, and we have no plans to announce at this time.</dd>
|
||||
|
||||
<dt>What is Chrome for Android’s User Agent string?</dt>
|
||||
<dd>See the <a href="/chrome/mobile/docs/user-agent">user agent article</a> for an
|
||||
in-depth discussion.</dd>
|
||||
|
||||
<dt>Will Chrome Web Store be available on Android?</dt>
|
||||
<dd>We have no plans to announce at this time.</dd>
|
||||
|
||||
<dt>Are you still working on the Android browser, or are you dropping support in favor of Chrome?</dt>
|
||||
<dd>Android Browser and Chrome for Android are both derived from Chromium and already share a lot of code. We will continue to evaluate where it makes sense to harmonize our efforts; for instance, Google now has just one port of WebKit to maintain.</dd>
|
||||
|
||||
<dt>Will Chrome for Android work on my Android device?</dt>
|
||||
<dd>Chrome for Android is supported only on Android 4.0 and higher.</dd>
|
||||
|
||||
<dt>Is Chrome for Android hardware accelerated?</dt>
|
||||
<dd>Yes, hardware acceleration is an essential capability in Android 4.0 and is heavily utilized by Chrome for Android as well.</dd>
|
||||
|
||||
<dt>When will Chrome for Android launch in my country?</dt>
|
||||
<dd>We are launching in a large <a href="http://goo.gl/6ARvc">set of countries</a> and hope to expand it to other countries in the future.</dd>
|
||||
|
||||
</dl>
|
||||
|
||||
|
||||
<h2>Chrome for iOS</h2>
|
||||
|
||||
<dl>
|
||||
<dt>Why is it called Incognito* and not just Incognito?</dt>
|
||||
<dd>The difference is that HTML5 local storage is shared between regular and Incognito* tabs. Chrome must use Apple's UIWebView for loading and rendering web content. This class does not provide any API to inspect, save, restore, or clear HTML5 local storage.<br/>
|
||||
|
||||
As expected, cookies and cache are fully separated in Incognito*. History is not kept, passwords are not remembered, and OmniBox search suggestions are disabled. The only difference is local storage. Incognito* provides users with the best Incognito mode possible given platform limitations.
|
||||
</dd>
|
||||
|
||||
<dt>Chrome seems slower when handling Javascript compared to Safari.</dt>
|
||||
<dd>Rendering and the Javascript engine are provided by iOS through UIWebView. Because Chrome does not have access to Safari’s Nitro engine, Chrome may have slower javascript performance.</dd>
|
||||
|
||||
<dt>Chrome doesn't implement some HTML5 features such as WebGL and some CSS.</dt>
|
||||
<dd>Since Chrome for iOS uses the UIWebView, it provides the same HTML5/OWP features that this component provides.</dd>
|
||||
|
||||
<dt>What are the differences between UIWebView and Safari?</dt>
|
||||
<dd>Mobile Safari uses the Nitro JS engine, which is often faster than the one in the UIWebView. UIWebView scrolling may appear slower, since it renders on the main thread, while Mobile Safari renders in a background thread. There are other differences, some of which are described in this <a href="http://stackoverflow.com/questions/3496505/differences-between-uiwebview-and-mobile-safari">StackOverflow question</a>.</dd>
|
||||
|
||||
<dt>I can’t get RSS feeds or XML to load.</dt>
|
||||
<dd>UIWebView does not support XML or RSS.</dd>
|
||||
|
||||
<dt>How can I get my iOS application to open URLs in Chrome?<dt>
|
||||
<dd>
|
||||
Use the <code>googlechrome/googlechromes</code> schemes instead of
|
||||
<code>http/https</code>. More information can be found in
|
||||
<a href="/chrome/mobile/docs/ios-links">the article on this topic</a>.
|
||||
</dd>
|
||||
</dl>
|
||||
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
|
||||
<h1>Case Study: Feedly Uses x-callback</h1>
|
||||
|
||||
<p><a href="http://www.google.com/cloud.feedly.com#welcome">Feedly</a>, a reader loved by more than 13 million users, has become a hub for users to organize their favorite blogs, news sites, podcasts, and YouTube channels for quick and efficient updates on the go, across any device.</p>
|
||||
|
||||
<img src="/chrome/mobile/images/feedly.png" style="width: 25%; height: 25%; float:right; margin-left:30px; margin-bottom:5px;"/>
|
||||
|
||||
<p>Feedly prioritizes speed and intuitive usability to provide users with easy, direct access to their favorite content. Some of Feedly’s mobile publishers use partial RSS feeds. Users who click on these feeds navigate out of Feedly app to read the remainder of the content in the browser. As a result, the Feedly team prioritized helping users navigate between the Feedly app and the browser.</p>
|
||||
|
||||
<p>The integration of the Chrome <a href="/chrome/mobile/docs/ios-links#callback">callback</a> feature into the Feedly iPhone and iPad app “was a no brainer and surprisingly simple to implement,” said the Feedly team.</p>
|
||||
|
||||
<p>The Feedly team notes that “90% of the time, once a user has finished reading an article, they want to resume skimming their feedly, looking for the next article to read.” Chrome callback enables a seamless transition between Feedly and Chrome, helping users access the content they want faster.</p>
|
||||
|
||||
<p>Knowing their users have a faster, more integrated web experience has allowed Feedly to continue focusing on helping people keep in touch with their favorite sites.</p>
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<h1>Case Studies</h1>
|
||||
|
||||
<p>Many of our favorite apps have implemented Chrome mobile technologies.</p>
|
||||
|
||||
<h3>x-callback</h3>
|
||||
|
||||
<p>The <a href="/chrome/mobile/docs/ios-links#callback">callback</a> feature in Chrome for iOS is a valuable asset for the following implementors:</p>
|
||||
<ul>
|
||||
<li><a href="/chrome/mobile/docs/case_studies/pocket">Pocket</a></li>
|
||||
<li><a href="/chrome/mobile/docs/case_studies/feedly">Feedly</a></li>
|
||||
</ul>
|
||||
|
||||
|
|
@ -0,0 +1,39 @@
|
|||
<h1 class="page-title">Develop apps for Chrome Mobile browsers</h1>
|
||||
|
||||
<p>Google provides three ways to run web content on mobile devices:</p>
|
||||
<ul>
|
||||
<li>Using Chrome Mobile for devices running Android 4.0 and later, and iOS.</li>
|
||||
<li>With the default Android browser, for devices running versions of Android earlier than 4.0 (Ice Cream Sandwich).</li>
|
||||
<li>Within <code><a href="http://developer.android.com/guide/webapps/webview.html">WebView</a></code> on a native Android application.</li>
|
||||
</ul>
|
||||
|
||||
<p>Chrome Mobile browser is the base WebKit browser implemented by both Google Chrome for Android and Apple Mobile Safari. There are differences in the implementations of each. See the following pages:</p>
|
||||
<ul>
|
||||
<li><a href="/chrome/mobile/docs/overview">Chrome for Android</a></li>
|
||||
<li><a href="/chrome/mobile/docs/iosoverview">Chrome for iOS</a></li>
|
||||
</ul>
|
||||
|
||||
<!-- the first-time user procedure goes here -->
|
||||
<h2>Getting started</h2>
|
||||
<ol>
|
||||
<li>Visit <a href="https://play.google.com/store/apps/details?id=com.android.chrome">Google Play</a> to install Chrome for Android or <a href="http://itunes.apple.com/us/app/chrome/id535886823?ls=1&mt=8">AppStore</a> for Chrome for iOS.</li>
|
||||
<li>Read about <a href="/chrome/mobile/docs/overview">Chrome for Android
|
||||
features</a> to use in developing mobile web apps.</li>
|
||||
<li>Review the considerations for <a href="/chrome/mobile/docs/iosoverview">Chrome for iOS</a>.</li>
|
||||
<li>Learn more about mobile web development on <a href="http://www.html5rocks.com/mobile">mobile HTML5 Rocks</a>.</li>
|
||||
</ol>
|
||||
|
||||
|
||||
<h2>Featured video</h2>
|
||||
<p>Debugging for Chrome for Android is as easy as debugging for desktop!</p>
|
||||
<!-- the video gadget goes here, if applicable -->
|
||||
|
||||
|
||||
<p><object width="300" height="193">
|
||||
<param name="movie" value="https://www.youtube.com/v/s4zpL4VBbuU">
|
||||
<param name="wmode" value="transparent">
|
||||
<embed src="https://www.youtube.com/v/s4zpL4VBbuU" type="application/x-shockwave-flash" wmode="transparent" width="300" height="193"></object></p>
|
||||
|
||||
<p>Read more about it in <a href="/chrome/mobile/docs/debugging">Remote Debugging</a>.</p>
|
||||
|
||||
|
|
@ -0,0 +1,129 @@
|
|||
<h1>Add to Homescreen</h1>
|
||||
|
||||
<div>
|
||||
|
||||
<img src="/chrome/mobile/images/home_add.png" style="width: 25%; height: 25%; float:left; margin-top:-50px"/>
|
||||
|
||||
<div style="width:500px">
|
||||
|
||||
<p style="margin-top:50px">New in Chrome M31 Beta you can set up your web app to have an application shortcut icon added to a device's homescreen, and have the app launch in full-screen "app mode" using Chrome for Android’s "Add to homescreen" menu item.</p>
|
||||
|
||||
<p>Homescreen-installed apps work exactly like you would expect a normal web application to work - they follow the same sandboxed security policies and have access to the same API’s - however, they integrate with the Android environment in the following ways.</p>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<div style="clear:left"></div>
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<p><b>Installs directly to the homescreen</b></p>
|
||||
<p style="width:500px">When a user clicks "Add to homescreen" they will see the app being added on the homescreen.</p>
|
||||
<img src="/chrome/mobile/images/home_home.png" style="width: 25%; height: 25%" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p><b>Integrates into the OS task-switcher</b></p>
|
||||
<p style="width:500px">Web apps launched from the homescreen will appear in the task switcher separate from the browser, they will, however still say "Web App" on the app title.</p>
|
||||
<img src="/chrome/mobile/images/home_switcher.png" style="width: 25%; height: 25%" />
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear:left"></div>
|
||||
|
||||
<div>
|
||||
<div>
|
||||
<p><b>Provides a full screen experience</b></p>
|
||||
<p style="width:500px">Web apps will launch full-screen with no vestiges of a browser. The URL will not be present, nor will traditional browser actions such as bookmarking and navigation controls.</p>
|
||||
<img src="/chrome/mobile/images/home_full.png" style="width: 25%; height: 25%" />
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<p><b>Navigating to external pages from a web app highlights them to the user</b></p>
|
||||
<p style="width:500px">Users will always know if the app routes them to a location outside the application’s domain. This is especially useful for authentication flows, the user is kept in the app experience but the URL of the authentication system is clearly visible to the user.</p>
|
||||
<img src="/chrome/mobile/images/home_navigate.png" style="width: 25%; height: 25%" />
|
||||
</div>
|
||||
</div>
|
||||
<div style="clear:left"></div>
|
||||
|
||||
<h2>Supporting add to homescreen apps</h2>
|
||||
|
||||
<p>Chrome will look for the following meta tag in the <code><head></code> element of the web-page:</p>
|
||||
|
||||
<pre><meta name="mobile-web-app-capable" content="yes"></pre>
|
||||
|
||||
<p>The name attribute MUST be "mobile-web-app-capable" and the content attribute must be "yes" (case in-sensitive). If there is any other value in the content attribute the web app will be added as a regular bookmark.</p>
|
||||
|
||||
<h3>Icon</h3>
|
||||
|
||||
<p>The icon that is used to install to the homescreen is determined by using the largest icon found in one of the following <code><link></code> tags:</p>
|
||||
|
||||
<ul>
|
||||
<li><code><link rel="shortcut icon" sizes="196x196" href="nice-highres.png"></code> (recommended)</li>
|
||||
<li><code><link rel="shortcut icon" sizes="128x128" href="niceicon.png"></code></li>
|
||||
<li><code><link rel="apple-touch-icon" sizes="128x128" href="niceicon.png"></code></li>
|
||||
<li><code><link rel="apple-touch-icon-precomposed" sizes="128x128" href="niceicon.png"></code></li>
|
||||
</ul>
|
||||
|
||||
<aside class="caution"><strong>Caution:</strong>The 196px image format is recommended. The last two formats (<code>apple-touch-*</code>) are deprecated, and will be supported only for a short time.</aside>
|
||||
|
||||
<h3>Icon label</h3>
|
||||
|
||||
<p>The application’s <code><title></code> element serves as the default label for the icon on the homescreen.</p>
|
||||
|
||||
<h3>Configuration</h3>
|
||||
|
||||
<p>The following example is the minimum required configuration to support a homescreen launch experience.</p>
|
||||
|
||||
<pre>{% htmlescape %}
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Awesome app</title>
|
||||
<meta name="viewport" content="width=device-width">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<link rel="shortcut icon" sizes="196x196" href="/icon.png">
|
||||
</head>
|
||||
<body></body>
|
||||
</html>
|
||||
{% endhtmlescape %}</pre>
|
||||
|
||||
<h2>Comparison to iOS Safari Add to Homescreen</h2>
|
||||
|
||||
<p>Chrome will also allow Web Apps to launch in "App mode" if they embed a meta tag using the "apple-mobile-web-app-capable" name. Chrome will stop supporting this usage in an upcoming release. Chrome currently shows a deprecation warning in the Developer Tools’ console log when it detects a page with only the "apple-mobile-web-app-capable" meta tag. The warning appears as follows:</p>
|
||||
|
||||
<img src="/chrome/mobile/images/home_warning.png" style="width: 75%; height: 75%" />
|
||||
|
||||
<p>Whilst Chrome temporarily accepts the usage of "apple-mobile-web-app-capable", Chrome does not offer compatibility with the iOS Safari API’s including:</p>
|
||||
|
||||
<ul>
|
||||
<li>window.navigator.standalone</li>
|
||||
<li><code><meta name="apple-mobile-web-app-status-bar-style" content="black"></code></li>
|
||||
<li><code><link rel="apple-touch-startup-image" href="/startup.png"></code></li>
|
||||
</ul>
|
||||
|
||||
<h2>Frequently asked questions</h2>
|
||||
|
||||
<dl>
|
||||
<dt>How do I open links in the user’s browser?</dt>
|
||||
<dd>As you would on the web, adding target=_blank to an anchor will force the user out of the web app and into the browser that the user added the icon from.</dd>
|
||||
|
||||
<dt>Will this work on Chrome for iOS?</dt>
|
||||
<dd>No.</dd>
|
||||
|
||||
<dt>If I visit a page that I have already added to the home screen, will it be full screen?</dt>
|
||||
<dd>No, whilst you are browsing you will remain in the browser regardless of the fact your web app might be added to the home screen. The page will only launch full screen when launched from the homescreen.</dd>
|
||||
|
||||
<dt>How can I detect if the app is running as an installed app?</dt>
|
||||
<dd>You can’t, directly.</dd>
|
||||
</dl>
|
||||
|
||||
<h2>Best practices</h2>
|
||||
|
||||
<ul>
|
||||
<li>Do not prompt the user to add your app to the homescreen. There is no way to detect if the app is running installed or not.</li>
|
||||
<li>Use the large 196px icon format, as in <code><link rel="shortcut icon" sizes="196x196" href="nice-highres.png"></code> for the highest quality homescreen icons.</li>
|
||||
<li>Use a noun in your document’s title with no temporal information.</li>
|
||||
<li>Use <a href="http://docs.webplatform.org/wiki/apis/appcache/ApplicationCache">AppCache</a> to ensure that your app works or presents the user with an experience when they are offline.</li>
|
||||
<li>Create a clear icon for use on the home screen following the guidance of <a href="http://developer.android.com/design/style/iconography.html#launcher">Android Iconography</a>.</li>
|
||||
</ul>
|
||||
|
|
@ -0,0 +1,58 @@
|
|||
<h1>Android Intents with Chrome</h1>
|
||||
|
||||
<p>A little known feature in Android lets you launch apps directly from a web page via an <a href="http://developer.android.com/guide/components/intents-filters.html">Android Intent</a>. One scenario is launching an app when the user lands on a page, which you can achieve by embedding an iframe in the page with a custom URI-scheme set as the <code>src</code>, as follows: <code><iframe src="paulsawesomeapp://page1"> </iframe></code>. This works in the Chrome for Android browser, version 18 and earlier. It also works in the Android browser, of course.</p>
|
||||
|
||||
<p>The functionality has changed slightly in Chrome for Android, versions 25 and later. It is no longer possible to launch an Android app by setting an iframe's <code>src</code> attribute. For example, navigating an iframe to a URI with a custom scheme such as <code>paulsawesomeapp://</code> will not work even if the user has the appropriate app installed. Instead, you should implement a user gesture to launch the app via a custom scheme, or use the “intent:” syntax described in this article.</p>
|
||||
|
||||
<h2>Syntax</h2>
|
||||
|
||||
<p>The best practice is to construct an intent anchor and embed that into the page so the user can launch the app. This gives you a lot more flexibility in controlling how apps are launched, including the ability to pass extra information into the app via <a href="http://developer.android.com/guide/components/intents-filters.html#extras">Intent Extras</a>.</p>
|
||||
|
||||
<p>The basic syntax for an intent-based URI is as follows:</p>
|
||||
|
||||
<p>intent:<br />
|
||||
HOST/URI-path // Optional host <br />
|
||||
#Intent; <br />
|
||||
package=[string]; <br />
|
||||
action=[string]; <br />
|
||||
category=[string]; <br />
|
||||
component=[string]; <br />
|
||||
scheme=[string]; <br />
|
||||
end; <br />
|
||||
</p>
|
||||
|
||||
<p>See the <a href="https://code.google.com/p/android-source-browsing/source/browse/core/java/android/content/Intent.java?repo=platform--frameworks--base#6514">Android source</a> for parsing details.</p>
|
||||
|
||||
<h2>Example</h2>
|
||||
|
||||
<p>Here's an intent that launches the Zxing barcode scanner app. It follows the syntax thus:</p>
|
||||
|
||||
<p>intent:<br />
|
||||
//scan/<br />
|
||||
#Intent; <br />
|
||||
package=com.google.zxing.client.android; <br />
|
||||
scheme=zxing; <br />
|
||||
end; <br />
|
||||
</p>
|
||||
|
||||
<p>To launch the Zxing barcode scanner app, you encode your <code>href</code> on the anchor as follows:</p>
|
||||
|
||||
<pre>
|
||||
<a href="intent://scan/#Intent;scheme=zxing;package=com.google.zxing.client.android;end"> Take a QR code </a>
|
||||
</pre>
|
||||
|
||||
<p>See the <a href="https://code.google.com/p/zxing/source/browse/trunk/android/AndroidManifest.xml#97">Android Zxing Manifest</a>, which defines the package and the host.</p>
|
||||
|
||||
<h2>Considerations</h2>
|
||||
|
||||
<p>If the activity you invoke via an intent contains <a href="http://developer.android.com/guide/components/intents-filters.html#extras">extras</a>, you can include these as well.</p>
|
||||
|
||||
<p>Only activities that have the category filter, <a href="http://developer.android.com/reference/android/content/Intent.html#CATEGORY_BROWSABLE">android.intent.category.BROWSABLE</a> are able to be invoked using this method as it indicates that the application is safe to open from the Browser.</p>
|
||||
|
||||
<h2>See also</h2>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://developer.android.com/guide/components/intents-filters.html">Android Intents and Intent Filters</a></li>
|
||||
<li><a href="http://developer.android.com/guide/components/activities.html">Android Activities</a></li>
|
||||
</ul>
|
||||
|
|
@ -0,0 +1,7 @@
|
|||
<h1>Google Chrome for iOS</h1>
|
||||
|
||||
<p>Chrome for iOS is designed to be fast. Users search and navigate fast, directly from the same omnibox. Results appear as the user types (prefetching). Users open and quickly switch between an unlimited number of tabs. With sign-in to Chrome, the user's tabs, bookmarks, passwords, and omnibox data sync automatically from other Chrome instances to the iPhone, iPod touch, or iPad, eliminating the delay otherwise inherent with switching between devices. Moreover, the user can send pages from Chrome on the computer to the iPhone, iPod touch, or iPad with one click and read them on the go, even when offline.
|
||||
|
||||
<p>Chrome for iOS is derived from the WebKit browser codebase, as is Apple's Mobile Safari. However, while Apple allows only Safari to access iOS facilities like the iOS Nitro engine, Chrome uses Apple's <a href="http://developer.apple.com/library/ios/#documentation/uikit/reference/UIWebView_Class/Reference/Reference.html">UIWebView</a> for loading and rendering content. Any of the considerations for UIWebView apply to Chrome for iOS. See the <a href="/chrome/mobile/docs/faq.html">Chrome Mobile FAQ</a> for more information.</p>
|
||||
|
||||
<p>There are considerations as well for opening URLs in Chrome for iOS, see <a href="/chrome/mobile/docs/ios-links">Opening links in Chrome</a>.</p>
|
|
@ -0,0 +1,175 @@
|
|||
<h1>Google Chrome for Android</h1>
|
||||
|
||||
<p>Your Android users can experience the fast, clean, and easy to use Chrome interface tailored to mobile devices. Chrome for Android lets you develop HTML5 apps across all devices &emdash; desktop, tablet, and mobile.</p>
|
||||
|
||||
<p>Google Chrome is available on Android devices with Android 4.0 (Ice Cream Sandwich) and later versions. You can also download it from <a href="https://play.google.com/store/apps/details?id=com.android.chrome">Google Play</a>.</p>
|
||||
|
||||
<p>For a complete list of developer features in Chrome, see <a href="http://chromestatus.com/">chromestatus.com</a>.</p>
|
||||
|
||||
<h2 id="html5features">A first-class browsing experience</h2>
|
||||
|
||||
<p>When the user signs into Chrome on one device, the tabs and browsing history of that session are available to the user when she signs into Chrome on another device. Note, it's the entire page content that gets synchronized between Chrome instances, not just the URL, so the user doesn't have to resubmit credentials to see a boarding pass or an article on a site that requires a login.</p>
|
||||
|
||||
<p>The address bar uses prefetching to fill in URLs and performs search queries with suggestions based on browsing history and local bookmarks. To save bandwidth, this feature only runs when the user is connected to a wifi network.</p>
|
||||
|
||||
<p>Highlights of this user experience include:</p>
|
||||
|
||||
<ul>
|
||||
<li>Smooth scrolling of independent elements on the same page</li>
|
||||
<li>Fixed-position elements that hold their spot while the user scrolls through the page</li>
|
||||
<li>Native inertial scrolling by default</li>
|
||||
<li>A much improved <a href="http://www.html5rocks.com/mobile/touch.html">multi-touch</a> implementation</li>
|
||||
<li>HTML date/time pickers</li>
|
||||
<li><a href="https://bugs.webkit.org/show_bug.cgi?id=84186">Text auto-sizing</a>, also known as font boosting
|
||||
</ul>
|
||||
|
||||
<p>With these improvements, Chrome for Android enables interactive mobile web experiences, as illustrated in these snapshots:</p>
|
||||
|
||||
<div class="foo">
|
||||
<p>
|
||||
<style>
|
||||
.foo img {
|
||||
float: left;
|
||||
width: 180px;
|
||||
margin: 0 10px 20px 0;
|
||||
}
|
||||
div.clr { clear: both; }
|
||||
</style>
|
||||
|
||||
<img src="/chrome/mobile/images/samples/gmail.png"/>
|
||||
<img src="/chrome/mobile/images/samples/soundcloud.png"/>
|
||||
<img src="/chrome/mobile/images/samples/grooveshark.png"/>
|
||||
<img src="/chrome/mobile/images/samples/twitter.png"/>
|
||||
<img src="/chrome/mobile/images/samples/workflowy.png"/>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<div class="clr"></div>
|
||||
|
||||
<p>See all the <a href="http:/www.google.com/intl/en/chrome/android/features.html">Chrome for Android features</a> such as tabs, incognito mode, and sync across devices for the user's Google account.</p>
|
||||
|
||||
<p>Enter <code>chrome://about</code> in the Chrome address bar to see more information about Chrome features.</li>
|
||||
|
||||
<h2>Performance</h2>
|
||||
|
||||
<p>Chrome for Android brings to small devices the same multi-process architecture, GPU-accelerated rendering, and the V8 JavaScript engine - all optimized for mobile architectures. Chrome for Android delivers fast graphics performance through:</p>
|
||||
|
||||
<ul>
|
||||
<li>GPU acceleration for the <a href="http://www.html5rocks.com/tutorials/canvas/performance"><code>canvas</code> element</a></li>
|
||||
<li>Fluid CSS3 transforms and transitions</li>
|
||||
<li>Support for <code>requestAnimationFrame</code> for more efficient animations</li>
|
||||
</ul>
|
||||
|
||||
<h2>Use Developer Tools to find problems—and fix them</h2>
|
||||
|
||||
<p>Debugging web pages on the small screen is difficult. There's just not enough real estate to inspect elements and resources on the device. Now you can debug mobile web sites with the full suite of <a href="chrome-developer-tools">Chrome Developer Tools</a> running on a desktop browser that's connected to your phone via USB. See <a href="/chrome/mobile/docs/debugging">Remote Debugging</a> for further details.</p>
|
||||
|
||||
<p>In addition to the powerful Chrome Developer Tools, Chrome for Android
|
||||
provides more advanced developer features:</p>
|
||||
<ul>
|
||||
<li>GPU diagnostics: <code>chrome://gpu-internals</code></li>
|
||||
<li>AppCache debugging: <code>chrome://appcache-internals</code></li>
|
||||
<li>Net stack debugging: <code>chrome://net-internals</code></li>
|
||||
</ul>
|
||||
|
||||
<p>You can also use the <a href="http://docs.webplatform.org/wiki/apis/resource_timing">Resource Timing</a> and <a href="http://docs.webplatform.org/wiki/apis/user_timing">User Timing</a> APIs to analyze application performance.</p>
|
||||
|
||||
<h2>Working offline</h2>
|
||||
|
||||
<p>Working online is convenient, but connections sometimes fail when the signal
|
||||
is blocked or nonexistent. Chrome for Android supports the latest open web
|
||||
HTML5 features that address this concern, including:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://docs.webplatform.org/wiki/tutorials/appcache_beginner
|
||||
">AppCache</a> or application cache.</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/apis/filesystem">FileSystem</a> and <a href="http://docs.webplatform.org/wiki/apis/file">File APIs</a> (File, FileList, FileReader, Blob)</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/tutorials/offline_storage">localStorage</a> for storing simple key-value pairs</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/tutorials/web_databases">WebSQL</a> for relational data (deprecated)</li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/IndexedDB">IndexedDB</a>, a standard indexed data store</li>
|
||||
</ul>
|
||||
|
||||
<p>For more about off-line storage, see <a
|
||||
href="http://docs.webplatform.org/wiki/tutorials/offline_and_storage">these articles</a>.</p>
|
||||
|
||||
<h2>Standards and APIs</h2>
|
||||
|
||||
<p>Chrome for Android supports HTML5 development with many features.</p>
|
||||
|
||||
<h3>CSS and presentation</h3>
|
||||
|
||||
<p>New CSS3 artifacts are available:</p>
|
||||
|
||||
<ul>
|
||||
<li>Support for the standard <a href="http://docs.webplatform.org/wiki/css/functions/calc">CSS calc</a> function (prefixed as -webkit-calc)</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/tutorials/css_filters">CSS Filters</a> are supported (prefixed as -webkit-filter)</li>
|
||||
<li>The <a href="https://developer.mozilla.org/en-US/docs/CSS/Using_CSS_flexible_boxes">Flexbox</a> layout model is fully supported (prefixed as -webkit-flex)</li>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/CSS/length">Viewport units</a>, <code>vh</code>, <code>vmin</code>, and <code>vw</code> for responsive design</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/css/atrules/@supports">@supports</a> conditional blocks to test whether Chromium supports certain property/value pairs</li>
|
||||
<li>The <a href="https://plus.google.com/+EricBidelman/posts/bbK5scDoPnc">:unresolved CSS pseudo-class</a> that lets you style a custom element that hasn’t been registered in the browser yet (custom elements are part of the <a href="https://dvcs.w3.org/hg/webcomponents/raw-file/tip/explainer/index.html#introduction">Web Components</a> standard in development)</li>
|
||||
</ul>
|
||||
|
||||
<h3>Elements</h3>
|
||||
|
||||
<p>Newer standard HTML5 elements supported include the following:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://developer.mozilla.org/en-US/docs/HTML/Element/iframe">iframe</a> elements with seamless, srcdoc, and sandbox attributes</li>
|
||||
<li><a href="http://www.html5rocks.com/tutorials/webcomponents/shadowdom/">Shadow DOM</a> is now exposed via <code>element.webkitCreateShadowRoot()</code>.</li>
|
||||
<li>The <a href="https://developer.mozilla.org/en-US/docs/HTML/Element/track">track</a> element, for use with the audio and video tags, lets you set metadata, subtitles, and so forth</li>
|
||||
<li>The <a href="http://docs.webplatform.org/wiki/tutorials/mobile_viewport">viewport</a> element that provides for a better presentation of web pages on mobile devices</li>
|
||||
</ul>
|
||||
|
||||
|
||||
<h3>Device APIs</h3>
|
||||
|
||||
<p>In a mobile world, it's important to be able to access your user's
|
||||
contextual surroundings, from location and device orientation to camera access. Chrome for Android provides:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="http://docs.webplatform.org/wiki/apis/geolocation">Geolocation API</a> for accessing location</li>
|
||||
<li><a href="http://www.w3.org/TR/2010/WD-html-media-capture-20100928/">HTML media capture</a> for camera access</li>
|
||||
<li><a href="http://www.html5rocks.com/tutorials/device/orientation/">Device orientation</a> for portrait vs. landscape orientation</li>
|
||||
<li><a href="http://developer.android.com/guide/appendix/g-app-intents.html">Android Intent URIs</a> such as <code>tel:</code> and <code>geo:</code> that give access to the dialer and Google maps</li>
|
||||
</ul>
|
||||
|
||||
<h3>Standard APIs</h3>
|
||||
|
||||
<p>Chrome for Android supports many HTML5 APIs that are ready to use in your apps.</p>
|
||||
<ul>
|
||||
<li><a href="http://www.html5rocks.com/en/tutorials/speed/animations/">requestAnimationFrame</a> to achieve optimum animation performance</li>
|
||||
<li>Interactive communication between server and client with <a href="https://developer.mozilla.org/en-US/docs/WebSockets">WebSockets</a>.</li>
|
||||
<li>Multi-threading with <a href="http://www.html5rocks.com/en/tutorials/workers/basics/">Web Workers</a> (dedicated only)</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/dom/methods/requestFullscreen">requestFullscreen</a> method (presently via the prefixed call, <code>webkitRequestFullScreen()</code>) to allow you to hide the browser UI (chrome)</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/apis/webrtc">WebRTC</a> for real-time communication without a plug-in</li>
|
||||
<li><a href="http://docs.webplatform.org/wiki/apis/webaudio">WebAudio</a> to process and synthesize audio signals</li>
|
||||
<li>Experimental support (via <code>chrome://flags</code> in the Chrome address bar) for the following APIs:
|
||||
<ul>
|
||||
<li><a href="http://docs.webplatform.org/wiki/tutorials/getting_started_with_webgl">WebGL</a> for creating three-dimensional graphics for web browsers</li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3>Security</h3>
|
||||
|
||||
<p>Chrome for Android supports <a href="http://docs.webplatform.org/wiki/tutorials/content-security-policy">Content Security Policy</a> to significantly reduce the risk and impact of XSS attacks, using the standard (non-prefixed) HTTP header, <code>Content-Security-Policy</code>.</p>
|
||||
|
||||
<h2>More resources</h3>
|
||||
|
||||
<p>For a complete list of developer features in Chrome, see <a href="http://chromestatus.com/">chromestatus.com</a>.</p>
|
||||
|
||||
<p>Find more information about open web platform APIs and technologies for mobile on <a href="http://docs.webplatform.org/wiki/concepts/mobile_web">WebPlatform.org</a>.</p>
|
||||
|
||||
<h2>Known issues</h2>
|
||||
|
||||
<p>Development is still underway, and there are many
|
||||
additional features being added to Google Chrome for Android. For current
|
||||
status, see the issues list at <a href="http://mcrbug.com">mcrbug.com</a> and
|
||||
star the ones you need the most. If you find a new issue, log it using
|
||||
<a href="http://new.mcrbug.com">new.mcrbug.com</a>.</p>
|
||||
|
||||
<h2>Share your thoughts</h2>
|
||||
|
||||
<p>If you run into a mobile web development problem and would like help, please post it to <a href="http://stackoverflow.com/questions/tagged/google-chrome+android">Stack Overflow</a> using the <a href="http://stackoverflow.com/questions/tagged/google-chrome">[google-chrome]</a> and <a href="http://stackoverflow.com/questions/tagged/android">[android]</a> tags.</p>
|
||||
|
||||
|
|
@ -0,0 +1,13 @@
|
|||
<h1>Case Study: Pocket Uses x-callback</h1>
|
||||
|
||||
<p><a href="http://getpocket.com">Pocket</a> provides a cross-device experience where users can save articles and almost any other type of web content to view later, on or offline. The Pocket team strives to make taking any type of content with you “as simple an action as putting it in your pocket.”</p>
|
||||
|
||||
<img src="/chrome/mobile/images/pocket.png" style="width: 50%; height: 50%; float:left; margin-right:30px; margin-bottom:5px;"/>
|
||||
|
||||
<p>Pocket excels at presenting that content in a clean, clutter-free viewing experience across platforms. Still, there are times when users want access to a full browsing experience. In addition, Pocket notes, "Chrome users spend nearly 30% more time in the app than users of the next leading browser."</p>
|
||||
|
||||
<p>Chrome <a href="/chrome/mobile/docs/ios-links#callback">callback</a> enables Pocket to pass users seamlessly between Chrome browser and the Pocket app while maintaining Pocket’s simple design. Now, users, which save over 43 million items a month, have a quick and intuitive way to return to the Pocket app while viewing their saved content on the web.</p>
|
||||
|
||||
<p>With a growing base of engaged, tech-savvy users, Pocket looks to continue enhancing the way its more than 9.5 million users discover and consume content.</p>
|
||||
|
||||
|
Загрузка…
Ссылка в новой задаче