D9124: make packageurlinterceptor as noop as possible

Aleix Pol Gonzalez noreply at phabricator.kde.org
Sun Dec 3 14:50:43 UTC 2017


apol added a comment.


  Wow that's a lot of code gone!

INLINE COMMENTS

> packageurlinterceptor.cpp:95
>  
> -    if (d->forcePlasmaStyle && path.path().contains(QLatin1String("Controls.2/org.kde.desktop/"))) {
> -        return QUrl::fromLocalFile(path.path().replace(QLatin1String("Controls.2/org.kde.desktop/"), QLatin1String("Controls.2/Plasma/")));
> -    }
> -    QString pkgRoot;
> -    KPackage::Package package;
> -    if (d->package.isValid()) {
> -        package = d->package;
> -    } else {
> -        foreach (const QString &base, QStandardPaths::standardLocations(QStandardPaths::GenericDataLocation)) {
> -            pkgRoot = QFileInfo(base + QStringLiteral("/plasma/plasmoids/")).canonicalFilePath();
> -            if (!pkgRoot.isEmpty() && path.path().startsWith(pkgRoot)) {
> -                const QString pkgName = path.path().midRef(pkgRoot.length() + 1).split(QLatin1Char('/')).first().toString();
> -
> -                auto it = PackageUrlInterceptorPrivate::s_packages.constFind(pkgName);
> -                if (it != PackageUrlInterceptorPrivate::s_packages.constEnd()) {
> -                    package = *it;
> -                } else {
> -                    package = Plasma::PluginLoader::self()->loadPackage(QStringLiteral("Plasma/Applet")).kPackage();
> -                    package.setPath(pkgName);
> -                    PackageUrlInterceptorPrivate::s_packages[pkgName] = package;
> -                }
> -                break;
> -            }
> -        }
> -    }
> -    if (!package.isValid()) {
> -        return path;
> -    }
> -
> -    if (d->package.isValid() && path.scheme() == QStringLiteral("plasmapackage")) {
> -        //FIXME: this is incorrect but works around a bug in qml in resolution of urls of qmldir files
> -        if (type == QQmlAbstractUrlInterceptor::QmldirFile) {
> -            return QUrl(d->package.filePath(0, path.path()));
> -        } else {
> -            return QUrl::fromLocalFile(d->package.filePath(0, path.path()));
> -        }
> -    }
> -
> -    //TODO: security: permission for remote urls
> -    if (!path.isLocalFile()) {
> -        return path;
> -    }
> -
> -    //if is just a normal string, no qml file was asked, allow it
> -    if (type == QQmlAbstractUrlInterceptor::UrlString) {
> -        return path;
> -    }
> -
> -    //asked a file inside a package: let's rewrite the url!
> -    if (path.path().startsWith(package.path())) {
> -        //qDebug() << "Found URL in package" << path;
> -
> -        //tries to isolate the relative path asked relative to the contentsPrefixPath: like ui/foo.qml
> -        QString relativePath;
> -        foreach (const QString &prefix, package.contentsPrefixPaths()) {
> -            QString root = package.path() + prefix;
> -            if (path.path().startsWith(root)) {
> -                //obtain a string in the form ui/foo/bar/baz.qml
> -                relativePath = path.path().mid(root.length());
> -                break;
> -            }
> -        }
> -
> -        //should never happen
> -        Q_ASSERT(!relativePath.isEmpty());
> -
> -        const int firstSlash = relativePath.indexOf(QLatin1Char('/')) + 1;
> -        const QString filename = firstSlash > 0 ? relativePath.mid(firstSlash) : relativePath;
> -        const QUrl ret = QUrl::fromLocalFile(package.filePath(prefixForType(type, filename), filename));
> -
> -        //qDebug() << "Returning" << ret;
> -
> -        if (ret.path().isEmpty()) {
> -            return path;
> -        }
> -        return ret;
> -
> -        //forbid to load random absolute paths
> +    if (path.toString().contains(match)) {
> +        QString rewritten = path.toString().replace(match, QStringLiteral("code/\\1.js"));

Only call `toString()` once, also put in a variable.
Also we can use the information from the first match to do the replace so we don't have to execute the regex twice, if it's a hot path.

REPOSITORY
  R242 Plasma Framework (Library)

REVISION DETAIL
  https://phabricator.kde.org/D9124

To: mart, #plasma
Cc: apol, plasma-devel, #frameworks, ZrenBot, progwolff, lesliezhai, ali-mohamed, jensreuterberg, abetts, sebas, mart
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/plasma-devel/attachments/20171203/04b83296/attachment-0001.html>


More information about the Plasma-devel mailing list