5

Comencé una nueva extensión basada en una versión anterior, que he escrito antes y que funciona correctamente ahora. El esquema de hacer xhr es bastante normal para las extensiones de Google Chrome: el script de contenido llama a chrome.extension.sendRequest (datos, devolución de llamada), y la solicitud real entre sitios se realiza en backround.html.Tengo un sitio en los "permisos", pero sigo obteniendo "Origin chrome-extension: // abc no está permitido por Access-Control-Allow-Origin".

Además, me he asegurado de que el sitio solicitado se haya agregado a la sección de "permisos" de manifest.json.

Sin embargo, la consola de background.html muestra: "... Origin chrome-extension: // .. no está permitido por Access-Control-Allow-Origin".

La pregunta es la siguiente: excepto por no tener el dominio de destino en los "permisos" (lo he intentado incluso aquí), ¿QUÉ MÁS puede causar este error?


Éstos son algunos fragmentos de código esenciales:

manifest.json:

{ 
    "name": "Register quote", 
    "version": "0.0.2", 
    "permissions": [ "<all_urls>" ], 
    "background_page" : "background.html", 
    "content_scripts": [ 
     { 
      "matches": [ 
       "http://somedomain.com/*" 
      ], 
      "css": ["register_quote.css"], 
      "js": ["jquery-1.3.2.min.js", "register_quote.user.js"] 
     } 
    ] 
} 

background.html:http://pastebin.com/0zLArvfA

register_quote.user.js:

// here's the final call, how it's prepared by the content script after all: 
chrome.extension.sendRequest({ 
    'action': 'sendAjaxRequest', 
    'url': "http://somedomain.com/the_script.php" 
    'dataStr': "is_chrome=Y&ticketid=123123123&user=Vladimir+Mityukov&action=get_quoteids" 
}, arg_callback); 

PD: Se me olvidó mencionar, también existe el siguiente error en la consola de backround.html:

Error in event handler for 'undefined': TypeError: Cannot read property 'length' of undefined 
    at setupPageActionEvents (chrome/ExtensionProcessBindings:424:36) 
    at chrome/ExtensionProcessBindings:1021:5 
    at [object Object].dispatch (chrome/EventBindings:182:28) 
    at Object.<anonymous> (chrome/EventBindings:237:25) 

Don'e tiene alguna idea de lo que significa este mensaje y qué parte de mi el código podría causarlo ... Los guiones, mencionados aquí, no son míos.

+1

Parece que no puedo encontrar el problema a primera vista, pero ¿sabía que puede [ahora] (http://blog.chromium.org/2011/07/chrome-extensions-now-with -more.html) ¿emite un XHR directamente desde su script de contenido? – ronme

+1

Debería iniciar el depurador con "Pausa en excepción no detectada" habilitada para encontrar el código que causa el error 'No se puede leer la propiedad 'length''. –

+0

> pero ¿sabía que ahora puede emitir un XHR directamente desde su script de contenido? ¡Sí, funciona ahora sin el proxy background.html! – pilat

Respuesta

3

Esto podría ser causado por alguna rareza del patrón "<all_urls>", tal vez pruebe a cambiar a ser la URL específica que desea llamar:

Ver: http://code.google.com/p/chromium/issues/detail?id=87671

"permissions": [ "http://somedomain.com/*" ] 

En una nota al margen, las secuencias de comandos de contenido ahora pueden hacer llamadas XHR de origen cruzado:

http://code.google.com/chrome/extensions/xhr.html

"Nota de la versión: a partir de Chrome 13, las secuencias de comandos de contenido pueden realizar solicitudes de origen cruzado a los mismos servidores que el resto de la extensión. Antes de Chrome 13, un script de contenido no podía hacer solicitudes directamente; en cambio, tuvo que enviar un mensaje a su extensión padre que solicita la extensión para hacer una solicitud de origen cruzado."

en cuyo caso habría que añadir http://somedomain.com/ a la lista de permisos en el manifiesto.

+0

Hubo un patrón regular antes de probar , así que esa no era la razón. Sin embargo, el uso de llamadas xhr desde el contenido mismo hizo el truco! – pilat

1

El La respuesta anterior es incorrecta y solo me gustaría aclarar a los futuros lectores ya que yo también tuve el mismo problema.

Esto se debe a que Access-Control-Allow-Origin del servidor no permite Chrome: // tipo de extensión de Origins.

Cada vez que envíe al servidor, tiene un encabezado de origen. Desde las extensiones de Chrome, esto es "Chrome-extensión //: blarg blarg blarg".

Muchos servidores tienen "Access-Control-Allow-Origin" de "*", por lo que en la mayoría de los casos, las llamadas api se realizarán.

Sin embargo, si Access-Control-Allow-Origin necesita una dirección http o un dominio determinado, entonces no hay cantidad de cosas que pueda hacer para que funcione.

Funciona en el script de contenido porque tiene el origen de la url misma, que es "http: // blarg blarg blarg".

Cuestiones relacionadas