mjmiller814
mjmiller814

Reputation: 15

Problems with Manually Installing an Extension

Okay, so here's my problem:

On my home computer, I have a Google Chrome Extension installed - WXFZ's \Code. This extension works perfectly, I use it every day for work purposes. However, I guess the developer gave up on it, because it can no longer be found on the Google Extensions download page.

I'm trying to transfer that extension from my home computer to my office computer. I have the extension folder on my work computer and I've tried dragging and dropping it into the extensions page to install it, but I receive an error:

"Could not load extension from 'U:\Downloads\pekinghlicdifnlgafajjohhoiochfdh\2.1_0'. The 'manifest_version' key must be present and set to 2 (without quotes). See developer.chrome.com/extensions/manifestVersion.html for details."

I'm not entirely sure what that means, but I've copied the contents of the manifest folder below. I've tried changing some things around in the manifest file, but nothing would work :/

{
   "app": {
      "launch": {
         "local_path": "bscode.html"
      }
   },
   "background_page": "storage.html",
   "content_scripts": [ {
      "all_frames": true,
      "js": [ "js/jquery-1.4.4.min.js", "js/bscode.js", "js/bscode-cs.js" ],
      "matches": [ "http://*/*", "https://*/*" ]
   } ],
   "description": "Simple \\code and \\\\macro engine for common web-forms.",
   "icons": {
      "128": "icon_128.png",
      "16": "icon.png",
      "48": "icon_48.png"
   },
   "key":        "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClVb9xGcyZp3P4Fe+rpjGUqVrvRq8rqQl278gMjFzmxqD65cu7uf/erOBlFWbAc6YK15yvgnsYn+HDYvoSV4shajLAnytek7CI35nia5AnYACJsXW+JrfoT9pEgK9Zd4fE1XFr8bNCzhwKeoupH+gtMdvJ9lqAN4Xj/Tam5+QvzQIDAQAB",
   "name": "wxfz\u2019s \\code",
   "permissions": [ "http://*/*", "https://*/*", "tabs" ],
   "update_url": "http://clients2.google.com/service/update2/crx",
   "version": 2
}

Any advice on this problem, I'd appreciate it. Like I said, the extension still works; I was assuming there has to be a way to get it to work on my other computer :/

UPDATE

My apologies, the updated source code is :

{
   "app": {
      "launch": {
         "local_path": "bscode.html"
      }
   },
   "background_page": "storage.html",
   "content_scripts": [ {
      "all_frames": true,
      "js": [ "js/jquery-1.4.4.min.js", "js/bscode.js", "js/bscode-cs.js" ],
      "matches": [ "http://*/*", "https://*/*" ]
   } ],
   "description": "Simple \\code and \\\\macro engine for common web-forms.",
   "icons": {
      "128": "icon_128.png",
      "16": "icon.png",
      "48": "icon_48.png"
   },
   "key":"MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQClVb9xGcyZp3P4Fe+rpjGUqVrvRq8rqQl278gMjFzmxqD65cu7uf/erOBlFWbAc6YK15yvgnsYn+HDYvoSV4shajLAnytek7CI35nia5AnYACJsXW+JrfoT9pEgK9Zd4fE1XFr8bNCzhwKeoupH+gtMdvJ9lqAN4Xj/Tam5+QvzQIDAQAB",
   "name": "wxfz\u2019s \\code",
   "permissions": [ "http://*/*", "https://*/*", "tabs" ],
   "update_url": "http://clients2.google.com/service/update2/crx",
   "version": "2.1"
   "manifest_version": 2

}

In the original post I had:

"version": 2

I see now that was incorrect, it was supposed to be 2.1, so I changed that back, along with making the changes you suggested.

Upvotes: 0

Views: 668

Answers (1)

gkalpak
gkalpak

Reputation: 48212

The error you get is asking for a "manifest_version": 2 property in your manifest.json. So, at the very least youneed to:

  1. Change "version": 2 to "version": "2" (version must be a string value).
  2. Add "manifest_version": 2 (2 without quotes - it's a number value).
  3. Change "background_page": "storage.html", to "background": {"page": "storage.html"},.

Beware though that some features may break and need refactoring as well (in order to conform with manifest v2).


UPDATE:

It turned out there were quite a few things that needed to be changed in order for the extension to be compliant with Manifest V2 (and functional). The re is no point in posting the code here or list every single modification in detail, so I'll try to summarize and focus on the "nature" of the modification (see further down for a link to the updated source code):

The major source of problems was the fact that the new Content Security Policy (CSP) that applies to Google Chrome Extensions does not allow eval and inline scripts/event listeners. To circumvent this the following changes were necessary:

  1. Declare a CSP in the manifest that allows eval
    ("content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'").
    Unfortunately(?) there is no way to relax the policy against inline scripts.

  2. In the background page (namely storage.html, an inline script was used, so I ended up moving the code to an external file (background.js) and including the JS scripts like this:

    "background": {
       "persistent": true,
       "scripts": [
           "js/bscode.js",
           "js/background.js"
       ]
    },
    
  3. The old jquery-1.4.4 (which relies on inline scripting) was a no go as well. So I had to replace to the less old jquery-1.7.2 (I tried using the latest versions of jquery and jquery-ui, but they didn't play well with the rest of the code, so I rolled back to the oldest version that didn't rely on inline scripting). This change affected both the content_scripts declaration and bscode.html (where the user-defined macros are defined and edited).

  4. Migrating to jquery-1.7.2 required porting all occurrences of the deprecated .live() to the equivalent syntax using .on(). (Luckily, this only affected one file: chrome-ui.js)

  5. bscode.html had 2 inline scripts that needed to be moved to an external file (and placed at the right place inside the body, since the code calls document.write.

  6. bscode.html had a lot of inline event listeners, which would not work. Furthermore, elements (which also contain inline event listeners) are inserted dynamicaly into the DOM, so the solution had to take that into account as well.
    I tackled both the problems by using an external JS file that utilizes a MutationObserver to listen for node insertions and convert any inline event listeners to "attached" event listeners (by means of addEventListener()).

Finally, to make things easier, I set-up bscode.html as the Options Page for the extension, so you can quickly bring it up from the chrome://exrensions page.

(I hope I didn't leave something out...)

The refactored (and fully functional as far as I can tell) source code of the extension can be downloaded here.

Upvotes: 1

Related Questions