5

Założyłem nowe rozszerzenie bazując na starszym, które napisałem wcześniej i które działa poprawnie teraz. Schemat tworzenia xhr jest całkiem normalny dla rozszerzeń Google Chrome: wywołania skryptu treści chrome.extension.sendRequest (dane, wywołanie zwrotne), a faktyczne żądanie między lokacjami odbywa się w backround.html.Mam witrynę w "uprawnieniach", ale wciąż otrzymuję "Origin chrome-extension: // abc jest niedozwolone przez Access-Control-Allow-Origin."

Ponadto upewniłem się, że żądana strona jest dodana do sekcji "permissions" pliku manifest.json.

Jednak konsola pliku background.html wyświetla: "... Początkowe rozszerzenie chrome: // .. nie jest dozwolone przez Access-Control-Allow-Origin."

Pytanie jest następujące: z wyjątkiem braku domeny docelowej w "uprawnieniach" (tak naprawdę wypróbowałem nawet tutaj), CO ELSE może spowodować ten błąd?


Oto niektóre istotne fragmenty kodu:

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); 

PS: Zapomniałem wspomnieć, istnieje również następujący błąd w konsoli backround.html za:

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 mają żadnego pojęcia, co oznacza ten komunikat i co część mojego kod może spowodować to. Skrypty, o których tutaj mowa, nie są moje.

+1

Nie mogę znaleźć problemu na pierwszy rzut oka, ale czy wiesz, że możesz [teraz] (http://blog.chromium.org/2011/07/chrome-extensions-now-with -more.html) wydaje XHR bezpośrednio ze swojego skryptu treści? – ronme

+1

Powinieneś uruchomić debugger z włączonym opcją "Zatrzymaj przy niezałatwionym wyjątku", aby znaleźć kod powodujący błąd "Nie można odczytać długości właściwości". –

+0

> ale czy wiesz, że możesz teraz wydać XHR bezpośrednio ze swojego skryptu treści? Yay, działa teraz bez background.html proxy! – pilat

Odpowiedz

3

Może to być spowodowane jakimś tajemniczości wzoru "<all_urls>", może spróbuj to być konkretny adres URL, który chcesz zadzwonić:

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

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

W zakładach Uwaga boczna, skrypty zawartości mogą teraz wykonywać wywołania XHR z różnych źródeł:

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

"Uwaga do wersji: od wersji Chrome 13 skrypty treści mogą przekazywać żądania krzyżowe do tych samych serwerów, co reszta rozszerzenia. Przed wersją Chrome 13 skrypt treści nie mógł bezpośrednio zgłaszać próśb; Zamiast tego musiał wysłać wiadomość do jego przedłużenia dominującej prośbą rozszerzenia, aby złożyć zamówienie cross-origin „.

W takim przypadku trzeba by dodać http://somedomain.com/ do listy uprawnień w manifeście.

+0

Nie było regularny wzór, zanim spróbowałem , więc nie to było powodem. Jednak korzystanie z wywołań Xhr z samego spisu treści działało! – pilat

1

powyższa odpowiedź jest błędna i po prostu lubię wyjaśniać przyszłym czytelnikom, ponieważ ja też miałem ten sam problem.

Wynika to z faktu, że moduł Access-Control-Allow-Origin serwera nie zezwala na rozszerzenie typu Chrome: // Origins.

Zawsze, gdy wysyłasz na serwer, masz nagłówek początku. Z rozszerzeń Chrome jest to "Rozszerzenie do Chrome //: blarg blarg blarg".

Wiele serwerów posiada "Access-Control-Allow-Origin" z "*", więc w większości przypadków połączenia api będą działać.

Jeśli jednak moduł Access-Control-Allow-Origin potrzebuje adresu http lub określonej domeny, nie można wykonać żadnej czynności, aby to działało.

Działa na skrypcie treści, ponieważ ma źródło adresu URL, który jest "http: // blarg blarg blarg".

Powiązane problemy