void AuthenticationDialog::loadFinished() { // Q_D(AuthenticationDialog); QUrl url = d->webView->url(); if (url.host() == "www.facebook.com" && url.path() == "/login.php") { if (d->username.isEmpty() && d->password.isEmpty()) { return; } QWebFrame *frame = d->webView->page()->mainFrame(); if (!d->username.isEmpty()) { QWebElement email = frame->findFirstElement("input#email"); if (!email.isNull()) { email.setAttribute("value", d->username); } } if (!d->password.isEmpty()) { QWebElement passd = frame->findFirstElement("input#pass"); if (!passd.isNull()) { passd.setAttribute("value", d->password); } } return; } }
void NoteFormatter::modifyPdfTags(qint32 resLid, QWebElement &enmedia) { enmedia.setAttribute("width", "100%"); enmedia.setAttribute("height", "100%"); enmedia.setAttribute("lid", QString::number(resLid)); QString x = enmedia.toOuterXml(); x.replace("en-media", "object"); enmedia.setOuterXml(x); x = enmedia.toOuterXml(); }
// Modify the en-to tag into an input field void NoteFormatter::modifyTodoTags(QWebElement &todo) { todo.setAttribute("type", "checkbox"); // Checks the en-to tag wheter or not the todo-item is checked or not // and sets up the HTML to keep storing the information in value QString checked = todo.attribute("checked"); if (checked.toLower() == "true") todo.setAttribute("checked", "checked"); else todo.removeAttribute("checked"); todo.setAttribute("onClick", "if(!checked) removeAttribute('checked'); else setAttribute('checked', 'checked'); editorWindow.editAlert();"); todo.setAttribute("style", "cursor: hand;"); todo.setOuterXml(todo.toOuterXml().replace("en-todo","input")); }
/* If we have an ink note, then we need to pull the image and display it */ bool NoteFormatter::buildInkNote(QWebElement &docElem, QString &hash) { ResourceTable resTable(global.db); qint32 resLid = resTable.getLidByHashHex(note.guid, hash); if (resLid <= 0) return false; docElem.setAttribute("en-tag", "en-media"); docElem.setAttribute("lid", QString::number(resLid)); docElem.setAttribute("type", "application/vnd.evernote.ink"); QString filename = QString("file:///") +global.fileManager.getDbaDirPath()+QString::number(resLid)+QString(".png"); docElem.setAttribute("src", filename); QString k = docElem.toOuterXml(); k.replace("<en-media", "<img"); k.replace("enmedia>", "img>");; docElem.setOuterXml(k); return true; }
void ShadowGUI::setNumConnections(int count) { QWebElement connectionsIcon = documentFrame->findFirstElement("#connectionsIcon"); QString icon; switch(count) { case 0: icon = "qrc:///icons/connect_0"; break; case 1: case 2: icon = "qrc:///icons/connect_1"; break; case 3: case 4: icon = "qrc:///icons/connect_2"; break; case 5: case 6: icon = "qrc:///icons/connect_3"; break; case 7: case 8: icon = "qrc:///icons/connect_4"; break; case 9: case 10: icon = "qrc:///icons/connect_5"; break; default: icon = "qrc:///icons/connect_6"; break; } connectionsIcon.setAttribute("src", icon); connectionsIcon.setAttribute("title", tr("%n active connection(s) to ZirkCoin network", "", count)); }
void EnmlFormatter::processTodo(QWebElement &node) { bool checked=false; if (node.hasAttribute("checked")) checked = true; node.removeAttribute("style"); node.removeAttribute("type"); removeInvalidAttributes(node); if (checked) node.setAttribute("checked", "true"); node.setOuterXml(node.toOuterXml().replace("<input", "<en-todo").replace("</input", "</en-todo")); }
/** * @fn sendReportUsingGitreport */ void GitreportModule::sendReportUsingGitreport(const QMap<QString, QString> info) { if (debug) qDebug() << "[GitreportModule]" << "[sendReportUsingGitreport]"; QWebElement document = webView->page()->mainFrame()->documentElement(); QWebElement captchaKey = document.findFirst(QString("input#captcha")); QWebElement emailInput = document.findFirst(QString("input#email")); QWebElement textArea = document.findFirst(QString("textarea#details")); QWebElement usernameInput = document.findFirst(QString("input#name")); // input usernameInput.setAttribute(QString("value"), info[QString("username")]); emailInput.setAttribute(QString("value"), info[QString("password")]); textArea.setPlainText(info[QString("body")]); captchaKey.setAttribute(QString("value"), info[QString("captcha")]); // send request document.findFirst(QString("input[name=commit]")).evaluateJavaScript("this.click()"); disconnect(webView, SIGNAL(loadFinished(bool)), this, SLOT(gitreportLoaded(bool))); disconnect(webView, SIGNAL(loadFinished(bool)), this, SLOT(gitreportFinished(bool))); connect(webView, SIGNAL(loadFinished(bool)), this, SLOT(gitreportFinished(bool))); }
void AutoFillModel::completePage(WebPage* page) { if (!page) { return; } QUrl pageUrl = page->url(); if (!isStored(pageUrl)) { return; } QWebElementCollection inputs; QList<QWebFrame*> frames; frames.append(page->mainFrame()); while (!frames.isEmpty()) { QWebFrame* frame = frames.takeFirst(); inputs.append(frame->findAllElements("input")); frames += frame->childFrames(); } QString server = pageUrl.host(); if (server.isEmpty()) { server = pageUrl.toString(); } QSqlQuery query; query.prepare("SELECT data FROM autofill WHERE server=?"); query.addBindValue(server); query.exec(); query.next(); QByteArray data = query.value(0).toByteArray(); if (data.isEmpty()) { return; } // Why not to use encodedQueryItems = QByteArrays ? // Because we need to filter "+" characters that must be spaces // (not real "+" characters "%2B") QueryItems arguments = QUrl::fromEncoded("http://bla.com/?" + data).queryItems(); for (int i = 0; i < arguments.count(); i++) { QString key = arguments.at(i).first; QString value = arguments.at(i).second; key.replace("+", " "); value.replace("+", " "); key = QUrl::fromEncoded(key.toUtf8()).toString(); value = QUrl::fromEncoded(value.toUtf8()).toString(); for (int i = 0; i < inputs.count(); i++) { QWebElement element = inputs.at(i); if (element.attribute("type") != "text" && element.attribute("type") != "password" && element.attribute("type") != "") { continue; } if (key == element.attribute("name")) { element.setAttribute("value", value); } } } }
// Modify the en-media tag into an attachment void NoteFormatter::modifyApplicationTags(QWebElement &enmedia, QString &hash, QString appl) { if (appl.toLower() == "vnd.evernote.ink") { inkNote = true; readOnly = true; buildInkNote(enmedia, hash); return; } ResourceTable resTable(global.db); QString contextFileName; qint32 resLid = resTable.getLidByHashHex(note.guid, hash); Resource r; resTable.get(r, resLid, false); if (!r.data.isSet()) resourceError = true; else { // If we are running the formatter and we are not generating a thumbnail QString mimetype = ""; if (r.mime.isSet()) mimetype = r.mime; if (mimetype == "application/pdf" && pdfPreview && !thumbnail) { modifyPdfTags(resLid, enmedia); return; } // If we are running the formatter so we can generate a thumbnail and it is a PDF if (mimetype == "application/pdf" && pdfPreview && thumbnail) { QString printImageFile = global.fileManager.getTmpDirPath() + QString::number(resLid) +QString("-print.jpg"); QString file = global.fileManager.getDbaDirPath() + QString::number(resLid) +".pdf"; Poppler::Document *doc; doc = Poppler::Document::load(file); if (doc == NULL) return; QImage *image = new QImage(doc->page(0)->renderToImage()); image->save(printImageFile,"jpg"); delete image; enmedia.setAttribute("src", printImageFile); enmedia.removeAttribute("hash"); enmedia.removeAttribute("type"); enmedia.setOuterXml(enmedia.toOuterXml().replace("<en-media","<img")); enmedia.setOuterXml(enmedia.toOuterXml().replace("</en-media>","</img>")); return; } QString fileDetails = ""; MimeReference ref; ResourceAttributes attributes; if (r.attributes.isSet()) attributes = r.attributes; if (attributes.fileName.isSet()) fileDetails = ref.getExtensionFromMime(r.mime, fileDetails); enmedia.setAttribute("href", QString("nnres:") +global.fileManager.getDbaDirPath()+QString::number(resLid) +fileDetails); contextFileName = global.fileManager.getTmpDirPath("")+QString::number(resLid) +global.attachmentNameDelimeter + fileDetails; // Setup the context menu. This is useful if we want to do a "save as" or such contextFileName = contextFileName.replace("\\", "/"); enmedia.setAttribute("onContextMenu", "window.browserWindow.resourceContextMenu('" +contextFileName +"');"); enmedia.setAttribute("en-tag", "en-media"); enmedia.setAttribute("lid", QString::number(resLid)); enmedia.appendInside("<img/>"); QWebElement newText = enmedia.lastChild(); // Build an icon of the image QString fileExt; if (attributes.fileName.isSet()) fileExt = attributes.fileName; else fileExt = appl; QString fn; QString mime; if (attributes.fileName.isSet()) fn = attributes.fileName; if (r.mime.isSet()) mime = r.mime; fileExt = ref.getExtensionFromMime(mime, fn); QString icon = findIcon(resLid, r, fileExt); newText.setAttribute("src", "file:///"+icon); if (attributes.fileName.isSet()) newText.setAttribute("title",attributes.fileName); newText.setAttribute("en-tag", "temporary"); //Rename the tag to a <a> link enmedia.setOuterXml(enmedia.toOuterXml().replace("<en-media","<a")); enmedia.setOuterXml(enmedia.toOuterXml().replace("</en-media>","</a>")); } }
/* Modify an image tag. Basically we turn it back into a picture, write out the file, and modify the ENML */ void NoteFormatter::modifyImageTags(QWebElement &enMedia, QString &hash) { QString mimetype = enMedia.attribute("type"); qint32 resLid = 0; resLid = hashMap[hash]; QString highlightString = ""; if (resLid>0) { QLOG_TRACE() << "Getting resource"; Resource r = resourceMap[resLid]; QLOG_TRACE() << "resource retrieved"; MimeReference ref; QString filename; ResourceAttributes attributes; if (r.attributes.isSet()) attributes = r.attributes; if (attributes.fileName.isSet()) filename = attributes.fileName; QString type = ref.getExtensionFromMime(mimetype, filename); Data data; if (r.data.isSet()) data = r.data; if (data.size.isSet() && data.size > 0) { QString imgfile = "file:///"+global.fileManager.getDbDirPath(QString("dba/") +QString::number(resLid) +type); enMedia.setAttribute("src", imgfile); // Check if this is a LaTeX image ResourceAttributes attributes; if (r.attributes.isSet()) attributes = r.attributes; QString sourceUrl = ""; if (attributes.sourceURL.isSet()) sourceUrl = attributes.sourceURL; if (sourceUrl.toLower().startsWith("http://latex.codecogs.com/gif.latex?")) { enMedia.appendInside("<img/>"); QWebElement newText = enMedia.lastChild(); enMedia.setAttribute("en-tag", "en-latex"); newText.setAttribute("onMouseOver", "style.cursor='pointer'"); newText.setAttribute("title", sourceUrl); newText.setAttribute("href", "latex://"+QString::number(resLid)); } enMedia.setAttribute("onContextMenu", "window.browserWindow.imageContextMenu('" +QString::number(resLid) +"', '" +QString::number(resLid) +type +"');"); highlightString = addImageHighlight(resLid, imgfile); if (highlightString != "") enMedia.setAttribute("onload", highlightString); } } else { resourceError = true; readOnly = true; } // Reset the tags to something that WebKit will understand enMedia.setAttribute("en-tag", "en-media"); enMedia.setPlainText(""); enMedia.setAttribute("lid", QString::number(resLid)); // rename the <enmedia> tag to <img> enMedia.setOuterXml(enMedia.toOuterXml().replace("<en-media","<img")); enMedia.setOuterXml(enMedia.toOuterXml().replace("</en-media>","</img>")); }
/* This will go through and modify some of the ENML tags and turn them into HTML tags. Things like en-media & en-crypt have no HTML values, so we turn them into HTML. */ void NoteFormatter::modifyTags(QWebPage &doc) { tempFiles.clear(); // Modify en-media tags QLOG_TRACE() << "Searching for all en-media tags;"; QWebElementCollection anchors = doc.mainFrame()->findAllElements("en-media"); QLOG_TRACE() << "Search complete: " << anchors.toList().size(); foreach (QWebElement enmedia, anchors) { if (enmedia.hasAttribute("type")) { QString attr = enmedia.attribute("type"); QString hash = enmedia.attribute("hash"); QStringList type = attr.split("/"); if (type.size() >= 2) { QString appl = type[1]; QLOG_TRACE() << "En-Media tag type: " << type[0]; if (type[0] == "image") modifyImageTags(enmedia, hash); else modifyApplicationTags(enmedia, hash, appl); QLOG_TRACE() << "Type modified"; } } } // Modify todo tags anchors = doc.mainFrame()->findAllElements("en-todo"); qint32 enTodoCount = anchors.count(); for (qint32 i=enTodoCount-1; i>=0; i--) { QWebElement enmedia = anchors.at(i); modifyTodoTags(enmedia); } anchors = doc.mainFrame()->findAllElements("en-crypt"); qint32 enCryptLen = anchors.count(); for (qint32 i=enCryptLen-1; i>=0; i--) { QWebElement enmedia = anchors.at(i); QString hint = enmedia.attribute("hint"); QString cipher = enmedia.attribute("cipher", "RC2"); QString length = enmedia.attribute("length","64"); enmedia.setAttribute("contentEditable","false"); enmedia.setAttribute("src", QString("file://")+global.fileManager.getImageDirPath("encrypt.png")); enmedia.setAttribute("en-tag","en-crypt"); enmedia.setAttribute("cipher", cipher); enmedia.setAttribute("length", length); enmedia.setAttribute("hint", hint); enmedia.setAttribute("alt", enmedia.toInnerXml()); global.cryptCounter++; enmedia.setAttribute("id", "crypt"+QString().number(global.cryptCounter)); QString encryptedText = enmedia.toInnerXml(); // If the encryption string contains crlf at the end, remove them because they mess up the javascript. if (encryptedText.endsWith("\n")) encryptedText.truncate(encryptedText.length()-1); if (encryptedText.endsWith("\r")) encryptedText.truncate(encryptedText.length()-1); // Add the commands hint = hint.replace("'","'"); enmedia.setAttribute("onClick", "window.browserWindow.decryptText('crypt"+ QString().number(global.cryptCounter)+ "', '"+encryptedText+"', '"+ hint +"', '" + cipher+ "', " + length + ");"); enmedia.setAttribute("onMouseOver", "style.cursor='hand'"); enmedia.setInnerXml(""); QString k = enmedia.toOuterXml(); k.replace("<en-crypt", "<img"); k.replace("img>", "<en-crypt"); enmedia.setOuterXml(k); } // Modify link tags anchors = doc.mainFrame()->findAllElements("a"); enCryptLen = anchors.count(); for (qint32 i=0; i<anchors.count(); i++) { QWebElement element = anchors.at(i); if (!element.attribute("href").toLower().startsWith("latex://")) element.setAttribute("title", element.attribute("href")); else { element.setAttribute("title", element.attribute("title").toLower().replace("http://latex.codecogs.com/gif.latex?","")); } } }
void ShadowGUI::setNumBlocks(int count, int nTotalBlocks) { QWebElement blocksIcon = documentFrame->findFirstElement("#blocksIcon"); QWebElement syncingIcon = documentFrame->findFirstElement("#syncingIcon"); QWebElement syncProgressBar = documentFrame->findFirstElement("#syncProgressBar"); // don't show / hide progress bar and its label if we have no connection to the network if (!clientModel || clientModel->getNumConnections() == 0) { syncProgressBar.setAttribute("style", "display:none;"); return; } // -- translation (tr()) makes it difficult to neatly pick block/header static QString sBlockType = nNodeMode == NT_FULL ? tr("block") : tr("header"); static QString sBlockTypeMulti = nNodeMode == NT_FULL ? tr("blocks") : tr("headers"); QString strStatusBarWarnings = clientModel->getStatusBarWarnings(); QString tooltip; if (nNodeMode != NT_FULL && nNodeState == NS_GET_FILTERED_BLOCKS) { tooltip = tr("Synchronizing with network..."); + "\n" + tr("Downloading filtered blocks..."); int nRemainingBlocks = nTotalBlocks - pwalletMain->nLastFilteredHeight; float nPercentageDone = pwalletMain->nLastFilteredHeight / (nTotalBlocks * 0.01f); tooltip += "\n" + tr("~%1 filtered block(s) remaining (%2% done).").arg(nRemainingBlocks).arg(nPercentageDone); count = pwalletMain->nLastFilteredHeight; syncProgressBar.removeAttribute("style"); } else if (count < nTotalBlocks) { int nRemainingBlocks = nTotalBlocks - count; float nPercentageDone = count / (nTotalBlocks * 0.01f); syncProgressBar.removeAttribute("style"); if (strStatusBarWarnings.isEmpty()) { bridge->networkAlert(""); tooltip = tr("Synchronizing with network..."); if (nNodeMode == NT_FULL) { tooltip += "\n" + tr("~%n block(s) remaining", "", nRemainingBlocks); } else { char temp[128]; snprintf(temp, sizeof(temp), "~%%n %s remaining", nRemainingBlocks == 1 ? qPrintable(sBlockType) : qPrintable(sBlockTypeMulti)); tooltip += "\n" + tr(temp, "", nRemainingBlocks); }; } tooltip += (tooltip.isEmpty()? "" : "\n") + tr("Downloaded %1 of %2 %3 of transaction history (%4% done).").arg(count).arg(nTotalBlocks).arg(sBlockTypeMulti).arg(nPercentageDone, 0, 'f', 2); } else { tooltip = tr("Downloaded %1 blocks of transaction history.").arg(count); } // Override progressBarLabel text when we have warnings to display if (!strStatusBarWarnings.isEmpty()) bridge->networkAlert(strStatusBarWarnings); QDateTime lastBlockDate; if (nNodeMode == NT_FULL) lastBlockDate = clientModel->getLastBlockDate(); else lastBlockDate = clientModel->getLastBlockThinDate(); int secs = lastBlockDate.secsTo(QDateTime::currentDateTime()); QString text; // Represent time from last generated block in human readable text if (secs <= 0) { // Fully up to date. Leave text empty. } else if (secs < 60) { text = tr("%n second(s) ago","",secs); } else if (secs < 60*60) { text = tr("%n minute(s) ago","",secs/60); } else if (secs < 24*60*60) { text = tr("%n hour(s) ago","",secs/(60*60)); } else { text = tr("%n day(s) ago","",secs/(60*60*24)); } // Set icon state: spinning if catching up, tick otherwise if (secs < 90*60 && count >= nTotalBlocks && nNodeState != NS_GET_FILTERED_BLOCKS) { tooltip = tr("Up to date") + "\n" + tooltip; blocksIcon.removeClass("none"); syncingIcon.addClass("none"); QWebElementCollection outOfSyncElements = documentFrame->findAllElements(".outofsync"); foreach(QWebElement outOfSync, outOfSyncElements) outOfSync.setStyleProperty("display", "none"); syncProgressBar.setAttribute("style", "display:none;"); } else { tooltip = tr("Catching up...") + "\n" + tooltip; blocksIcon.addClass("none"); syncingIcon.removeClass("none"); QWebElementCollection outOfSyncElements = documentFrame->findAllElements(".outofsync"); foreach(QWebElement outOfSync, outOfSyncElements) outOfSync.setStyleProperty("display", "inline"); syncProgressBar.removeAttribute("style"); } if (!text.isEmpty()) { tooltip += "\n"; tooltip += tr("Last received %1 was generated %2.").arg(sBlockType).arg(text); }; blocksIcon .setAttribute("title", tooltip); syncingIcon .setAttribute("title", tooltip); syncProgressBar.setAttribute("title", tooltip); syncProgressBar.setAttribute("value", QString::number(count)); syncProgressBar.setAttribute("max", QString::number(nTotalBlocks)); }