Browse Source

Add chrome-extension protocol for loading devtools extensions.

Cheng Zhao 10 years ago
parent
commit
cd40bdbec8
3 changed files with 45 additions and 0 deletions
  1. 1 0
      atom.gyp
  2. 41 0
      atom/browser/lib/chrome-extension.coffee
  3. 3 0
      atom/browser/lib/init.coffee

+ 1 - 0
atom.gyp

@@ -28,6 +28,7 @@
       'atom/browser/api/lib/protocol.coffee',
       'atom/browser/api/lib/tray.coffee',
       'atom/browser/api/lib/web-contents.coffee',
+      'atom/browser/lib/chrome-extension.coffee',
       'atom/browser/lib/init.coffee',
       'atom/browser/lib/objects-registry.coffee',
       'atom/browser/lib/rpc-server.coffee',

+ 41 - 0
atom/browser/lib/chrome-extension.coffee

@@ -0,0 +1,41 @@
+app  = require 'app'
+fs   = require 'fs'
+path = require 'path'
+url  = require 'url'
+
+# Mapping between hostname and file path.
+hostPathMap = {}
+hostPathMapNextKey = 0
+
+getHostForPath = (path) ->
+  key = "#{++hostPathMapNextKey}"
+  hostPathMap[key] = path
+  key
+
+getPathForHost = (host) ->
+  hostPathMap[host]
+
+app.once 'ready', ->
+  protocol = require 'protocol'
+  BrowserWindow = require 'browser-window'
+
+  protocol.registerProtocol 'chrome-extension', (request) ->
+    parsed = url.parse request.url
+    return unless parsed.hostname and parsed.path?
+
+    directory = getPathForHost parsed.hostname
+    return new protocol.RequestFileJob(path.join(directory, parsed.path))
+
+  BrowserWindow::loadDevToolsExtension = (srcDirectory) ->
+    manifest = JSON.parse fs.readFileSync(path.join(srcDirectory, 'manifest.json'))
+
+    # We can not use 'file://' directly because all resources in the extension
+    # will be treated as relative to the root in Chrome.
+    page = url.format
+      protocol: 'chrome-extension'
+      slashes: true
+      hostname: getHostForPath srcDirectory
+      pathname: manifest.devtools_page
+
+    extensionInfo = startPage: page, name: manifest.name
+    @devToolsWebContents?.executeJavaScript "WebInspector.addExtensions([#{JSON.stringify(extensionInfo)}]);"

+ 3 - 0
atom/browser/lib/init.coffee

@@ -52,6 +52,9 @@ setImmediate ->
       detail: message
       buttons: ['OK']
 
+  # Load the chrome extension support.
+  require './chrome-extension.js'
+
   # Load the RPC server.
   require './rpc-server.js'