123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- // 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.
-
- /**
- * Get the current URL.
- *
- * @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;
-
- // tab.url is only available if the "activeTab" permission is declared.
- // If you want to see the URL of other tabs (e.g. after removing active:true
- // from |queryInfo|), then the "tabs" permission is required to see their
- // "url" properties.
- console.assert(typeof url == 'string', 'tab.url should be a string');
-
- callback(url);
- });
-
- // 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,number,number)} callback - Called when an image has
- * been found. The callback gets the URL, width and height 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.
- // https://developers.google.com/image-search/
- 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.
- 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];
- // Take the thumbnail instead of the full image to get an approximately
- // consistent image size.
- var imageUrl = firstResult.tbUrl;
- var width = parseInt(firstResult.tbWidth);
- var height = parseInt(firstResult.tbHeight);
- console.assert(
- typeof imageUrl == 'string' && !isNaN(width) && !isNaN(height),
- 'Unexpected respose from the Google Image Search API!');
- callback(imageUrl, width, height);
- };
- x.onerror = function() {
- errorCallback('Network error.');
- };
- x.send();
- }
-
- function renderStatus(statusText) {
- document.getElementById('status').textContent = statusText;
- }
-
- document.addEventListener('DOMContentLoaded', function() {
- getCurrentTabUrl(function(url) {
- // Put the image URL in Google search.
- renderStatus('Performing Google Image search for ' + url);
-
- getImageUrl(url, function(imageUrl, width, height) {
-
- renderStatus('Search term: ' + url + '\n' +
- 'Google image search result: ' + imageUrl);
- var imageResult = document.getElementById('image-result');
- // Explicitly set the width/height to minimize the number of reflows. For
- // a single image, this does not matter, but if you're going to embed
- // multiple external images in your page, then the absence of width/height
- // attributes causes the popup to resize multiple times.
- imageResult.width = width;
- imageResult.height = height;
- imageResult.src = imageUrl;
- imageResult.hidden = false;
-
- }, function(errorMessage) {
- renderStatus('Cannot display image. ' + errorMessage);
- });
- });
- });
|