📄 tst_qwebpage.cpp
字号:
int selectionStartOffset() { return mainFrame()->evaluateJavaScript("window.getSelection().getRangeAt(0).startOffset").toInt(); } int selectionEndOffset() { return mainFrame()->evaluateJavaScript("window.getSelection().getRangeAt(0).endOffset").toInt(); } // true if start offset == end offset, i.e. no selected text int isSelectionCollapsed() { return mainFrame()->evaluateJavaScript("window.getSelection().getRangeAt(0).collapsed").toBool(); }};void tst_QWebPage::cursorMovements(){ CursorTrackedPage* page = new CursorTrackedPage; QString content("<html><body<p id=one>The quick brown fox</p><p id=two>jumps over the lazy dog</p><p>May the source<br/>be with you!</p></body></html>"); page->mainFrame()->setHtml(content); // this will select the first paragraph QString script = "var range = document.createRange(); " \ "var node = document.getElementById(\"one\"); " \ "range.selectNode(node); " \ "getSelection().addRange(range);"; page->mainFrame()->evaluateJavaScript(script); QCOMPARE(page->selectedText().trimmed(), QString::fromLatin1("The quick brown fox")); // these actions must exist QVERIFY(page->action(QWebPage::MoveToNextChar) != 0); QVERIFY(page->action(QWebPage::MoveToPreviousChar) != 0); QVERIFY(page->action(QWebPage::MoveToNextWord) != 0); QVERIFY(page->action(QWebPage::MoveToPreviousWord) != 0); QVERIFY(page->action(QWebPage::MoveToNextLine) != 0); QVERIFY(page->action(QWebPage::MoveToPreviousLine) != 0); QVERIFY(page->action(QWebPage::MoveToStartOfLine) != 0); QVERIFY(page->action(QWebPage::MoveToEndOfLine) != 0); QVERIFY(page->action(QWebPage::MoveToStartOfBlock) != 0); QVERIFY(page->action(QWebPage::MoveToEndOfBlock) != 0); QVERIFY(page->action(QWebPage::MoveToStartOfDocument) != 0); QVERIFY(page->action(QWebPage::MoveToEndOfDocument) != 0); // right now they are disabled because contentEditable is false QCOMPARE(page->action(QWebPage::MoveToNextChar)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToPreviousChar)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToNextWord)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToPreviousWord)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToNextLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToPreviousLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToStartOfLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToEndOfLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToStartOfBlock)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToEndOfBlock)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToStartOfDocument)->isEnabled(), false); QCOMPARE(page->action(QWebPage::MoveToEndOfDocument)->isEnabled(), false); // make it editable before navigating the cursor page->setContentEditable(true); // here the actions are enabled after contentEditable is true QCOMPARE(page->action(QWebPage::MoveToNextChar)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToPreviousChar)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToNextWord)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToPreviousWord)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToNextLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToPreviousLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToStartOfLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToEndOfLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToStartOfBlock)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToEndOfBlock)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToStartOfDocument)->isEnabled(), true); QCOMPARE(page->action(QWebPage::MoveToEndOfDocument)->isEnabled(), true); // cursor will be before the word "jump" page->triggerAction(QWebPage::MoveToNextChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 0); // cursor will be between 'j' and 'u' in the word "jump" page->triggerAction(QWebPage::MoveToNextChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 1); // cursor will be between 'u' and 'm' in the word "jump" page->triggerAction(QWebPage::MoveToNextChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 2); // cursor will be after the word "jump" page->triggerAction(QWebPage::MoveToNextWord); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 5); // cursor will be after the word "lazy" page->triggerAction(QWebPage::MoveToNextWord); page->triggerAction(QWebPage::MoveToNextWord); page->triggerAction(QWebPage::MoveToNextWord); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 19); // cursor will be between 'z' and 'y' in "lazy" page->triggerAction(QWebPage::MoveToPreviousChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 18); // cursor will be between 'a' and 'z' in "lazy" page->triggerAction(QWebPage::MoveToPreviousChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 17); // cursor will be before the word "lazy" page->triggerAction(QWebPage::MoveToPreviousWord); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 15); // cursor will be before the word "quick" page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToPreviousWord); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 4); // cursor will be between 'p' and 's' in the word "jumps" page->triggerAction(QWebPage::MoveToNextWord); page->triggerAction(QWebPage::MoveToNextWord); page->triggerAction(QWebPage::MoveToNextWord); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 4); // cursor will be before the word "jumps" page->triggerAction(QWebPage::MoveToStartOfLine); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 0); // cursor will be after the word "dog" page->triggerAction(QWebPage::MoveToEndOfLine); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 23); // cursor will be between 'w' and 'n' in "brown" page->triggerAction(QWebPage::MoveToStartOfLine); page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToPreviousWord); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); page->triggerAction(QWebPage::MoveToNextChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 14); // cursor will be after the word "fox" page->triggerAction(QWebPage::MoveToEndOfLine); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 19); // cursor will be before the word "The" page->triggerAction(QWebPage::MoveToStartOfDocument); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 0); // cursor will be after the word "you!" page->triggerAction(QWebPage::MoveToEndOfDocument); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 12); // cursor will be before the word "be" page->triggerAction(QWebPage::MoveToStartOfBlock); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 2); // cursor will be after the word "you!" page->triggerAction(QWebPage::MoveToEndOfBlock); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 12); // try to move before the document start page->triggerAction(QWebPage::MoveToStartOfDocument); page->triggerAction(QWebPage::MoveToPreviousChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 0); page->triggerAction(QWebPage::MoveToStartOfDocument); page->triggerAction(QWebPage::MoveToPreviousWord); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 0); // try to move past the document end page->triggerAction(QWebPage::MoveToEndOfDocument); page->triggerAction(QWebPage::MoveToNextChar); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 12); page->triggerAction(QWebPage::MoveToEndOfDocument); page->triggerAction(QWebPage::MoveToNextWord); QVERIFY(page->isSelectionCollapsed()); QCOMPARE(page->selectionStartOffset(), 12); delete page;}void tst_QWebPage::textSelection(){ CursorTrackedPage* page = new CursorTrackedPage; QString content("<html><body<p id=one>The quick brown fox</p>" \ "<p id=two>jumps over the lazy dog</p>" \ "<p>May the source<br/>be with you!</p></body></html>"); page->mainFrame()->setHtml(content); // this will select the first paragraph QString script = "var range = document.createRange(); " \ "var node = document.getElementById(\"one\"); " \ "range.selectNode(node); " \ "getSelection().addRange(range);"; page->mainFrame()->evaluateJavaScript(script); QCOMPARE(page->selectedText().trimmed(), QString::fromLatin1("The quick brown fox")); // these actions must exist QVERIFY(page->action(QWebPage::SelectAll) != 0); QVERIFY(page->action(QWebPage::SelectNextChar) != 0); QVERIFY(page->action(QWebPage::SelectPreviousChar) != 0); QVERIFY(page->action(QWebPage::SelectNextWord) != 0); QVERIFY(page->action(QWebPage::SelectPreviousWord) != 0); QVERIFY(page->action(QWebPage::SelectNextLine) != 0); QVERIFY(page->action(QWebPage::SelectPreviousLine) != 0); QVERIFY(page->action(QWebPage::SelectStartOfLine) != 0); QVERIFY(page->action(QWebPage::SelectEndOfLine) != 0); QVERIFY(page->action(QWebPage::SelectStartOfBlock) != 0); QVERIFY(page->action(QWebPage::SelectEndOfBlock) != 0); QVERIFY(page->action(QWebPage::SelectStartOfDocument) != 0); QVERIFY(page->action(QWebPage::SelectEndOfDocument) != 0); // right now they are disabled because contentEditable is false QCOMPARE(page->action(QWebPage::SelectAll)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectNextChar)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectPreviousChar)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectNextWord)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectPreviousWord)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectNextLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectPreviousLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectStartOfLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectEndOfLine)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectStartOfBlock)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectEndOfBlock)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectStartOfDocument)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SelectEndOfDocument)->isEnabled(), false); // make it editable before navigating the cursor page->setContentEditable(true); // here the actions are enabled after contentEditable is true QCOMPARE(page->action(QWebPage::SelectAll)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectNextChar)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectPreviousChar)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectNextWord)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectPreviousWord)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectNextLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectPreviousLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectStartOfLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectEndOfLine)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectStartOfBlock)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectEndOfBlock)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectStartOfDocument)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SelectEndOfDocument)->isEnabled(), true); delete page;}void tst_QWebPage::textEditing(){ CursorTrackedPage* page = new CursorTrackedPage; QString content("<html><body<p id=one>The quick brown fox</p>" \ "<p id=two>jumps over the lazy dog</p>" \ "<p>May the source<br/>be with you!</p></body></html>"); page->mainFrame()->setHtml(content); // this will select the first paragraph QString script = "var range = document.createRange(); " \ "var node = document.getElementById(\"one\"); " \ "range.selectNode(node); " \ "getSelection().addRange(range);"; page->mainFrame()->evaluateJavaScript(script); QCOMPARE(page->selectedText().trimmed(), QString::fromLatin1("The quick brown fox")); // these actions must exist QVERIFY(page->action(QWebPage::DeleteStartOfWord) != 0); QVERIFY(page->action(QWebPage::DeleteEndOfWord) != 0); QVERIFY(page->action(QWebPage::SetTextDirectionDefault) != 0); QVERIFY(page->action(QWebPage::SetTextDirectionLeftToRight) != 0); QVERIFY(page->action(QWebPage::SetTextDirectionRightToLeft) != 0); QVERIFY(page->action(QWebPage::ToggleBold) != 0); QVERIFY(page->action(QWebPage::ToggleItalic) != 0); QVERIFY(page->action(QWebPage::ToggleUnderline) != 0); // right now they are disabled because contentEditable is false QCOMPARE(page->action(QWebPage::DeleteStartOfWord)->isEnabled(), false); QCOMPARE(page->action(QWebPage::DeleteEndOfWord)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SetTextDirectionDefault)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SetTextDirectionLeftToRight)->isEnabled(), false); QCOMPARE(page->action(QWebPage::SetTextDirectionRightToLeft)->isEnabled(), false); QCOMPARE(page->action(QWebPage::ToggleBold)->isEnabled(), false); QCOMPARE(page->action(QWebPage::ToggleItalic)->isEnabled(), false); QCOMPARE(page->action(QWebPage::ToggleUnderline)->isEnabled(), false); // make it editable before navigating the cursor page->setContentEditable(true); // here the actions are enabled after contentEditable is true QCOMPARE(page->action(QWebPage::DeleteStartOfWord)->isEnabled(), true); QCOMPARE(page->action(QWebPage::DeleteEndOfWord)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SetTextDirectionDefault)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SetTextDirectionLeftToRight)->isEnabled(), true); QCOMPARE(page->action(QWebPage::SetTextDirectionRightToLeft)->isEnabled(), true); QCOMPARE(page->action(QWebPage::ToggleBold)->isEnabled(), true); QCOMPARE(page->action(QWebPage::ToggleItalic)->isEnabled(), true); QCOMPARE(page->action(QWebPage::ToggleUnderline)->isEnabled(), true); delete page;}QTEST_MAIN(tst_QWebPage)#include "tst_qwebpage.moc"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -