Rozszerzenia Google Chrome - nie można załadować obrazów lokalnych za pomocą CSS

99

Mam proste rozszerzenie do przeglądarki Chrome, które używa funkcji skryptu zawartości do modyfikowania witryny internetowej. Dokładniej rzecz biorąc, background-imagewspomniana witryna.

Z jakiegoś powodu nie mogę używać lokalnych obrazów, mimo że są one spakowane w rozszerzeniu.

body {
    background: #000 url('image.jpg') !important;
    background-repeat: repeat !important;
}

To wszystko, najprostszy CSS ... ale to nie zadziała. Przeglądarka nie ładuje obrazu.

Bjarki Jonasson
źródło
2
Dlaczego rozszerzenie miałoby myśleć, że adres URL („image.jpg”) jest lokalny? Czy nie potrzebowałbyś pełnej ścieżki?
Traingamer

Odpowiedzi:

70

Adres URL Twojego obrazu powinien wyglądać tak chrome-extension://<EXTENSION_ID>/image.jpg

Lepiej byłoby zastąpić css przez javascript. Z dokumentów :

//Code for displaying <extensionDir>/images/myimage.png:
var imgURL = chrome.extension.getURL("images/myimage.png");
document.getElementById("someImage").src = imgURL;
serg
źródło
7
@Salem Ponieważ w przeciwnym razie musiałbyś zakodować swój identyfikator rozszerzenia w css.
serg
Nie być głupim, ale dlaczego jest to problem?
Salem
4
@Salem Byłoby niewygodne opracowanie jako rozpakowanego identyfikatora rozszerzenia i przesłanie do galerii, które ma różne identyfikatory. To nie koniec świata, tylko niedogodności i rodzaj złej praktyki, tak jak na przykład zakodowanie bezwzględnych ścieżek plików w kodzie.
serg
Ach, ma sens. Doceniam to.
Salem
Ponieważ jest to zaakceptowana odpowiedź, powinieneś zobaczyć komentarz do drugiej odpowiedzi, w której ariera wspomniała o włączeniu web_accessible_resources do pliku manifestu, aby uzyskać dostęp do lokalnych czcionek i obrazów.
Aryan Firouzian
254

Chrome obsługuje i18n, co zapewnia możliwość odniesienia się do rozszerzenia w CSS. Trzymam obrazy w folderze obrazów w rozszerzeniu, więc odwołuję się do zasobów w CSS w następujący sposób:

background-image:url('chrome-extension://__MSG_@@extension_id__/images/main.png');
David Lemphers
źródło
4
Świetny. To świetne rozwiązanie i rzeczywiście działa zarówno w przypadku nieopakowanych, jak i spakowanych rozszerzeń - dzięki za podzielenie się naprawdę świetną wskazówką.
Richard Hollis
41
Dzięki, właśnie tego szukałem. Tylko przypis: pamiętaj, że musisz zadeklarować swoje zasoby jako web_accessible_resources w swoim pliku manifestu (jak wyjaśniono tutaj: code.google.com/chrome/extensions/… ). W przeciwnym razie nie zostaną załadowane
ariera
2
Zrozumiałem jedną rzecz! Nigdy nie myśl, że zaakceptowana odpowiedź jest jedynym poprawnym rozwiązaniem tego pytania! Bałem się, że muszę zrobić kod twardy, kiedy zobaczyłem zaakceptowaną odpowiedź, ale po zobaczeniu twojej odpowiedzi powiedziałem sobie, że ten facet uratował mi dzień !! ;-)
Rafique Mohammed
To prawie zawsze lepszy sposób na zrobienie tego. Czysty CSS a łączenie Javascirpt i CSS razem w odpowiedzi @serg. Moim zdaniem powinna to być akceptowana odpowiedź.
Jeremy Zerr
Link do @ ariera jest teraz tutaj: developer.chrome.com/extensions/manifest/…
Ben
42

Istnieje wiele starszych odpowiedzi i rozwiązań na to pytanie.

Od sierpnia 2015 r. (Przy użyciu przeglądarki Chrome 45 i Manifest w wersji 2) aktualne „sprawdzone metody” tworzenia linków do obrazów lokalnych w rozszerzeniach Chrome metoda jest następująca.

1) Połącz z zasobem w CSS, używając względnej ścieżki do folderu z obrazami rozszerzenia:

.selector {
    background: url('chrome-extension://__MSG_@@extension_id__/images/file.png');
}

2) Dodaj pojedynczy zasób do sekcji web_accessible_resources w pliku manifest.json rozszerzenia:

"web_accessible_resources": [
  "images/file.png"
]

Uwaga: ta metoda jest odpowiednia dla kilku plików, ale nie skaluje się dobrze w przypadku wielu plików.

Zamiast tego lepszą metodą jest wykorzystanie obsługi wzorców dopasowania przez Chrome do białej listy wszystkich plików w danym katalogu:

{
    "name": "Example Chrome Extension",
    "version": "0.1",
    "manifest_version": 2,
    ...    
    "web_accessible_resources": [
      "images/*"
    ]
}

Skorzystanie z tego podejścia pozwoli Ci szybko i bez wysiłku używać obrazów w pliku CSS rozszerzenia Chrome przy użyciu natywnie obsługiwanych metod.

rjb
źródło
22

Jedną z opcji byłaby konwersja obrazu na base64:

a następnie umieść dane bezpośrednio w swoim CSS, na przykład:

body { background-image: url(data:image/png;base64,iVB...); }

Chociaż może nie być to podejście, którego chciałbyś używać podczas regularnego tworzenia strony internetowej , jest to świetna opcja ze względu na niektóre ograniczenia związane z budowaniem rozszerzenia Chrome.

Brian Sloane
źródło
1
Wolę tę opcję. Nie zgadzam się, że Google ma rację, sugerując wstrzykiwanie wszystkich obrazów za pomocą wspomnianego powyżej podejścia. Podejście base64 jest również szybsze. +1 !!!
Skone
20

Moje rozwiązanie.

W Menifest v2 musisz dodać web_accessible_resourcesdo pliku, a następnie użyćchrome-extension://__MSG_@@extension_id__/images/pattern.png jako URL w pliku css.

CSS:

 #selector {
      background: #fff url('chrome-extension://__MSG_@@extension_id__/images/pattern.png'); 
 }

Manifest.json

{
  "manifest_version": 2,

  "name": "My Extension Name",
  "description": "My Description",
  "version": "1.0",

  "content_scripts": [
      {
        "matches": ["https://mydomain.com/*"],
        "css": ["style.css"]
      }
    ],

  "permissions": [
    "https://mydomain.com/"
  ],
  "browser_action": {
      "default_icon": {                    
            "19": "images/icon19.png",           
            "38": "images/icon38.png"          
       },
       "default_title": "My Extension Name"  
   },
   "web_accessible_resources": [
       "images/pattern.png"
     ]
}

ps Twój plik manifest.json może wyglądać inaczej niż ten.

Foxinni
źródło
9

Ta wersja CSS działa tylko w środowisku rozszerzenia (strona aplikacji, strona podręczna, strona w tle, strona opcji), a także pliku CSS content_scripts.

W pliku .less zawsze ustawiam zmienną na początku:

@extensionId : ~"__MSG_@@extension_id__";

Później, jeśli chcesz odnieść się do obrazów rozszerzenia-lokalnego-zasobu, użyj:

.close{
    background-image: url("chrome-extension://@{extensionId}/images/close.png");
}
Thach Lockevn
źródło
7

Należy wspomnieć, że w zasobach web_accessible_resources można używać symboli wieloznacznych. Więc zamiast

„images / pattern.png”

Możesz użyć

"zdjęcia/*"

patrick_hogan
źródło
4

Dla wyjaśnienia, zgodnie z dokumentacją , każdy plik w rozszerzeniu jest również dostępny pod bezwzględnym adresem URL, takim jak ten:

chrome-extension: // <extensionID>/<pathToFile>

Zwróć uwagę, że <extensionID>jest to unikalny identyfikator, który system rozszerzeń generuje dla każdego rozszerzenia. Aby zobaczyć identyfikatory wszystkich wczytanych rozszerzeń, przejdź do adresu URL chrome: // extensions . Plik<pathToFile> jest lokalizacja pliku w głównym folderze rozszerzenia; jest taki sam jak względny adres URL.

...

Zmiana obrazu tła w CSS:

#id{background-image: url („ chrome-extension://<extensionID>/<pathToFile>”); }


Zmiana obrazu tła w CSS poprzez JavaScript:

document.getElementById (' id') .style.backgroundImage = "url ('chrome-extension: //<extensionID> / <pathToFile>')");


Zmiana obrazu tła w CSS poprzez jQuery:

$ (" #id") .css ("obraz-tła", "url ('rozszerzenie-chrome: // <extensionID>/ <pathToFile>')");

quackkkk
źródło