Search code examples
javascriptuserscriptstampermonkeychrome-web-store

How to detect if a userscript is installed from the Chrome Store?


I want to notify the user when an update for my Greasemonkey/UserScript is available. However when the user has installed the script from the Chrome Web Store, I don't want to bother because it has auto-update functionality.

I first thought about using $.browser==chrome but it is also possible that a Chrome user has installed it using Tampermonkey. (Furthermore if the site would update jQuery, $.browser would stop working)

So, is it possible to detect that it is a UserScript installed through the Chrome Web Store?


Solution

  • Probably best to just let the user know that an update is available, and not worry about the platform. Also it's not clear how cross-browser this script is. You may have to resort to browser sniffing (not usually recommended) to be absolutely sure.


    You can use the scriptHandler property of the GM_info object, if you are only concerned about Chrome and/or Firefox:

    // ==UserScript==
    // @name     _Rough script handler detector
    // @include  http://YOUR_SERVER.COM/YOUR_PATH/*
    // ==/UserScript==
    var scriptEngine;
    
    if (typeof GM_info === "undefined") {
        scriptEngine = "plain Chrome (Or Opera, or scriptish, or Safari, or rarer)";
        // See https://stackoverflow.com/a/2401861/331508 for optional browser sniffing code.
    }
    else {
        scriptEngine = GM_info.scriptHandler  ||  "Greasemonkey";
    }
    console.log ('This userscript is running on ' + scriptEngine + '.');
    

    Which yields:
    Tampermonkey:

    This userscript is running on Tampermonkey.

    Greasemonkey (Strictly Firefox):

    This userscript is running on Greasemonkey.

    Chrome from the web store, or other:

    This userscript is running on plain Chrome (Or Opera, or scriptish, or Safari, or rarer).

    Because only the big engines (Greasemonkey and Tampermonkey) currently support GM_info, if your userscript is especially cross-browser, you will need to do browser sniffing to differentiate in rarer cases.
    See this answer for browser-sniffing code that doesn't require jQuery.


    Note: A @grant directive is not needed to use GM_info.