2012-01-04 20 views
8

Necesito iniciar Chrome desde la línea de comandos con un parámetro personalizado, que contiene la ruta a algún archivo js. Además, esta ruta se utilizará en la extensión .¿Hay alguna manera de obtener parámetros de línea de comandos en la extensión de Google Chrome?

Busqué cuidadosamente toda la documentación relacionada y hice clic en todos los nodos en el depurador de Chrome , pero no encontré nada que pueda parecerse a los parámetros de la línea de comandos . ¿Es posible obtener estos parámetros o se necesita para escribir npapi-extensión más compleja? (teóricamente en dicha extensión npapi- podemos hacer autoprocesamiento a través de win-api, línea de comandos de autoproceso, etc.).

+0

FYI, el enfoque NPAPI que describes no va a funcionar, porque el plugin se ejecuta en una proceso completamente diferente (lanzado por Chrome con parámetros de línea de comando decide). – smorgan

+0

Estás equivocado y correcto al mismo tiempo. Probé ese esquema ya, y es posible obtener información sobre el proceso actual separado con la extensión. Significa que también hay una forma de obtener información sobre el proceso principal y sobre la línea de comando del proceso principal como resultado. – MontyBurns

+0

También encontré la página especial chrome: // version. Esta página contiene información exacta de lo que necesito - línea de comando con todos los interruptores. Intenté depurar esta página, pero no encontré nada útil para mí. – MontyBurns

Respuesta

4

Hack alerta: this post sugiere pasar una dirección URL falsa para abrir que tiene todos los parámetros de línea de comandos como parámetros de cadena de consulta, por ejemplo,

chrome.exe http://fakeurl.com/?param1=val1&param2=val2 
+0

+1 ¡Gracias! He refinado este enfoque un poco, por favor. mira mi respuesta Estaría feliz de escuchar tu opinión. – kol

1

usted podría intentar:

var versionPage = "chrome://version/strings.js"; 
$.post(versionPage, function(data){ 
    data = data.replace("var templateData = ", ""); 
    data = data.slice(0, -1); 
    var jsonOb = $.parseJSON(data); 
    alert(jsonOb.command_line); 
}); 

esto supone está utilizando jQuery en su secuencia de carga, siempre puede sustituir con cualquier otro método AJAX

+0

Este método solo funciona si tiene la página de versión abierta, para arreglar esto, envolvería $ .post con: 'chrome.tabs.create ({url: versionPage, active: false}, function() { }); ' – Bloafer

+0

Tal vez una vez que la publicación esté completa, puede cerrar la pestaña :) – Bloafer

+0

esta técnica solía funcionar, pero ya no en Chrome 47. Ahora estoy usando la técnica --user-agent con gran éxito. –

3

Básicamente uso la técnica dada en @dfrankow's answer, pero abro 127.0.0.1:0 en lugar de una URL falsa. Este enfoque tiene dos ventajas:

  1. Se omitió el intento de resolución del nombre. OK, si he elegido la URL falsa atentamente para evitar abrir una URL existente, la resolución del nombre fallaría con seguridad. Pero no es necesario, ¿por qué no saltarse este paso?
  2. Ningún servidor escucha en el puerto TCP 0. Usar simplemente 127.0.0.1 no es suficiente, ya que es posible que un servidor web se ejecute en la máquina cliente, y no quiero que la extensión se conecte accidentalmente. Entonces, tengo que especificar un número de puerto, pero ¿cuál? El puerto 0 es la opción perfecta: de acuerdo con RFC 1700, este número de puerto está "reservado", es decir, los servidores no pueden usarlo.

línea de comandos ejemplo, para pasar argumentos abc y xyz a su extensión:

chrome "http://127.0.0.1:0/?abc=42&xyz=hello" 

Puede leer estos argumentos en background.js esta manera:

chrome.windows.onCreated.addListener(function (window) { 
    chrome.tabs.query({}, function (tabs) { 
     var args = { abc: null, xyz: null }, argName, regExp, match; 
     for (argName in args) { 
      regExp = new RegExp(argName + "=([^\&]+)") 
      match = regExp.exec(tabs[0].url); 
      if (!match) return; 
      args[argName] = match[1]; 
     } 
     console.log(JSON.stringify(args)); 
    }); 
}); 

salida de la consola (en el consola de la página de fondo de la extensión):

{"abc":"42","xyz":"hello"} 
4

Quizás pase la ruta a su extensión en un conjunto de cadenas de agente de usuario personalizado a través de la línea de comando. Por ejemplo:

chrome.exe --user-agent='Chrome 43. My path is:/path/to/file' 

Luego, en su extensión:

var path = navigator.userAgent.split(":"); 
console.log(path[1]) 
Cuestiones relacionadas