Skip to content

Instantly share code, notes, and snippets.

@CrashenX
Last active May 6, 2023 00:20

Revisions

  1. Jesse J. Cook revised this gist Sep 11, 2016. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion popup.js
    Original file line number Diff line number Diff line change
    @@ -57,10 +57,10 @@ function getCurrentTabUrl(callback) {
    function getImageUrl(searchTerm, callback, errorCallback) {
    // Google image search - 100 searches per day.
    // https://developers.google.com/custom-search/json-api/v1/using_rest
    var searchUrl = 'https://www.googleapis.com/customsearch/v1?searchType=image'
    var cx = 'insert-your-cx-from:https://cse.google.com'
    // WARNING: Hard-coding your api key in code is really insecure
    var key = 'insert-your-key-from:https://console.developers.google.com'
    var searchUrl = 'https://www.googleapis.com/customsearch/v1?searchType=image'
    + '&cx=' + encodeURIComponent(cx)
    + '&key=' + encodeURIComponent(key)
    + '&q=' + encodeURIComponent(searchTerm);
  2. Jesse J. Cook created this gist Sep 11, 2016.
    122 changes: 122 additions & 0 deletions popup.js
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,122 @@
    // 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/custom-search/json-api/v1/using_rest
    var searchUrl = 'https://www.googleapis.com/customsearch/v1?searchType=image'
    var cx = 'insert-your-cx-from:https://cse.google.com'
    // WARNING: Hard-coding your api key in code is really insecure
    var key = 'insert-your-key-from:https://console.developers.google.com'
    + '&cx=' + encodeURIComponent(cx)
    + '&key=' + encodeURIComponent(key)
    + '&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.items || !response.items.length) {
    errorCallback('No response from Google Image search')
    return;
    }
    var firstResult = response.items[0];
    // Take the thumbnail instead of the full image to get an approximately
    // consistent image size.
    var imageUrl = firstResult.image.thumbnailLink;
    var width = parseInt(firstResult.image.thumbnailWidth);
    var height = parseInt(firstResult.image.thumbnailHeight);
    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);
    });
    });
    });