On mercoledì 1 novembre 2017 09:37:29 CET Stefano Crocco wrote: > On martedì 31 ottobre 2017 22:33:24 CET Allan Sandfeld Jensen wrote: > > On Dienstag, 31. Oktober 2017 21:17:35 CET Stefano Crocco wrote: > > > On martedì 31 ottobre 2017 01:47:37 CET Allan Sandfeld Jensen wrote: > > > > On Sonntag, 29. Oktober 2017 09:47:24 CET Stefano Crocco wrote: > > > > > Hello to everyone, > > > > > I'm working on making QWebEngine work correctly in Konqueror when > > > > > downloading files (although I didn't have much time to spend on this > > > > > in > > > > > the > > > > > last months). > > > > > > > > > > The problem is that instead of downloading the correct files, in > > > > > some > > > > > cases > > > > > Konqueror download html files. This only happens from sites > > > > > requiring > > > > > authentication (I first noticed when trying to download a file from > > > > > my > > > > > bank's web page); besides, it only happens if I try to use KIO for > > > > > the > > > > > download, for example calling KIO::copy from a slot connected with > > > > > QWebEngineProfile::downloadRequested. The file downloads correctly > > > > > if > > > > > Konqueror downloads it using the mechanism provided by QWebEngine, > > > > > that > > > > > is > > > > > calling QWebEngineDownloaditem::accept. > > > > > > > > > > I believe that the issue is caused by cookies, and in particular by > > > > > the > > > > > fact that QWebEngine doesn't share its cookies with KIO so that, > > > > > when > > > > > KIO > > > > > attempts to download the file, it doesn't have the cookie(s) > > > > > associated > > > > > with the session opened in the browser and the web page refuses to > > > > > let > > > > > it > > > > > download the file (indeed, one of the sites where this happens > > > > > returned > > > > > a > > > > > login page instead of the PDF I wanted to download). > > > > > > > > > > Looking at the documentation both for QWebEngine and for KIO > > > > > regarding cookies. I found out two classes: > > > > > * on QWebEngine's side, there's QWebEngineCookieStore, which > > > > > provides > > > > > signals emitted whenever a cookie is added or removed and which, > > > > > according > > > > > to documentation [1], "can be used to synchronize cookies of > > > > > Chromium > > > > > and > > > > > the QNetworkAccessManager" > > > > > * on KIO's side, there's KIO::Integration::AccessManager, which > > > > > derives > > > > > from QNetworkAccessManager and which should work along > > > > > QWebEngineCookieStore. > > > > > > > > > > The example in the documentation for KIO::Integration::AccessManager > > > > > refers > > > > > to QWebView and says to call QWebPage::setNetworkAccessManager to > > > > > have > > > > > the > > > > > QWebView and KIO to use the same access manager. Unfortunately, > > > > > QWebEngine > > > > > can't be integrated with a QNetworkAccessManager: not only > > > > > QWebEnginePage > > > > > doesn't have a setNetworkAccessManager method, but the documentation > > > > > for > > > > > QWebEngine explicitly says that it doesn't use QNetworkAccess. > > > > > Because > > > > > of > > > > > this, I thought to do things the other way round: I created a > > > > > KIO::Integration::AccessManager and, used slots connected with > > > > > QWebEngineCookieStore signals, to add cookies to it. > > > > > > > > > > Unfortunately, this doesn't fix the issue. I believe this is because > > > > > I > > > > > haven't told KIO to use the new access manager. The problem is that > > > > > I > > > > > can > > > > > see any way to do it. Does anyone have suggestions on how to do > > > > > this? > > > > > > > > KIO has its own cookie-store separate from QNAMs cookie store. So > > > > there > > > > are three cookie stores. QtNetwork's, KIOs, and QtWebEngine's. Of > > > > course > > > > the easiest solution would be to let QtWebEngine handle the > > > > downloading, > > > > but that wouldn't integrate into normal KDE download mechanisms. So > > > > you > > > > need to bridge QtWebEngine's cookies into KIOs cookie store and ignore > > > > QtNetwork's. > > > > > > > > 'Allan > > > > > > The problem is that I can't find any documentation on how to interact > > > with > > > KIO's cookie store. On KIO::AccessManager, it is stated: "IMPORTANT This > > > class is not a replacement for the standard KDE API. It should ONLY be > > > used > > > to provide KDE integration in applications that cannot use the standard > > > KDE > > > API directly". Unfortunately, it doesn't mention which is the standard > > > KDE > > > API. Looking at accessmanager.cpp, I see (in the code for > > > KIO::Integration::CookieJar) DBUS calls to the "org.kde.cookiejar5" > > > interface. Is this the "standard KDE API"? If so, is there a place where > > > it's documented? I think I already tried to use it to solve this > > > problem, > > > but without success. However, tomorrow I'll give it another try. > > > > I am not sure how well it is documented, but yes, it is essentially a DBUS > > api in background, because the cookie-jar runs in a separate process. > > Perhaps you can find some help by looking into the kdewebkit code that > > bridged KIO with QNAM (since QtWebKit used QNAM). > > > > See for instance https://api.kde.org/frameworks/kio/html/ > > classKIO_1_1CookieJar.html > > It seems to be a QtNetwork compatible inferface for the KIO cookie jar. > > Though the native API here might work too: > > https://api.kde.org/4.x-api/kdelibs-apidocs/kio/html/ > > classKIO_1_1Integration_1_1CookieJar.html > > > > I just noticed Google is still picking up the KDE 4 documentation. We had > > similar problems with Qt4 vs Qt5. Where are the kf documenation hosted? > > > > 'Allan > > > > 'Allan >
I tried using the D-BUS interface and it works, at least in theory. The problem is that the addCookies method provied by the D-BUS interface requires the URL which sent the cookie as first parameter but, as far as I can see, QWebEngineCookieStore doesn't provide a way to retrieve that URL. When I tried hardcoding the URL, everything worked correctly. I'll have to investigate more to find out whether it's possible to extract the URL from somewhere within QWebEngine. Stefano