Расширения Google Chrome - не удается загрузить локальные изображения с помощью CSS

У меня есть простое расширение Chrome, которое использует функцию содержимого script для изменения веб-сайта. Более конкретно, background-image указанного веб-сайта.

По какой-то причине я не могу использовать локальные изображения, даже если они упакованы в расширение.

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

Что это, простейший CSS... но это не сработает. Браузер не загружает изображение.

Ответ 1

URL вашего изображения должен выглядеть как chrome-extension://<EXTENSION_ID>/image.jpg

Вам лучше было бы заменить css на javascript. Из docs:

//Code for displaying <extensionDir>/images/myimage.png:
var imgURL = chrome.extension.getURL("images/myimage.png");
document.getElementById("someImage").src = imgURL;

Ответ 2

Chrome поддерживает i18n, который предоставляет возможность ссылаться на ваше расширение в вашем CSS. Я сохраняю свои изображения в папке с изображениями в расширении, поэтому ссылочные объекты в CSS так:

background-image:url('chrome-extension://[email protected]@extension_id__/images/main.png');

Ответ 3

Есть много старых ответов и решений по этому вопросу.

По состоянию на август 2015 года (с использованием Chrome 45 и Manifest версии 2) текущая "лучшая практика" для привязки к локальным изображениям в Расширения Chrome это следующий подход.

1) Ссылка на актив в вашем CSS с помощью относительного пути в папку с расширенными изображениями:

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

2) Добавьте отдельный актив в раздел web_accessible_resources вашего файла расширения manifest.json:

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

Примечание. Этот метод подходит для нескольких файлов, но не очень хорошо масштабируется для многих файлов.

Вместо этого лучшим способом является использование поддержки Chrome для шаблонов совпадений для белого списка всех файлов в пределах данного каталога:

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

Использование этого подхода позволит вам быстро и без усилий использовать изображения в вашем CSS файле расширения Chrome с помощью поддерживаемых методов.

Ответ 4

Один из вариантов: конвертировать ваше изображение в base64:

а затем поместите данные прямо в ваш css, например:

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

Хотя этот не может быть подход, который вы хотели бы использовать при регулярной разработке веб-страницы, это отличный вариант из-за некоторых ограничений на создание Chrome Удлинитель.

Ответ 5

Мое решение.

С помощью Menifest v2 вам нужно добавить web_accessible_resources в файл, а затем использовать chrome-extension://[email protected]@extension_id__/images/pattern.png в качестве URL-адреса в файле css.

CSS

 #selector {
      background: #fff url('chrome-extension://[email protected]@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"
     ]
}

p.s. Ваш manifest.json может отличаться от этого.

Ответ 6

Эта версия только для CSS работает в среде расширения (страница приложения, всплывающая страница, фоновая страница, страница опций), а также файл CSS content_scripts.

В файле .less я всегда устанавливаю переменную в начале:

@extensionId : ~"[email protected]@extension_id__";

Затем, если вы хотите обратиться к изображениям с расширением-локальным ресурсом, используйте:

.close{
    background-image: url("chrome-extension://@{extensionId}/images/close.png");
}

Ответ 7

Следует отметить, что в web_accessible_resources вы можете использовать подстановочные знаки. Поэтому вместо

"изображения/pattern.png"

Вы можете использовать

"изображения/*"

Ответ 8

Чтобы уточнить, согласно документации, каждый файл в расширении также доступен по абсолютному URL-адресу, например:

хром-расширение:// <extensionID> / <pathToFile>

Обратите внимание, что <extensionID> - это уникальный идентификатор, создаваемый системой расширения для каждого расширения. Вы можете увидеть идентификаторы для всех загруженных расширений, перейдя по URL chrome://extensions. <pathToFile> - расположение файла в верхней папке расширения; он совпадает с относительным URL-адресом.

...

Изменение фонового изображения в CSS:

#id {background-image: URL ( "chrome-extension://<extensionID> /<pathToFile> " ); }


Изменение фонового изображения в CSS с помощью JavaScript:

document.getElementById('id'). style.backgroundImage = "URL ( 'хром-расширение:// <extensionID>/<pathToFile>')" );


Изменение фонового изображения в CSS через jQuery:

$( "#id" ). CSS ( "фоновое изображение", "URL ( 'хром-расширение:// <extensionID>/<pathToFile>')" );

Ответ 9

Если вы хотите протестировать локальное изображение на реальном сайте, вы можете запустить локальный веб-сервер и установить URL-адрес, например http://127.0.0.1:8123/img.jpg на странице, используя DevTools

Существует несколько способов запуска веб-сервера:

Также я попробовал флаг запуска хрома --allow-доступ к файлам, из файлов но это не работа для моей версии 52.0.2743.116, и это опасно и небезопасно. Документы, происходящие из любого места, локального или веб-сайта, по умолчанию не должны иметь доступ к локальному файлу:///resources.