| // 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); |
| }); |
| }); |
| }); |