Check whether user has a Chrome extension installed

前端 未结 16 2066
一向
一向 2020-11-22 08:50

I am in the process of building a Chrome extension, and for the whole thing to work the way I would like it to, I need an external JavaScript script to be able to detect if

相关标签:
16条回答
  • 2020-11-22 09:11

    Here is an other modern approach:

    const checkExtension = (id, src, callback) => {
        let e = new Image()
        e.src = 'chrome-extension://'+ id +'/'+ src
        e.onload = () => callback(1), e.onerror = () => callback(0)
    }
    
    // "src" must be included to "web_accessible_resources" in manifest.json
    checkExtension('gighmmpiobklfepjocnamgkkbiglidom', 'icons/icon24.png', (ok) => {
        console.log('AdBlock: %s', ok ? 'installed' : 'not installed')
    })
    checkExtension('bhlhnicpbhignbdhedgjhgdocnmhomnp', 'images/checkmark-icon.png', (ok) => {
        console.log('ColorZilla: %s', ok ? 'installed' : 'not installed')
    })
    
    0 讨论(0)
  • 2020-11-22 09:12

    I thought I would share my research on this. I needed to be able to detect if a specific extension was installed for some file:/// links to work. I came across this article here This explained a method of getting the manifest.json of an extension.

    I adjusted the code a bit and came up with:

    function Ext_Detect_NotInstalled(ExtName, ExtID) {
      console.log(ExtName + ' Not Installed');
      if (divAnnounce.innerHTML != '')
        divAnnounce.innerHTML = divAnnounce.innerHTML + "<BR>"
    
      divAnnounce.innerHTML = divAnnounce.innerHTML + 'Page needs ' + ExtName + ' Extension -- to intall the LocalLinks extension click <a href="https://chrome.google.com/webstore/detail/locallinks/' + ExtID + '">here</a>';
    }
    
    function Ext_Detect_Installed(ExtName, ExtID) {
      console.log(ExtName + ' Installed');
    }
    
    var Ext_Detect = function (ExtName, ExtID) {
      var s = document.createElement('script');
      s.onload = function () { Ext_Detect_Installed(ExtName, ExtID); };
      s.onerror = function () { Ext_Detect_NotInstalled(ExtName, ExtID); };
      s.src = 'chrome-extension://' + ExtID + '/manifest.json';
      document.body.appendChild(s);
    }
    
    var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
    
    if (is_chrome == true) {
      window.onload = function () { Ext_Detect('LocalLinks', 'jllpkdkcdjndhggodimiphkghogcpida'); };
    }
    

    With this you should be able to use Ext_Detect(ExtensionName,ExtensionID) to detect the installation of any number of extensions.

    0 讨论(0)
  • 2020-11-22 09:14

    If you have control over the Chrome extension, you can try what I did:

    // Inside Chrome extension
    var div = document.createElement('div');
    div.setAttribute('id', 'myapp-extension-installed-div');
    document.getElementsByTagName('body')[0].appendChild(div);
    

    And then:

    // On web page that needs to detect extension
    if ($('#myapp-extension-installed-div').length) {
    
    }
    

    It feels a little hacky, but I couldn't get the other methods to work, and I worry about Chrome changing its API here. It's doubtful this method will stop working any time soon.

    0 讨论(0)
  • 2020-11-22 09:15

    Here is how you can detect a specific Extension installed and show a warning message.

    First you need to open the manifest file of the extension by going to chrome-extension://extension_id_here_hkdppipefbchgpohn/manifest.json and look for any file name within "web_accessible_resources" section.

    <div class="chromewarning" style="display:none">
        <script type="text/javascript">
                                $.get("chrome-extension://extension_id_here_hkdppipefbchgpohn/filename_found_in_ web_accessible_resources.png").done(function () {
                                  $(".chromewarning").show();
                                }).fail(function () {
                                 //  alert("failed.");
                                });
                            </script>
                            <p>We have detected a browser extension that conflicts with learning modules in this course.</p>
                </div>
    
    0 讨论(0)
  • 2020-11-22 09:17

    Your extension could interact with the website (e.g. changing variables) and your website could detect this.

    But there should be a better way to do this. I wonder how Google is doing it on their extension gallery (already installed applications are marked).

    Edit:

    The gallery use the chrome.management.get function. Example:

    chrome.management.get("mblbciejcodpealifnhfjbdlkedplodp", function(a){console.log(a);});
    

    But you can only access the method from pages with the right permissions.

    0 讨论(0)
  • 2020-11-22 09:18

    I am sure there is a direct way (calling functions on your extension directly, or by using the JS classes for extensions), but an indirect method (until something better comes along):

    Have your Chrome extension look for a specific DIV or other element on your page, with a very specific ID.

    For example:

    <div id="ExtensionCheck_JamesEggersAwesomeExtension"></div>
    

    Do a getElementById and set the innerHTML to the version number of your extension or something. You can then read the contents of that client-side.

    Again though, you should use a direct method if there is one available.


    EDIT: Direct method found!!

    Use the connection methods found here: https://developer.chrome.com/extensions/extension#global-events

    Untested, but you should be able to do...

    var myPort=chrome.extension.connect('yourextensionid_qwerqweroijwefoijwef', some_object_to_send_on_connect);
    
    0 讨论(0)
提交回复
热议问题