1 /* |
|
2 Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
|
3 |
|
4 This library is free software; you can redistribute it and/or |
|
5 modify it under the terms of the GNU Library General Public |
|
6 License as published by the Free Software Foundation; either |
|
7 version 2 of the License, or (at your option) any later version. |
|
8 |
|
9 This library is distributed in the hope that it will be useful, |
|
10 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
12 Library General Public License for more details. |
|
13 |
|
14 You should have received a copy of the GNU Library General Public License |
|
15 along with this library; see the file COPYING.LIB. If not, write to |
|
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
|
17 Boston, MA 02110-1301, USA. |
|
18 */ |
|
19 |
|
20 |
|
21 #include <QtTest/QtTest> |
|
22 #include <qwebpage.h> |
|
23 #include <qwidget.h> |
|
24 #include <qwebview.h> |
|
25 #include <qwebframe.h> |
|
26 #include <qwebelement.h> |
|
27 #include <util.h> |
|
28 //TESTED_CLASS= |
|
29 //TESTED_FILES= |
|
30 |
|
31 class tst_QWebElement : public QObject |
|
32 { |
|
33 Q_OBJECT |
|
34 |
|
35 public: |
|
36 tst_QWebElement(); |
|
37 virtual ~tst_QWebElement(); |
|
38 |
|
39 public slots: |
|
40 void init(); |
|
41 void cleanup(); |
|
42 |
|
43 private slots: |
|
44 void textHtml(); |
|
45 void simpleCollection(); |
|
46 void attributes(); |
|
47 void attributesNS(); |
|
48 void listAttributes(); |
|
49 void classes(); |
|
50 void namespaceURI(); |
|
51 void iteration(); |
|
52 void nonConstIterator(); |
|
53 void constIterator(); |
|
54 void foreachManipulation(); |
|
55 void emptyCollection(); |
|
56 void appendCollection(); |
|
57 void evaluateJavaScript(); |
|
58 void documentElement(); |
|
59 void frame(); |
|
60 void style(); |
|
61 void computedStyle(); |
|
62 void appendAndPrepend(); |
|
63 void insertBeforeAndAfter(); |
|
64 void remove(); |
|
65 void clear(); |
|
66 void replaceWith(); |
|
67 void encloseWith(); |
|
68 void encloseContentsWith(); |
|
69 void nullSelect(); |
|
70 void firstChildNextSibling(); |
|
71 void lastChildPreviousSibling(); |
|
72 void hasSetFocus(); |
|
73 void render(); |
|
74 |
|
75 private: |
|
76 QWebView* m_view; |
|
77 QWebPage* m_page; |
|
78 QWebFrame* m_mainFrame; |
|
79 }; |
|
80 |
|
81 tst_QWebElement::tst_QWebElement() |
|
82 { |
|
83 } |
|
84 |
|
85 tst_QWebElement::~tst_QWebElement() |
|
86 { |
|
87 } |
|
88 |
|
89 void tst_QWebElement::init() |
|
90 { |
|
91 m_view = new QWebView(); |
|
92 m_page = m_view->page(); |
|
93 m_mainFrame = m_page->mainFrame(); |
|
94 } |
|
95 |
|
96 void tst_QWebElement::cleanup() |
|
97 { |
|
98 delete m_view; |
|
99 } |
|
100 |
|
101 void tst_QWebElement::textHtml() |
|
102 { |
|
103 QString html = "<head></head><body><p>test</p></body>"; |
|
104 m_mainFrame->setHtml(html); |
|
105 QWebElement body = m_mainFrame->documentElement(); |
|
106 QVERIFY(!body.isNull()); |
|
107 |
|
108 QCOMPARE(body.toPlainText(), QString("test")); |
|
109 QCOMPARE(body.toPlainText(), m_mainFrame->toPlainText()); |
|
110 |
|
111 QCOMPARE(body.toInnerXml(), html); |
|
112 } |
|
113 |
|
114 void tst_QWebElement::simpleCollection() |
|
115 { |
|
116 QString html = "<body><p>first para</p><p>second para</p></body>"; |
|
117 m_mainFrame->setHtml(html); |
|
118 QWebElement body = m_mainFrame->documentElement(); |
|
119 |
|
120 QWebElementCollection list = body.findAll("p"); |
|
121 QCOMPARE(list.count(), 2); |
|
122 QCOMPARE(list.at(0).toPlainText(), QString("first para")); |
|
123 QCOMPARE(list.at(1).toPlainText(), QString("second para")); |
|
124 } |
|
125 |
|
126 void tst_QWebElement::attributes() |
|
127 { |
|
128 m_mainFrame->setHtml("<body><p>Test"); |
|
129 QWebElement body = m_mainFrame->documentElement(); |
|
130 |
|
131 QVERIFY(!body.hasAttribute("title")); |
|
132 QVERIFY(!body.hasAttributes()); |
|
133 |
|
134 body.setAttribute("title", "test title"); |
|
135 |
|
136 QVERIFY(body.hasAttributes()); |
|
137 QVERIFY(body.hasAttribute("title")); |
|
138 |
|
139 QCOMPARE(body.attribute("title"), QString("test title")); |
|
140 |
|
141 body.removeAttribute("title"); |
|
142 |
|
143 QVERIFY(!body.hasAttribute("title")); |
|
144 QVERIFY(!body.hasAttributes()); |
|
145 |
|
146 QCOMPARE(body.attribute("does-not-exist", "testvalue"), QString("testvalue")); |
|
147 } |
|
148 |
|
149 void tst_QWebElement::attributesNS() |
|
150 { |
|
151 QString content = "<html xmlns=\"http://www.w3.org/1999/xhtml\" " |
|
152 "xmlns:svg=\"http://www.w3.org/2000/svg\">" |
|
153 "<body><svg:svg id=\"foobar\" width=\"400px\" height=\"300px\">" |
|
154 "</svg:svg></body></html>"; |
|
155 |
|
156 m_mainFrame->setContent(content.toUtf8(), "application/xhtml+xml"); |
|
157 |
|
158 QWebElement svg = m_mainFrame->findFirstElement("svg"); |
|
159 QVERIFY(!svg.isNull()); |
|
160 |
|
161 QVERIFY(!svg.hasAttributeNS("http://www.w3.org/2000/svg", "foobar")); |
|
162 QCOMPARE(svg.attributeNS("http://www.w3.org/2000/svg", "foobar", "defaultblah"), QString("defaultblah")); |
|
163 svg.setAttributeNS("http://www.w3.org/2000/svg", "svg:foobar", "true"); |
|
164 QVERIFY(svg.hasAttributeNS("http://www.w3.org/2000/svg", "foobar")); |
|
165 QCOMPARE(svg.attributeNS("http://www.w3.org/2000/svg", "foobar", "defaultblah"), QString("true")); |
|
166 } |
|
167 |
|
168 void tst_QWebElement::listAttributes() |
|
169 { |
|
170 QString content = "<html xmlns=\"http://www.w3.org/1999/xhtml\" " |
|
171 "xmlns:svg=\"http://www.w3.org/2000/svg\">" |
|
172 "<body><svg:svg foo=\"\" svg:bar=\"\">" |
|
173 "</svg:svg></body></html>"; |
|
174 |
|
175 m_mainFrame->setContent(content.toUtf8(), "application/xhtml+xml"); |
|
176 |
|
177 QWebElement svg = m_mainFrame->findFirstElement("svg"); |
|
178 QVERIFY(!svg.isNull()); |
|
179 |
|
180 QVERIFY(svg.attributeNames().contains("foo")); |
|
181 QVERIFY(svg.attributeNames("http://www.w3.org/2000/svg").contains("bar")); |
|
182 |
|
183 svg.setAttributeNS("http://www.w3.org/2000/svg", "svg:foobar", "true"); |
|
184 QVERIFY(svg.attributeNames().contains("foo")); |
|
185 QStringList attributes = svg.attributeNames("http://www.w3.org/2000/svg"); |
|
186 QCOMPARE(attributes.size(), 2); |
|
187 QVERIFY(attributes.contains("bar")); |
|
188 QVERIFY(attributes.contains("foobar")); |
|
189 } |
|
190 |
|
191 void tst_QWebElement::classes() |
|
192 { |
|
193 m_mainFrame->setHtml("<body><p class=\"a b c d a c\">Test"); |
|
194 |
|
195 QWebElement body = m_mainFrame->documentElement(); |
|
196 QCOMPARE(body.classes().count(), 0); |
|
197 |
|
198 QWebElement p = m_mainFrame->documentElement().findAll("p").at(0); |
|
199 QStringList classes = p.classes(); |
|
200 QCOMPARE(classes.count(), 4); |
|
201 QCOMPARE(classes[0], QLatin1String("a")); |
|
202 QCOMPARE(classes[1], QLatin1String("b")); |
|
203 QCOMPARE(classes[2], QLatin1String("c")); |
|
204 QCOMPARE(classes[3], QLatin1String("d")); |
|
205 QVERIFY(p.hasClass("a")); |
|
206 QVERIFY(p.hasClass("b")); |
|
207 QVERIFY(p.hasClass("c")); |
|
208 QVERIFY(p.hasClass("d")); |
|
209 QVERIFY(!p.hasClass("e")); |
|
210 |
|
211 p.addClass("f"); |
|
212 QVERIFY(p.hasClass("f")); |
|
213 p.addClass("a"); |
|
214 QCOMPARE(p.classes().count(), 5); |
|
215 QVERIFY(p.hasClass("a")); |
|
216 QVERIFY(p.hasClass("b")); |
|
217 QVERIFY(p.hasClass("c")); |
|
218 QVERIFY(p.hasClass("d")); |
|
219 |
|
220 p.toggleClass("a"); |
|
221 QVERIFY(!p.hasClass("a")); |
|
222 QVERIFY(p.hasClass("b")); |
|
223 QVERIFY(p.hasClass("c")); |
|
224 QVERIFY(p.hasClass("d")); |
|
225 QVERIFY(p.hasClass("f")); |
|
226 QCOMPARE(p.classes().count(), 4); |
|
227 p.toggleClass("f"); |
|
228 QVERIFY(!p.hasClass("f")); |
|
229 QCOMPARE(p.classes().count(), 3); |
|
230 p.toggleClass("a"); |
|
231 p.toggleClass("f"); |
|
232 QVERIFY(p.hasClass("a")); |
|
233 QVERIFY(p.hasClass("f")); |
|
234 QCOMPARE(p.classes().count(), 5); |
|
235 |
|
236 p.removeClass("f"); |
|
237 QVERIFY(!p.hasClass("f")); |
|
238 QCOMPARE(p.classes().count(), 4); |
|
239 p.removeClass("d"); |
|
240 QVERIFY(!p.hasClass("d")); |
|
241 QCOMPARE(p.classes().count(), 3); |
|
242 p.removeClass("not-exist"); |
|
243 QCOMPARE(p.classes().count(), 3); |
|
244 p.removeClass("c"); |
|
245 QVERIFY(!p.hasClass("c")); |
|
246 QCOMPARE(p.classes().count(), 2); |
|
247 p.removeClass("b"); |
|
248 QVERIFY(!p.hasClass("b")); |
|
249 QCOMPARE(p.classes().count(), 1); |
|
250 p.removeClass("a"); |
|
251 QVERIFY(!p.hasClass("a")); |
|
252 QCOMPARE(p.classes().count(), 0); |
|
253 p.removeClass("foobar"); |
|
254 QCOMPARE(p.classes().count(), 0); |
|
255 } |
|
256 |
|
257 void tst_QWebElement::namespaceURI() |
|
258 { |
|
259 QString content = "<html xmlns=\"http://www.w3.org/1999/xhtml\" " |
|
260 "xmlns:svg=\"http://www.w3.org/2000/svg\">" |
|
261 "<body><svg:svg id=\"foobar\" width=\"400px\" height=\"300px\">" |
|
262 "</svg:svg></body></html>"; |
|
263 |
|
264 m_mainFrame->setContent(content.toUtf8(), "application/xhtml+xml"); |
|
265 QWebElement body = m_mainFrame->documentElement(); |
|
266 QCOMPARE(body.namespaceUri(), QLatin1String("http://www.w3.org/1999/xhtml")); |
|
267 |
|
268 QWebElement svg = body.findAll("*#foobar").at(0); |
|
269 QCOMPARE(svg.prefix(), QLatin1String("svg")); |
|
270 QCOMPARE(svg.localName(), QLatin1String("svg")); |
|
271 QCOMPARE(svg.tagName(), QLatin1String("svg:svg")); |
|
272 QCOMPARE(svg.namespaceUri(), QLatin1String("http://www.w3.org/2000/svg")); |
|
273 |
|
274 } |
|
275 |
|
276 void tst_QWebElement::iteration() |
|
277 { |
|
278 QString html = "<body><p>first para</p><p>second para</p></body>"; |
|
279 m_mainFrame->setHtml(html); |
|
280 QWebElement body = m_mainFrame->documentElement(); |
|
281 |
|
282 QWebElementCollection paras = body.findAll("p"); |
|
283 QList<QWebElement> referenceList = paras.toList(); |
|
284 |
|
285 QList<QWebElement> foreachList; |
|
286 foreach(QWebElement p, paras) { |
|
287 foreachList.append(p); |
|
288 } |
|
289 QVERIFY(foreachList.count() == 2); |
|
290 QCOMPARE(foreachList.count(), referenceList.count()); |
|
291 QCOMPARE(foreachList.at(0), referenceList.at(0)); |
|
292 QCOMPARE(foreachList.at(1), referenceList.at(1)); |
|
293 |
|
294 QList<QWebElement> forLoopList; |
|
295 for (int i = 0; i < paras.count(); ++i) { |
|
296 forLoopList.append(paras.at(i)); |
|
297 } |
|
298 QVERIFY(foreachList.count() == 2); |
|
299 QCOMPARE(foreachList.count(), referenceList.count()); |
|
300 QCOMPARE(foreachList.at(0), referenceList.at(0)); |
|
301 QCOMPARE(foreachList.at(1), referenceList.at(1)); |
|
302 |
|
303 for (int i = 0; i < paras.count(); ++i) { |
|
304 QCOMPARE(paras.at(i), paras[i]); |
|
305 } |
|
306 |
|
307 QCOMPARE(paras.at(0), paras.first()); |
|
308 QCOMPARE(paras.at(1), paras.last()); |
|
309 } |
|
310 |
|
311 void tst_QWebElement::nonConstIterator() |
|
312 { |
|
313 QString html = "<body><p>first para</p><p>second para</p></body>"; |
|
314 m_mainFrame->setHtml(html); |
|
315 QWebElement body = m_mainFrame->documentElement(); |
|
316 QWebElementCollection paras = body.findAll("p"); |
|
317 |
|
318 QWebElementCollection::iterator it = paras.begin(); |
|
319 QCOMPARE(*it, paras.at(0)); |
|
320 ++it; |
|
321 (*it).encloseWith("<div>"); |
|
322 QCOMPARE(*it, paras.at(1)); |
|
323 ++it; |
|
324 QCOMPARE(it, paras.end()); |
|
325 } |
|
326 |
|
327 void tst_QWebElement::constIterator() |
|
328 { |
|
329 QString html = "<body><p>first para</p><p>second para</p></body>"; |
|
330 m_mainFrame->setHtml(html); |
|
331 QWebElement body = m_mainFrame->documentElement(); |
|
332 const QWebElementCollection paras = body.findAll("p"); |
|
333 |
|
334 QWebElementCollection::const_iterator it = paras.begin(); |
|
335 QCOMPARE(*it, paras.at(0)); |
|
336 ++it; |
|
337 QCOMPARE(*it, paras.at(1)); |
|
338 ++it; |
|
339 QCOMPARE(it, paras.end()); |
|
340 } |
|
341 |
|
342 void tst_QWebElement::foreachManipulation() |
|
343 { |
|
344 QString html = "<body><p>first para</p><p>second para</p></body>"; |
|
345 m_mainFrame->setHtml(html); |
|
346 QWebElement body = m_mainFrame->documentElement(); |
|
347 |
|
348 foreach(QWebElement p, body.findAll("p")) { |
|
349 p.setInnerXml("<div>foo</div><div>bar</div>"); |
|
350 } |
|
351 |
|
352 QCOMPARE(body.findAll("div").count(), 4); |
|
353 } |
|
354 |
|
355 void tst_QWebElement::emptyCollection() |
|
356 { |
|
357 QWebElementCollection emptyCollection; |
|
358 QCOMPARE(emptyCollection.count(), 0); |
|
359 } |
|
360 |
|
361 void tst_QWebElement::appendCollection() |
|
362 { |
|
363 QString html = "<body><span class='a'>aaa</span><p>first para</p><div>foo</div>" |
|
364 "<span class='b'>bbb</span><p>second para</p><div>bar</div></body>"; |
|
365 m_mainFrame->setHtml(html); |
|
366 QWebElement body = m_mainFrame->documentElement(); |
|
367 |
|
368 QWebElementCollection collection = body.findAll("p"); |
|
369 QCOMPARE(collection.count(), 2); |
|
370 |
|
371 collection.append(body.findAll("div")); |
|
372 QCOMPARE(collection.count(), 4); |
|
373 |
|
374 collection += body.findAll("span.a"); |
|
375 QCOMPARE(collection.count(), 5); |
|
376 |
|
377 QWebElementCollection all = collection + body.findAll("span.b"); |
|
378 QCOMPARE(all.count(), 6); |
|
379 QCOMPARE(collection.count(), 5); |
|
380 |
|
381 all += collection; |
|
382 QCOMPARE(all.count(), 11); |
|
383 |
|
384 QCOMPARE(collection.count(), 5); |
|
385 QWebElementCollection test; |
|
386 test.append(collection); |
|
387 QCOMPARE(test.count(), 5); |
|
388 test.append(QWebElementCollection()); |
|
389 QCOMPARE(test.count(), 5); |
|
390 } |
|
391 |
|
392 void tst_QWebElement::evaluateJavaScript() |
|
393 { |
|
394 QVariant result; |
|
395 m_mainFrame->setHtml("<body><p>test"); |
|
396 QWebElement para = m_mainFrame->findFirstElement("p"); |
|
397 |
|
398 result = para.evaluateJavaScript("this.tagName"); |
|
399 QVERIFY(result.isValid()); |
|
400 QVERIFY(result.type() == QVariant::String); |
|
401 QCOMPARE(result.toString(), QLatin1String("P")); |
|
402 |
|
403 result = para.evaluateJavaScript("this.hasAttributes()"); |
|
404 QVERIFY(result.isValid()); |
|
405 QVERIFY(result.type() == QVariant::Bool); |
|
406 QVERIFY(!result.toBool()); |
|
407 |
|
408 para.evaluateJavaScript("this.setAttribute('align', 'left');"); |
|
409 QCOMPARE(para.attribute("align"), QLatin1String("left")); |
|
410 |
|
411 result = para.evaluateJavaScript("this.hasAttributes()"); |
|
412 QVERIFY(result.isValid()); |
|
413 QVERIFY(result.type() == QVariant::Bool); |
|
414 QVERIFY(result.toBool()); |
|
415 } |
|
416 |
|
417 void tst_QWebElement::documentElement() |
|
418 { |
|
419 m_mainFrame->setHtml("<body><p>Test"); |
|
420 |
|
421 QWebElement para = m_mainFrame->documentElement().findAll("p").at(0); |
|
422 QVERIFY(para.parent().parent() == m_mainFrame->documentElement()); |
|
423 QVERIFY(para.document() == m_mainFrame->documentElement()); |
|
424 } |
|
425 |
|
426 void tst_QWebElement::frame() |
|
427 { |
|
428 m_mainFrame->setHtml("<body><p>test"); |
|
429 |
|
430 QWebElement doc = m_mainFrame->documentElement(); |
|
431 QVERIFY(doc.webFrame() == m_mainFrame); |
|
432 |
|
433 m_view->setHtml(QString("data:text/html,<frameset cols=\"25%,75%\"><frame src=\"data:text/html," |
|
434 "<p>frame1\">" |
|
435 "<frame src=\"data:text/html,<p>frame2\"></frameset>"), QUrl()); |
|
436 |
|
437 waitForSignal(m_page, SIGNAL(loadFinished(bool))); |
|
438 |
|
439 QCOMPARE(m_mainFrame->childFrames().count(), 2); |
|
440 |
|
441 QWebFrame* firstFrame = m_mainFrame->childFrames().at(0); |
|
442 QWebFrame* secondFrame = m_mainFrame->childFrames().at(1); |
|
443 |
|
444 QCOMPARE(firstFrame->toPlainText(), QString("frame1")); |
|
445 QCOMPARE(secondFrame->toPlainText(), QString("frame2")); |
|
446 |
|
447 QWebElement firstPara = firstFrame->documentElement().findAll("p").at(0); |
|
448 QWebElement secondPara = secondFrame->documentElement().findAll("p").at(0); |
|
449 |
|
450 QVERIFY(firstPara.webFrame() == firstFrame); |
|
451 QVERIFY(secondPara.webFrame() == secondFrame); |
|
452 } |
|
453 |
|
454 void tst_QWebElement::style() |
|
455 { |
|
456 QString html = "<head>" |
|
457 "<style type='text/css'>" |
|
458 "p { color: green !important }" |
|
459 "#idP { color: red }" |
|
460 ".classP { color : yellow ! important }" |
|
461 "</style>" |
|
462 "</head>" |
|
463 "<body>" |
|
464 "<p id='idP' class='classP' style='color: blue;'>some text</p>" |
|
465 "</body>"; |
|
466 |
|
467 m_mainFrame->setHtml(html); |
|
468 |
|
469 QWebElement p = m_mainFrame->documentElement().findAll("p").at(0); |
|
470 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("blue")); |
|
471 QVERIFY(p.styleProperty("cursor", QWebElement::InlineStyle).isEmpty()); |
|
472 |
|
473 p.setStyleProperty("color", "red"); |
|
474 p.setStyleProperty("cursor", "auto"); |
|
475 |
|
476 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("red")); |
|
477 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("yellow")); |
|
478 QCOMPARE(p.styleProperty("cursor", QWebElement::InlineStyle), QLatin1String("auto")); |
|
479 |
|
480 p.setStyleProperty("color", "green !important"); |
|
481 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("green")); |
|
482 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("green")); |
|
483 |
|
484 p.setStyleProperty("color", "blue"); |
|
485 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("green")); |
|
486 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("green")); |
|
487 |
|
488 p.setStyleProperty("color", "blue !important"); |
|
489 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("blue")); |
|
490 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("blue")); |
|
491 |
|
492 QString html2 = "<head>" |
|
493 "<style type='text/css'>" |
|
494 "p { color: green }" |
|
495 "#idP { color: red }" |
|
496 ".classP { color: yellow }" |
|
497 "</style>" |
|
498 "</head>" |
|
499 "<body>" |
|
500 "<p id='idP' class='classP' style='color: blue;'>some text</p>" |
|
501 "</body>"; |
|
502 |
|
503 m_mainFrame->setHtml(html2); |
|
504 p = m_mainFrame->documentElement().findAll("p").at(0); |
|
505 |
|
506 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("blue")); |
|
507 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("blue")); |
|
508 |
|
509 QString html3 = "<head>" |
|
510 "<style type='text/css'>" |
|
511 "p { color: green !important }" |
|
512 "#idP { color: red !important}" |
|
513 ".classP { color: yellow !important}" |
|
514 "</style>" |
|
515 "</head>" |
|
516 "<body>" |
|
517 "<p id='idP' class='classP' style='color: blue !important;'>some text</p>" |
|
518 "</body>"; |
|
519 |
|
520 m_mainFrame->setHtml(html3); |
|
521 p = m_mainFrame->documentElement().findAll("p").at(0); |
|
522 |
|
523 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("blue")); |
|
524 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("blue")); |
|
525 |
|
526 QString html5 = "<head>" |
|
527 "<style type='text/css'>" |
|
528 "p { color: green }" |
|
529 "#idP { color: red }" |
|
530 ".classP { color: yellow }" |
|
531 "</style>" |
|
532 "</head>" |
|
533 "<body>" |
|
534 "<p id='idP' class='classP'>some text</p>" |
|
535 "</body>"; |
|
536 |
|
537 m_mainFrame->setHtml(html5); |
|
538 p = m_mainFrame->documentElement().findAll("p").at(0); |
|
539 |
|
540 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("")); |
|
541 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("red")); |
|
542 |
|
543 QString html6 = "<head>" |
|
544 "<link rel='stylesheet' href='qrc:/style.css' type='text/css' />" |
|
545 "<style type='text/css'>" |
|
546 "p { color: green }" |
|
547 "#idP { color: red }" |
|
548 ".classP { color: yellow ! important}" |
|
549 "</style>" |
|
550 "</head>" |
|
551 "<body>" |
|
552 "<p id='idP' class='classP' style='color: blue;'>some text</p>" |
|
553 "</body>"; |
|
554 |
|
555 // in few seconds, the CSS should be completey loaded |
|
556 m_mainFrame->setHtml(html6); |
|
557 waitForSignal(m_page, SIGNAL(loadFinished(bool)), 200); |
|
558 |
|
559 p = m_mainFrame->documentElement().findAll("p").at(0); |
|
560 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("blue")); |
|
561 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("black")); |
|
562 |
|
563 QString html7 = "<head>" |
|
564 "<style type='text/css'>" |
|
565 "@import url(qrc:/style2.css);" |
|
566 "</style>" |
|
567 "<link rel='stylesheet' href='qrc:/style.css' type='text/css' />" |
|
568 "</head>" |
|
569 "<body>" |
|
570 "<p id='idP' style='color: blue;'>some text</p>" |
|
571 "</body>"; |
|
572 |
|
573 // in few seconds, the style should be completey loaded |
|
574 m_mainFrame->setHtml(html7); |
|
575 waitForSignal(m_page, SIGNAL(loadFinished(bool)), 200); |
|
576 |
|
577 p = m_mainFrame->documentElement().findAll("p").at(0); |
|
578 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("black")); |
|
579 |
|
580 QString html8 = "<body><p>some text</p></body>"; |
|
581 |
|
582 m_mainFrame->setHtml(html8); |
|
583 p = m_mainFrame->documentElement().findAll("p").at(0); |
|
584 |
|
585 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("")); |
|
586 QCOMPARE(p.styleProperty("color", QWebElement::CascadedStyle), QLatin1String("")); |
|
587 } |
|
588 |
|
589 void tst_QWebElement::computedStyle() |
|
590 { |
|
591 QString html = "<body><p>some text</p></body>"; |
|
592 m_mainFrame->setHtml(html); |
|
593 |
|
594 QWebElement p = m_mainFrame->documentElement().findAll("p").at(0); |
|
595 QCOMPARE(p.styleProperty("cursor", QWebElement::ComputedStyle), QLatin1String("auto")); |
|
596 QVERIFY(!p.styleProperty("cursor", QWebElement::ComputedStyle).isEmpty()); |
|
597 QVERIFY(p.styleProperty("cursor", QWebElement::InlineStyle).isEmpty()); |
|
598 |
|
599 p.setStyleProperty("cursor", "text"); |
|
600 p.setStyleProperty("color", "red"); |
|
601 |
|
602 QCOMPARE(p.styleProperty("cursor", QWebElement::ComputedStyle), QLatin1String("text")); |
|
603 QCOMPARE(p.styleProperty("color", QWebElement::ComputedStyle), QLatin1String("rgb(255, 0, 0)")); |
|
604 QCOMPARE(p.styleProperty("color", QWebElement::InlineStyle), QLatin1String("red")); |
|
605 } |
|
606 |
|
607 void tst_QWebElement::appendAndPrepend() |
|
608 { |
|
609 QString html = "<body>" |
|
610 "<p>" |
|
611 "foo" |
|
612 "</p>" |
|
613 "<p>" |
|
614 "bar" |
|
615 "</p>" |
|
616 "</body>"; |
|
617 |
|
618 m_mainFrame->setHtml(html); |
|
619 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
620 |
|
621 QCOMPARE(body.findAll("p").count(), 2); |
|
622 body.appendInside(body.findFirst("p")); |
|
623 QCOMPARE(body.findAll("p").count(), 2); |
|
624 QCOMPARE(body.findFirst("p").toPlainText(), QString("bar")); |
|
625 QCOMPARE(body.findAll("p").last().toPlainText(), QString("foo")); |
|
626 |
|
627 body.appendInside(body.findFirst("p").clone()); |
|
628 QCOMPARE(body.findAll("p").count(), 3); |
|
629 QCOMPARE(body.findFirst("p").toPlainText(), QString("bar")); |
|
630 QCOMPARE(body.findAll("p").last().toPlainText(), QString("bar")); |
|
631 |
|
632 body.prependInside(body.findAll("p").at(1).clone()); |
|
633 QCOMPARE(body.findAll("p").count(), 4); |
|
634 QCOMPARE(body.findFirst("p").toPlainText(), QString("foo")); |
|
635 |
|
636 body.findFirst("p").appendInside("<div>booyakasha</div>"); |
|
637 QCOMPARE(body.findAll("p div").count(), 1); |
|
638 QCOMPARE(body.findFirst("p div").toPlainText(), QString("booyakasha")); |
|
639 |
|
640 body.findFirst("div").prependInside("<code>yepp</code>"); |
|
641 QCOMPARE(body.findAll("p div code").count(), 1); |
|
642 QCOMPARE(body.findFirst("p div code").toPlainText(), QString("yepp")); |
|
643 } |
|
644 |
|
645 void tst_QWebElement::insertBeforeAndAfter() |
|
646 { |
|
647 QString html = "<body>" |
|
648 "<p>" |
|
649 "foo" |
|
650 "</p>" |
|
651 "<div>" |
|
652 "yeah" |
|
653 "</div>" |
|
654 "<p>" |
|
655 "bar" |
|
656 "</p>" |
|
657 "</body>"; |
|
658 |
|
659 m_mainFrame->setHtml(html); |
|
660 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
661 QWebElement div = body.findFirst("div"); |
|
662 |
|
663 QCOMPARE(body.findAll("p").count(), 2); |
|
664 QCOMPARE(body.findAll("div").count(), 1); |
|
665 |
|
666 div.prependOutside(body.findAll("p").last().clone()); |
|
667 QCOMPARE(body.findAll("p").count(), 3); |
|
668 QCOMPARE(body.findAll("p").at(0).toPlainText(), QString("foo")); |
|
669 QCOMPARE(body.findAll("p").at(1).toPlainText(), QString("bar")); |
|
670 QCOMPARE(body.findAll("p").at(2).toPlainText(), QString("bar")); |
|
671 |
|
672 div.appendOutside(body.findFirst("p").clone()); |
|
673 QCOMPARE(body.findAll("p").count(), 4); |
|
674 QCOMPARE(body.findAll("p").at(0).toPlainText(), QString("foo")); |
|
675 QCOMPARE(body.findAll("p").at(1).toPlainText(), QString("bar")); |
|
676 QCOMPARE(body.findAll("p").at(2).toPlainText(), QString("foo")); |
|
677 QCOMPARE(body.findAll("p").at(3).toPlainText(), QString("bar")); |
|
678 |
|
679 div.prependOutside("<span>hey</span>"); |
|
680 QCOMPARE(body.findAll("span").count(), 1); |
|
681 |
|
682 div.appendOutside("<span>there</span>"); |
|
683 QCOMPARE(body.findAll("span").count(), 2); |
|
684 QCOMPARE(body.findAll("span").at(0).toPlainText(), QString("hey")); |
|
685 QCOMPARE(body.findAll("span").at(1).toPlainText(), QString("there")); |
|
686 } |
|
687 |
|
688 void tst_QWebElement::remove() |
|
689 { |
|
690 QString html = "<body>" |
|
691 "<p>" |
|
692 "foo" |
|
693 "</p>" |
|
694 "<div>" |
|
695 "<p>yeah</p>" |
|
696 "</div>" |
|
697 "<p>" |
|
698 "bar" |
|
699 "</p>" |
|
700 "</body>"; |
|
701 |
|
702 m_mainFrame->setHtml(html); |
|
703 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
704 |
|
705 QCOMPARE(body.findAll("div").count(), 1); |
|
706 QCOMPARE(body.findAll("p").count(), 3); |
|
707 |
|
708 QWebElement div = body.findFirst("div"); |
|
709 div.takeFromDocument(); |
|
710 |
|
711 QCOMPARE(div.isNull(), false); |
|
712 QCOMPARE(body.findAll("div").count(), 0); |
|
713 QCOMPARE(body.findAll("p").count(), 2); |
|
714 |
|
715 body.appendInside(div); |
|
716 |
|
717 QCOMPARE(body.findAll("div").count(), 1); |
|
718 QCOMPARE(body.findAll("p").count(), 3); |
|
719 } |
|
720 |
|
721 void tst_QWebElement::clear() |
|
722 { |
|
723 QString html = "<body>" |
|
724 "<p>" |
|
725 "foo" |
|
726 "</p>" |
|
727 "<div>" |
|
728 "<p>yeah</p>" |
|
729 "</div>" |
|
730 "<p>" |
|
731 "bar" |
|
732 "</p>" |
|
733 "</body>"; |
|
734 |
|
735 m_mainFrame->setHtml(html); |
|
736 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
737 |
|
738 QCOMPARE(body.findAll("div").count(), 1); |
|
739 QCOMPARE(body.findAll("p").count(), 3); |
|
740 body.findFirst("div").removeAllChildren(); |
|
741 QCOMPARE(body.findAll("div").count(), 1); |
|
742 QCOMPARE(body.findAll("p").count(), 2); |
|
743 } |
|
744 |
|
745 |
|
746 void tst_QWebElement::replaceWith() |
|
747 { |
|
748 QString html = "<body>" |
|
749 "<p>" |
|
750 "foo" |
|
751 "</p>" |
|
752 "<div>" |
|
753 "yeah" |
|
754 "</div>" |
|
755 "<p>" |
|
756 "<span>haba</span>" |
|
757 "</p>" |
|
758 "</body>"; |
|
759 |
|
760 m_mainFrame->setHtml(html); |
|
761 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
762 |
|
763 QCOMPARE(body.findAll("div").count(), 1); |
|
764 QCOMPARE(body.findAll("span").count(), 1); |
|
765 body.findFirst("div").replace(body.findFirst("span").clone()); |
|
766 QCOMPARE(body.findAll("div").count(), 0); |
|
767 QCOMPARE(body.findAll("span").count(), 2); |
|
768 QCOMPARE(body.findAll("p").count(), 2); |
|
769 |
|
770 body.findFirst("span").replace("<p><code>wow</code></p>"); |
|
771 QCOMPARE(body.findAll("p").count(), 3); |
|
772 QCOMPARE(body.findAll("p code").count(), 1); |
|
773 QCOMPARE(body.findFirst("p code").toPlainText(), QString("wow")); |
|
774 } |
|
775 |
|
776 void tst_QWebElement::encloseContentsWith() |
|
777 { |
|
778 QString html = "<body>" |
|
779 "<div>" |
|
780 "<i>" |
|
781 "yeah" |
|
782 "</i>" |
|
783 "<i>" |
|
784 "hello" |
|
785 "</i>" |
|
786 "</div>" |
|
787 "<p>" |
|
788 "<span>foo</span>" |
|
789 "<span>bar</span>" |
|
790 "</p>" |
|
791 "<u></u>" |
|
792 "<b></b>" |
|
793 "<em>hey</em>" |
|
794 "</body>"; |
|
795 |
|
796 m_mainFrame->setHtml(html); |
|
797 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
798 |
|
799 body.findFirst("p").encloseContentsWith(body.findFirst("b")); |
|
800 QCOMPARE(body.findAll("p b span").count(), 2); |
|
801 QCOMPARE(body.findFirst("p b span").toPlainText(), QString("foo")); |
|
802 |
|
803 body.findFirst("u").encloseContentsWith("<i></i>"); |
|
804 QCOMPARE(body.findAll("u i").count(), 1); |
|
805 QCOMPARE(body.findFirst("u i").toPlainText(), QString()); |
|
806 |
|
807 body.findFirst("div").encloseContentsWith("<span></span>"); |
|
808 QCOMPARE(body.findAll("div span i").count(), 2); |
|
809 QCOMPARE(body.findFirst("div span i").toPlainText(), QString("yeah")); |
|
810 |
|
811 QString snippet = "" |
|
812 "<table>" |
|
813 "<tbody>" |
|
814 "<tr>" |
|
815 "<td></td>" |
|
816 "<td></td>" |
|
817 "</tr>" |
|
818 "<tr>" |
|
819 "<td></td>" |
|
820 "<td></td>" |
|
821 "<tr>" |
|
822 "</tbody>" |
|
823 "</table>"; |
|
824 |
|
825 body.findFirst("em").encloseContentsWith(snippet); |
|
826 QCOMPARE(body.findFirst("em table tbody tr td").toPlainText(), QString("hey")); |
|
827 } |
|
828 |
|
829 void tst_QWebElement::encloseWith() |
|
830 { |
|
831 QString html = "<body>" |
|
832 "<p>" |
|
833 "foo" |
|
834 "</p>" |
|
835 "<div>" |
|
836 "yeah" |
|
837 "</div>" |
|
838 "<p>" |
|
839 "<span>bar</span>" |
|
840 "</p>" |
|
841 "<em>hey</em>" |
|
842 "<h1>hello</h1>" |
|
843 "</body>"; |
|
844 |
|
845 m_mainFrame->setHtml(html); |
|
846 QWebElement body = m_mainFrame->documentElement().findFirst("body"); |
|
847 |
|
848 body.findFirst("p").encloseWith("<br>"); |
|
849 QCOMPARE(body.findAll("br").count(), 0); |
|
850 |
|
851 QCOMPARE(body.findAll("div").count(), 1); |
|
852 body.findFirst("div").encloseWith(body.findFirst("span").clone()); |
|
853 QCOMPARE(body.findAll("div").count(), 1); |
|
854 QCOMPARE(body.findAll("span").count(), 2); |
|
855 QCOMPARE(body.findAll("p").count(), 2); |
|
856 |
|
857 body.findFirst("div").encloseWith("<code></code>"); |
|
858 QCOMPARE(body.findAll("code").count(), 1); |
|
859 QCOMPARE(body.findAll("code div").count(), 1); |
|
860 QCOMPARE(body.findFirst("code div").toPlainText(), QString("yeah")); |
|
861 |
|
862 QString snippet = "" |
|
863 "<table>" |
|
864 "<tbody>" |
|
865 "<tr>" |
|
866 "<td></td>" |
|
867 "<td></td>" |
|
868 "</tr>" |
|
869 "<tr>" |
|
870 "<td></td>" |
|
871 "<td></td>" |
|
872 "<tr>" |
|
873 "</tbody>" |
|
874 "</table>"; |
|
875 |
|
876 body.findFirst("em").encloseWith(snippet); |
|
877 QCOMPARE(body.findFirst("table tbody tr td em").toPlainText(), QString("hey")); |
|
878 } |
|
879 |
|
880 void tst_QWebElement::nullSelect() |
|
881 { |
|
882 m_mainFrame->setHtml("<body><p>Test"); |
|
883 |
|
884 QWebElementCollection collection = m_mainFrame->findAllElements("invalid{syn(tax;;%#$f223e>>"); |
|
885 QVERIFY(collection.count() == 0); |
|
886 } |
|
887 |
|
888 void tst_QWebElement::firstChildNextSibling() |
|
889 { |
|
890 m_mainFrame->setHtml("<body><!--comment--><p>Test</p><!--another comment--><table>"); |
|
891 |
|
892 QWebElement body = m_mainFrame->findFirstElement("body"); |
|
893 QVERIFY(!body.isNull()); |
|
894 QWebElement p = body.firstChild(); |
|
895 QVERIFY(!p.isNull()); |
|
896 QCOMPARE(p.tagName(), QString("P")); |
|
897 QWebElement table = p.nextSibling(); |
|
898 QVERIFY(!table.isNull()); |
|
899 QCOMPARE(table.tagName(), QString("TABLE")); |
|
900 QVERIFY(table.nextSibling().isNull()); |
|
901 } |
|
902 |
|
903 void tst_QWebElement::lastChildPreviousSibling() |
|
904 { |
|
905 m_mainFrame->setHtml("<body><!--comment--><p>Test</p><!--another comment--><table>"); |
|
906 |
|
907 QWebElement body = m_mainFrame->findFirstElement("body"); |
|
908 QVERIFY(!body.isNull()); |
|
909 QWebElement table = body.lastChild(); |
|
910 QVERIFY(!table.isNull()); |
|
911 QCOMPARE(table.tagName(), QString("TABLE")); |
|
912 QWebElement p = table.previousSibling(); |
|
913 QVERIFY(!p.isNull()); |
|
914 QCOMPARE(p.tagName(), QString("P")); |
|
915 QVERIFY(p.previousSibling().isNull()); |
|
916 } |
|
917 |
|
918 void tst_QWebElement::hasSetFocus() |
|
919 { |
|
920 m_mainFrame->setHtml("<html><body>" \ |
|
921 "<input type='text' id='input1'/>" \ |
|
922 "<br>"\ |
|
923 "<input type='text' id='input2'/>" \ |
|
924 "</body></html>"); |
|
925 |
|
926 QWebElementCollection inputs = m_mainFrame->documentElement().findAll("input"); |
|
927 QWebElement input1 = inputs.at(0); |
|
928 input1.setFocus(); |
|
929 QVERIFY(input1.hasFocus()); |
|
930 |
|
931 QWebElement input2 = inputs.at(1); |
|
932 input2.setFocus(); |
|
933 QVERIFY(!input1.hasFocus()); |
|
934 QVERIFY(input2.hasFocus()); |
|
935 } |
|
936 |
|
937 void tst_QWebElement::render() |
|
938 { |
|
939 QString html( "<html>" |
|
940 "<head><style>" |
|
941 "body, iframe { margin: 0px; border: none; }" |
|
942 "</style></head>" |
|
943 "<body><table width='300px' height='300px' border='1'>" |
|
944 "<tr>" |
|
945 "<td>test" |
|
946 "</td>" |
|
947 "<td><img src='qrc:///image.png'>" |
|
948 "</td>" |
|
949 "</tr>" |
|
950 "</table>" |
|
951 "</body>" |
|
952 "</html>" |
|
953 ); |
|
954 |
|
955 QWebPage page; |
|
956 QSignalSpy loadSpy(&page, SIGNAL(loadFinished(bool))); |
|
957 page.mainFrame()->setHtml(html); |
|
958 |
|
959 waitForSignal(&page, SIGNAL(loadFinished(bool))); |
|
960 QCOMPARE(loadSpy.count(), 1); |
|
961 |
|
962 QSize size = page.mainFrame()->contentsSize(); |
|
963 page.setViewportSize(size); |
|
964 |
|
965 QWebElementCollection imgs = page.mainFrame()->findAllElements("img"); |
|
966 QCOMPARE(imgs.count(), 1); |
|
967 |
|
968 QImage resource(":/image.png"); |
|
969 QRect imageRect(0, 0, resource.width(), resource.height()); |
|
970 |
|
971 QImage testImage(resource.width(), resource.height(), QImage::Format_ARGB32); |
|
972 QPainter painter0(&testImage); |
|
973 painter0.fillRect(imageRect, Qt::white); |
|
974 // render() uses pixmaps internally, and pixmaps might have bit depths |
|
975 // other than 32, giving different pixel values due to rounding. |
|
976 QPixmap pix = QPixmap::fromImage(resource); |
|
977 painter0.drawPixmap(0, 0, pix); |
|
978 painter0.end(); |
|
979 |
|
980 QImage image1(resource.width(), resource.height(), QImage::Format_ARGB32); |
|
981 QPainter painter1(&image1); |
|
982 painter1.fillRect(imageRect, Qt::white); |
|
983 imgs[0].render(&painter1); |
|
984 painter1.end(); |
|
985 |
|
986 QVERIFY(image1 == testImage); |
|
987 |
|
988 // render image 2nd time to make sure that cached rendering works fine |
|
989 QImage image2(resource.width(), resource.height(), QImage::Format_ARGB32); |
|
990 QPainter painter2(&image2); |
|
991 painter2.fillRect(imageRect, Qt::white); |
|
992 imgs[0].render(&painter2); |
|
993 painter2.end(); |
|
994 |
|
995 QVERIFY(image2 == testImage); |
|
996 |
|
997 // compare table rendered through QWebElement::render to whole page table rendering |
|
998 QRect tableRect(0, 0, 300, 300); |
|
999 QWebElementCollection tables = page.mainFrame()->findAllElements("table"); |
|
1000 QCOMPARE(tables.count(), 1); |
|
1001 |
|
1002 QImage image3(300, 300, QImage::Format_ARGB32); |
|
1003 QPainter painter3(&image3); |
|
1004 painter3.fillRect(tableRect, Qt::white); |
|
1005 tables[0].render(&painter3); |
|
1006 painter3.end(); |
|
1007 |
|
1008 QImage image4(300, 300, QImage::Format_ARGB32); |
|
1009 QPainter painter4(&image4); |
|
1010 page.mainFrame()->render(&painter4, tableRect); |
|
1011 painter4.end(); |
|
1012 |
|
1013 QVERIFY(image3 == image4); |
|
1014 } |
|
1015 |
|
1016 QTEST_MAIN(tst_QWebElement) |
|
1017 #include "tst_qwebelement.moc" |
|