Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4495)

Unified Diff: chrome/common/extensions/docs/examples/tutorials/getstarted/popup.js

Issue 732943002: New Getting started example for extensions (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/common/extensions/docs/examples/tutorials/getstarted/popup.js
diff --git a/chrome/common/extensions/docs/examples/tutorials/getstarted/popup.js b/chrome/common/extensions/docs/examples/tutorials/getstarted/popup.js
index bdbe548d457cf40f2945c1af0ab8ae61a6b4e2cf..0a1a444ac58f2ab3bf4783db6a4b63c9f88b4093 100644
--- a/chrome/common/extensions/docs/examples/tutorials/getstarted/popup.js
+++ b/chrome/common/extensions/docs/examples/tutorials/getstarted/popup.js
@@ -1,83 +1,104 @@
-// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Copyright (c) 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
- * Global variable containing the query we'd like to pass to Flickr. In this
- * case, kittens!
+ * Get the current URL.
*
- * @type {string}
- */
-var QUERY = 'kittens';
+ * @param {function(string)} callback - called when the URL of the current tab
+ * is found.
+ **/
+function getCurrentTabUrl(callback) {
+ // Query filter to be passed to chrome.tabs.query - see
+ // https://developer.chrome.com/extensions/tabs#method-query
+ var queryInfo = {
+ active: true,
+ currentWindow: true
+ };
+
+ chrome.tabs.query(queryInfo, function(tabs) {
+ // chrome.tabs.query invokes the callback with a list of tabs that match the
+ // query. When the popup is opened, there is certainly a window and at least
+ // one tab, so we can safely assume that |tabs| is a non-empty array.
+ // A window can only have one active tab at a time, so the array consists of
+ // exactly one tab.
+ var tab = tabs[0];
+
+ // A tab is a plain object that provides information about the tab.
+ // See https://developer.chrome.com/extensions/tabs#type-Tab
+ var url = tab.url;
-var kittenGenerator = {
- /**
- * Flickr URL that will give us lots and lots of whatever we're looking for.
- *
- * See http://www.flickr.com/services/api/flickr.photos.search.html for
- * details about the construction of this URL.
- *
- * @type {string}
- * @private
- */
- searchOnFlickr_: 'https://secure.flickr.com/services/rest/?' +
- 'method=flickr.photos.search&' +
- 'api_key=90485e931f687a9b9c2a66bf58a3861a&' +
- 'text=' + encodeURIComponent(QUERY) + '&' +
- 'safe_search=1&' +
- 'content_type=1&' +
- 'sort=interestingness-desc&' +
- 'per_page=20',
+ // tab.url is not set when you forget to declare the "tabs" permission in
+ // manifest.json.
not at google - send to devlin 2014/11/17 22:02:57 You should be able to rely on activeTab to get the
robwu 2014/11/17 22:26:11 Done.
+ console.assert(typeof url == 'string', 'tab.url should be a string');
- /**
- * Sends an XHR GET request to grab photos of lots and lots of kittens. The
- * XHR's 'onload' event is hooks up to the 'showPhotos_' method.
- *
- * @public
- */
- requestKittens: function() {
- var req = new XMLHttpRequest();
- req.open("GET", this.searchOnFlickr_, true);
- req.onload = this.showPhotos_.bind(this);
- req.send(null);
- },
+ callback(url);
+ });
- /**
- * Handle the 'onload' event of our kitten XHR request, generated in
- * 'requestKittens', by generating 'img' elements, and stuffing them into
- * the document for display.
- *
- * @param {ProgressEvent} e The XHR ProgressEvent.
- * @private
- */
- showPhotos_: function (e) {
- var kittens = e.target.responseXML.querySelectorAll('photo');
- for (var i = 0; i < kittens.length; i++) {
- var img = document.createElement('img');
- img.src = this.constructKittenURL_(kittens[i]);
- img.setAttribute('alt', kittens[i].getAttribute('title'));
- document.body.appendChild(img);
+ // Most methods of the Chrome extension APIs are asynchronous. This means that
+ // you CANNOT do something like this:
+ //
+ // var url;
+ // chrome.tabs.query(queryInfo, function(tabs) {
+ // url = tabs[0].url;
+ // });
+ // alert(url); // Shows "undefined", because chrome.tabs.query is async.
+}
+
+/**
+ * @param {string} searchTerm - Search term for Google Image search.
+ * @param {function(string)} callback - Called when an image has been found.
+ * The callback gets the URL of the image.
+ * @param {function(string)} errorCallback - Called when the image is not found.
+ * The callback gets a string that describes the failure reason.
+ */
+function getImageUrl(searchTerm, callback, errorCallback) {
+ // Google image search - 100 searches per day.
+ var searchUrl = 'https://ajax.googleapis.com/ajax/services/search/images' +
+ '?v=1.0&q=' + encodeURIComponent(searchTerm);
+ var x = new XMLHttpRequest();
+ x.open('GET', searchUrl);
+ // The Google image search API responds with JSON, so let Chrome parse it.
+ x.responseType = 'json';
+ x.onload = function() {
+ // Parse and process the response from Google Image Search.
not at google - send to devlin 2014/11/17 22:02:57 Does it reply with any sizing info? It'd be nice t
robwu 2014/11/17 22:26:11 Yes, the size is available. I have not used it tho
not at google - send to devlin 2014/11/17 23:14:03 The practical effect would be to avoid unnecessary
robwu 2014/11/17 23:18:54 What did you mean by that? Whether I can observe t
not at google - send to devlin 2014/11/17 23:24:05 An advantage of setting it up-front is that there'
robwu 2014/11/17 23:26:47 Okay, sounds plausible. I will submit a change tom
+ var response = x.response;
+ if (!response || !response.responseData || !response.responseData.results ||
+ response.responseData.results.length === 0) {
+ errorCallback('No response from Google Image search!');
+ return;
}
- },
+ var firstResult = response.responseData.results[0];
+ var imageUrl = firstResult.url;
+ callback(imageUrl);
+ };
+ x.onerror = function() {
+ errorCallback('Network error.');
+ };
+ x.send();
+}
+
+function renderStatus(statusText) {
+ document.getElementById('status').textContent = statusText;
+}
+
+function main() {
+ getCurrentTabUrl(function(url) {
+ // Put the image URL in Google search.
+ renderStatus('Performing Google Image search for ' + url);
+
+ getImageUrl(url, function(imageUrl) {
+
+ renderStatus('Search term: ' + url + '\n' +
+ 'Google image search result: ' + imageUrl);
+ document.getElementById('image-result').src = imageUrl;
- /**
- * Given a photo, construct a URL using the method outlined at
- * http://www.flickr.com/services/api/misc.urlKittenl
- *
- * @param {DOMElement} A kitten.
- * @return {string} The kitten's URL.
- * @private
- */
- constructKittenURL_: function (photo) {
- return "http://farm" + photo.getAttribute("farm") +
- ".static.flickr.com/" + photo.getAttribute("server") +
- "/" + photo.getAttribute("id") +
- "_" + photo.getAttribute("secret") +
- "_s.jpg";
- }
-};
+ }, function(errorMessage) {
+ renderStatus('Cannot display image. ' + errorMessage);
+ });
+ });
+}
-// Run our kitten generation script as soon as the document's DOM is ready.
-document.addEventListener('DOMContentLoaded', function () {
- kittenGenerator.requestKittens();
+document.addEventListener('DOMContentLoaded', function() {
+ main();
});
not at google - send to devlin 2014/11/17 22:02:57 You could do just document.addEventListener('DOMC
robwu 2014/11/17 22:26:11 Done.

Powered by Google App Engine
This is Rietveld 408576698