Add chrome-extension protocol for loading devtools extensions.
authorCheng Zhao <zcbenz@gmail.com>
Wed, 27 Aug 2014 08:01:15 +0000 (16:01 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Wed, 27 Aug 2014 08:01:15 +0000 (16:01 +0800)
atom.gyp
atom/browser/lib/chrome-extension.coffee [new file with mode: 0644]
atom/browser/lib/init.coffee

index df9cf20..21284c5 100644 (file)
--- a/atom.gyp
+++ b/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',
diff --git a/atom/browser/lib/chrome-extension.coffee b/atom/browser/lib/chrome-extension.coffee
new file mode 100644 (file)
index 0000000..736bbdd
--- /dev/null
@@ -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)}]);"
index ff6416d..3c5b059 100644 (file)
@@ -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'