reslist: use the dame file:/// value for the prefix and baseUrl so that user-entered relative links work

This commit is contained in:
Jean-Francois Dockes 2020-07-18 18:53:57 +02:00
parent 5bf4596d1f
commit d48a0619b1

View File

@ -67,9 +67,10 @@ static const QKeySequence closeKeySeq("Ctrl+w");
# define QWEBSETTINGS QWebSettings # define QWEBSETTINGS QWebSettings
#elif defined(USING_WEBENGINE) #elif defined(USING_WEBENGINE)
// Notes for WebEngine: // Notes for WebEngine:
// - All links must begin with http:// for acceptNavigationRequest to // - It used to be that all links must begin with http:// for
// be called. Actually not any more since we set baseURL see // acceptNavigationRequest to be called. Can't remember if file://
// comments in linkClicked(). // would work. Anyway not any more since we set baseURL. See comments
// in linkClicked().
// - The links passed to acceptNav.. have the host part // - The links passed to acceptNav.. have the host part
// lowercased -> we change S0 to http://localhost/S0, not http://S0 // lowercased -> we change S0 to http://localhost/S0, not http://S0
# include <QWebEnginePage> # include <QWebEnginePage>
@ -145,7 +146,12 @@ public:
map<string, vector<string> >& sugg); map<string, vector<string> >& sugg);
virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());} virtual string absSep() {return (const char *)(prefs.abssep.toUtf8());}
#ifdef USING_WEBENGINE #ifdef USING_WEBENGINE
virtual string linkPrefix() override {return "http://localhost/";} // We used to use http://localhost/. Now use file:/// as this is
// what Webengine will prepend relative links with (as
// baseURL). This is for the case where a user adds a link like
// P%N, which would not work if linkPrefix and baseURL were not
// the same.
virtual string linkPrefix() override {return "file:///";}
virtual string bodyAttrs() override { virtual string bodyAttrs() override {
return "onload=\"addEventListener('contextmenu', saveLoc)\""; return "onload=\"addEventListener('contextmenu', saveLoc)\"";
} }
@ -953,6 +959,8 @@ void ResList::onLinkClicked(const QUrl &qurl)
// baseUrl because we receive links like baseUrl+P1 instead. // baseUrl because we receive links like baseUrl+P1 instead.
LOGDEB1("ResList::onLinkClicked: [" << strurl << "] prefix " << LOGDEB1("ResList::onLinkClicked: [" << strurl << "] prefix " <<
m_pager->linkPrefix() << "\n"); m_pager->linkPrefix() << "\n");
std::cerr << "ResList::onLinkClicked: [" << strurl << "] prefix " <<
m_pager->linkPrefix() << "\n";
if (m_pager->linkPrefix().size() > 0 && if (m_pager->linkPrefix().size() > 0 &&
(strurl.size() <= m_pager->linkPrefix().size() || (strurl.size() <= m_pager->linkPrefix().size() ||
!beginswith(strurl, m_pager->linkPrefix()))) { !beginswith(strurl, m_pager->linkPrefix()))) {
@ -960,15 +968,31 @@ void ResList::onLinkClicked(const QUrl &qurl)
} }
strurl = strurl.substr(m_pager->linkPrefix().size()); strurl = strurl.substr(m_pager->linkPrefix().size());
// The content of our URLs is always a single letter possibly
// followed by an integer value (document number).
if (strurl.size() == 0) {
return;
}
int docnum{-1}; int docnum{-1};
bool havedoc{false}; bool havedoc{false};
Rcl::Doc doc; Rcl::Doc doc;
if (strurl.size() > 1 && (docnum = atoi(strurl.c_str()+1) - 1) >= 0) { if (strurl.size() > 1) {
if (getDoc(docnum, doc)) { // Expecting integer after the letter, and nothing else
havedoc = true; const char *bptr = strurl.c_str() + 1;
} else { char *eptr;
LOGERR("ResList::onLinkClicked: can't get doc for "<< docnum = strtol(bptr, &eptr, 10) - 1;
docnum << "\n"); if (eptr == bptr || *eptr != 0) {
// No digits or non-digit characters following digits, bad link.
return;
}
if (docnum >= 0) {
if (getDoc(docnum, doc)) {
havedoc = true;
} else {
LOGERR("ResList::onLinkClicked: can't get doc for "<<
docnum << "\n");
return;
}
} }
} }