diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -37,3 +37,29 @@ databasepasswordbackendtest databaseencryptedpasswordbackendtest ) + +set(falkon_autotests_SRCS + qml/qmltestitem.cpp + qml/qmltesthelper.cpp +) + +macro(falkon_qml_tests) + foreach(_testname ${ARGN}) + add_executable(${_testname} qml/${_testname}.cpp ${falkon_autotests_SRCS}) + target_link_libraries(${_testname} Qt5::Test FalkonPrivate) + add_test(NAME falkon-qml-${_testname} COMMAND ${_testname}) + ecm_mark_as_test(${_testname}) + set_tests_properties(falkon-qml-${_testname} PROPERTIES RUN_SERIAL TRUE) + endforeach(_testname) +endmacro() + +falkon_qml_tests( + qmlbookmarksapitest + qmltopsitesapitest + qmlhistoryapitest + qmlcookiesapitest + qmlclipboardapitest + qmltabsapitest + qmlwindowsapitest + qmluserscriptapitest +) diff --git a/autotests/qml/qmlbookmarksapitest.h b/autotests/qml/qmlbookmarksapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlbookmarksapitest.h @@ -0,0 +1,43 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include + +#include "bookmarkitem.h" +#include "qmltesthelper.h" + +class QmlBookmarksApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testBookmarkTreeNodeType(); + void testBookmarkTreeNode(); + + void testBookmarksCreation(); + void testBookmarksExistence(); + void testBookmarksModification(); + void testBookmarksRemoval(); +}; + +Q_DECLARE_METATYPE(BookmarkItem *) diff --git a/autotests/qml/qmlbookmarksapitest.cpp b/autotests/qml/qmlbookmarksapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlbookmarksapitest.cpp @@ -0,0 +1,162 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmlbookmarksapitest.h" +#include "autotests.h" +#include "mainapplication.h" +#include "bookmarks.h" +#include "bookmarkitem.h" +#include "qml/api/bookmarks/qmlbookmarktreenode.h" + +void QmlBookmarksApiTest::initTestCase() +{ +} + +void QmlBookmarksApiTest::cleanupTestCase() +{ +} + +void QmlBookmarksApiTest::testBookmarkTreeNodeType() +{ + auto type = BookmarkItem::Type(m_testHelper.evaluate("Falkon.Bookmarks.rootItem().type").toInt()); + QCOMPARE(mApp->bookmarks()->rootItem()->type(), type); + + type = BookmarkItem::Type(m_testHelper.evaluate("Falkon.Bookmarks.toolbarFolder().type").toInt()); + QCOMPARE(mApp->bookmarks()->toolbarFolder()->type(), type); +} + +void QmlBookmarksApiTest::testBookmarkTreeNode() +{ + QObject *bookmark = m_testHelper.evaluateQObject("Falkon.Bookmarks.toolbarFolder()"); + QVERIFY(bookmark); + auto toolbarFolder = mApp->bookmarks()->toolbarFolder(); + + QCOMPARE(toolbarFolder->title(), bookmark->property("title").toString()); + QCOMPARE(toolbarFolder->urlString(), bookmark->property("url").toString()); + QCOMPARE(toolbarFolder->description(), bookmark->property("description").toString()); + QCOMPARE(!mApp->bookmarks()->canBeModified(toolbarFolder), bookmark->property("unmodifiable").toBool()); + QObject* parent = qvariant_cast(bookmark->property("parent")); + QVERIFY(parent); + QCOMPARE(mApp->bookmarks()->rootItem()->title(), parent->property("title").toString()); +} + +void QmlBookmarksApiTest::testBookmarksCreation() +{ + auto item = new BookmarkItem(BookmarkItem::Url); + item->setTitle("Example Domain"); + item->setUrl(QUrl("https://example.com/")); + item->setDescription("Testing bookmark description"); + + QObject *qmlBookmarks = m_testHelper.evaluateQObject("Falkon.Bookmarks"); + QVERIFY(qmlBookmarks); + + QSignalSpy qmlBookmarksSpy(qmlBookmarks, SIGNAL(created(QmlBookmarkTreeNode*))); + mApp->bookmarks()->addBookmark(mApp->bookmarks()->rootItem(), item); + + QCOMPARE(qmlBookmarksSpy.count(), 1); + + QObject *created = qvariant_cast(qmlBookmarksSpy.at(0).at(0)); + QVERIFY(created); + QCOMPARE(item->title(), created->property("title").toString()); + + qRegisterMetaType(); + QSignalSpy bookmarksSpy(mApp->bookmarks(), &Bookmarks::bookmarkAdded); + + auto out = m_testHelper.evaluate("Falkon.Bookmarks.create({" + " parent: Falkon.Bookmarks.toolbarFolder()," + " title: 'Example Plugin'," + " url: 'https://another-example.com'" + "});"); + QVERIFY(out.toBool()); + + QCOMPARE(bookmarksSpy.count(), 1); + BookmarkItem* createdItem = qvariant_cast(bookmarksSpy.at(0).at(0)); + QVERIFY(createdItem); + QCOMPARE(createdItem->title(), QString("Example Plugin")); +} + +void QmlBookmarksApiTest::testBookmarksExistence() +{ + // in continuation from testBookmarksCreation + + auto result = m_testHelper.evaluate("Falkon.Bookmarks.isBookmarked('https://example.com/')").toBool(); + QVERIFY(result); + QCOMPARE(mApp->bookmarks()->isBookmarked(QUrl("https://example.com/")), result); +} + +void QmlBookmarksApiTest::testBookmarksModification() +{ + // in continuation from testBookmarksExistence + + QObject *qmlBookmarks = m_testHelper.evaluateQObject("Falkon.Bookmarks"); + QVERIFY(qmlBookmarks); + + QSignalSpy qmlBookmarksSpy(qmlBookmarks, SIGNAL(changed(QmlBookmarkTreeNode*))); + BookmarkItem* item = mApp->bookmarks()->searchBookmarks("https://example.com/").at(0); + item->setTitle("Modified Example Domain"); + mApp->bookmarks()->changeBookmark(item); + + QCOMPARE(qmlBookmarksSpy.count(), 1); + + QObject *modified = qvariant_cast(qmlBookmarksSpy.at(0).at(0)); + QVERIFY(modified); + QCOMPARE(modified->property("title").toString(), QString("Modified Example Domain")); + + qRegisterMetaType(); + QSignalSpy bookmarksSpy(mApp->bookmarks(), &Bookmarks::bookmarkChanged); + + auto out = m_testHelper.evaluate("Falkon.Bookmarks.update(Falkon.Bookmarks.get('https://another-example.com'),{" + " title: 'Modified Example Plugin'" + "})"); + QVERIFY(out.toBool()); + + QCOMPARE(bookmarksSpy.count(), 1); + BookmarkItem* modifiedItem = qvariant_cast(bookmarksSpy.at(0).at(0)); + QVERIFY(modifiedItem); + QCOMPARE(modifiedItem->title(), QString("Modified Example Plugin")); +} + +void QmlBookmarksApiTest::testBookmarksRemoval() +{ + // in continuation from testBookmarksModification + + QObject *qmlBookmarks = m_testHelper.evaluateQObject("Falkon.Bookmarks"); + QVERIFY(qmlBookmarks); + + QSignalSpy qmlBookmarksSpy(qmlBookmarks, SIGNAL(removed(QmlBookmarkTreeNode*))); + BookmarkItem* item = mApp->bookmarks()->searchBookmarks("https://example.com/").at(0); + mApp->bookmarks()->removeBookmark(item); + + QCOMPARE(qmlBookmarksSpy.count(), 1); + + QObject *removed = qvariant_cast(qmlBookmarksSpy.at(0).at(0)); + QVERIFY(removed); + QCOMPARE(removed->property("title").toString(), QString("Modified Example Domain")); + + qRegisterMetaType(); + QSignalSpy bookmarksSpy(mApp->bookmarks(), &Bookmarks::bookmarkRemoved); + + auto out = m_testHelper.evaluate("Falkon.Bookmarks.remove(Falkon.Bookmarks.get('https://another-example.com'))"); + QVERIFY(out.toBool()); + + QCOMPARE(bookmarksSpy.count(), 1); + BookmarkItem* removedItem = qvariant_cast(bookmarksSpy.at(0).at(0)); + QVERIFY(removedItem); + QCOMPARE(removedItem->title(), QString("Modified Example Plugin")); +} + +FALKONTEST_MAIN(QmlBookmarksApiTest) diff --git a/autotests/qml/qmlclipboardapitest.h b/autotests/qml/qmlclipboardapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlclipboardapitest.h @@ -0,0 +1,33 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlClipboardApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testClipboard(); +}; diff --git a/autotests/qml/qmlclipboardapitest.cpp b/autotests/qml/qmlclipboardapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlclipboardapitest.cpp @@ -0,0 +1,38 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmlclipboardapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include + +void QmlClipboardApiTest::initTestCase() +{ +} + +void QmlClipboardApiTest::cleanupTestCase() +{ +} + +void QmlClipboardApiTest::testClipboard() +{ + m_testHelper.evaluate("Falkon.Clipboard.copy('this text is copied')"); + QCOMPARE(mApp->clipboard()->text(), "this text is copied"); +} + +FALKONTEST_MAIN(QmlClipboardApiTest) diff --git a/autotests/qml/qmlcookiesapitest.h b/autotests/qml/qmlcookiesapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlcookiesapitest.h @@ -0,0 +1,34 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlCookiesApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testCookieAdditionRemoval(); + void testCookieGet(); +}; diff --git a/autotests/qml/qmlcookiesapitest.cpp b/autotests/qml/qmlcookiesapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlcookiesapitest.cpp @@ -0,0 +1,117 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmlcookiesapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include "cookiejar.h" +#include "qml/api/cookies/qmlcookie.h" +#include + +void QmlCookiesApiTest::initTestCase() +{ +} + +void QmlCookiesApiTest::cleanupTestCase() +{ +} + +void QmlCookiesApiTest::testCookieAdditionRemoval() +{ + QSignalSpy cookieAddSpy(mApp->cookieJar(), &CookieJar::cookieAdded); + m_testHelper.evaluate("Falkon.Cookies.set({" + " name: 'Example'," + " url: '.example.com'," + " expirationDate: Date.now() + 60*1000" + "})"); + QTRY_COMPARE(cookieAddSpy.count(), 1); + QNetworkCookie netCookie = qvariant_cast(cookieAddSpy.at(0).at(0)); + QCOMPARE(netCookie.name(), "Example"); + QObject *object = m_testHelper.evaluateQObject("Falkon.Cookies"); + QVERIFY(object); + QSignalSpy qmlCookieSpy(object, SIGNAL(changed(QVariantMap))); + QNetworkCookie anotherNetCookie; + anotherNetCookie.setName(QString("Hello").toLocal8Bit()); + anotherNetCookie.setDomain(".mydomain.com"); + anotherNetCookie.setExpirationDate(QDateTime::currentDateTime().addSecs(60)); + mApp->webProfile()->cookieStore()->setCookie(anotherNetCookie); + QTRY_COMPARE(qmlCookieSpy.count(), 1); + QVariantMap addedQmlCookieMap = QVariant(qmlCookieSpy.at(0).at(0)).toMap(); + QObject *addedQmlCookie = qvariant_cast(addedQmlCookieMap.value("cookie")); + bool removed = addedQmlCookieMap.value("removed").toBool(); + QCOMPARE(addedQmlCookie->property("name").toString(), "Hello"); + QCOMPARE(removed, false); + + mApp->webProfile()->cookieStore()->deleteCookie(netCookie); + QTRY_COMPARE(qmlCookieSpy.count(), 2); + QVariantMap removedQmlCookieMap = QVariant(qmlCookieSpy.at(1).at(0)).toMap(); + QObject *removedQmlCookie = qvariant_cast(removedQmlCookieMap.value("cookie")); + removed = removedQmlCookieMap.value("removed").toBool(); + QCOMPARE(removedQmlCookie->property("name").toString(), "Example"); + QCOMPARE(removed, true); + + QSignalSpy cookieRemoveSpy(mApp->cookieJar(), &CookieJar::cookieRemoved); + m_testHelper.evaluate("Falkon.Cookies.remove({" + " name: 'Hello'," + " url: '.mydomain.com'," + "})"); + QTRY_COMPARE(cookieRemoveSpy.count(), 1); + netCookie = qvariant_cast(cookieRemoveSpy.at(0).at(0)); + QCOMPARE(netCookie.name(), "Hello"); +} + +void QmlCookiesApiTest::testCookieGet() +{ + QDateTime current = QDateTime::currentDateTime(); + QSignalSpy cookieAddSpy(mApp->cookieJar(), &CookieJar::cookieAdded); + + QNetworkCookie netCookie_1; + netCookie_1.setName(QString("Apple").toLocal8Bit()); + netCookie_1.setDomain(".apple-domain.com"); + netCookie_1.setExpirationDate(current.addSecs(60)); + mApp->webProfile()->cookieStore()->setCookie(netCookie_1); + + QNetworkCookie netCookie_2; + netCookie_2.setName(QString("Mango").toLocal8Bit()); + netCookie_2.setDomain(".mango-domain.com"); + netCookie_2.setExpirationDate(current.addSecs(120)); + mApp->webProfile()->cookieStore()->setCookie(netCookie_2); + + QNetworkCookie netCookie_3; + netCookie_3.setName(QString("Mango").toLocal8Bit()); + netCookie_3.setDomain(".yet-another-mango-domain.com"); + netCookie_3.setExpirationDate(current.addSecs(180)); + mApp->webProfile()->cookieStore()->setCookie(netCookie_3); + + QTRY_COMPARE(cookieAddSpy.count(), 3); + + QObject *mangoCookie = m_testHelper.evaluateQObject("Falkon.Cookies.get({" + " name: 'Mango'," + " url: '.mango-domain.com'" + "})"); + QVERIFY(mangoCookie); + QCOMPARE(mangoCookie->property("name").toString(), "Mango"); + // FIXME: Here current.addSecs differes from expirationDate by some ms + // a solution is to convert both to string, but this is not the best solution + QCOMPARE(mangoCookie->property("expirationDate").toDateTime().toString(), current.addSecs(120).toString()); + + QList mangoCookies = m_testHelper.evaluate("Falkon.Cookies.getAll({name: 'Mango'})").toVariant().toList(); + QCOMPARE(mangoCookies.length(), 2); +} + +FALKONTEST_MAIN(QmlCookiesApiTest) diff --git a/autotests/qml/qmlhistoryapitest.h b/autotests/qml/qmlhistoryapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlhistoryapitest.h @@ -0,0 +1,36 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlHistoryApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testAddition(); + void testSearch(); + void testVisits(); + void testRemoval(); +}; diff --git a/autotests/qml/qmlhistoryapitest.cpp b/autotests/qml/qmlhistoryapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlhistoryapitest.cpp @@ -0,0 +1,89 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmlhistoryapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include "history.h" +#include "qml/api/history/qmlhistoryitem.h" +#include "qml/api/history/qmlhistory.h" + +Q_DECLARE_METATYPE(HistoryEntry) + +void QmlHistoryApiTest::initTestCase() +{ +} + +void QmlHistoryApiTest::cleanupTestCase() +{ +} + +void QmlHistoryApiTest::testAddition() +{ + qRegisterMetaType(); + QSignalSpy historySpy(mApp->history(), &History::historyEntryAdded); + m_testHelper.evaluate("Falkon.History.addUrl({" + " url: 'https://example.com'," + " title: 'Example Domain'" + "})"); + QTRY_COMPARE(historySpy.count(), 1); + HistoryEntry entry = qvariant_cast(historySpy.at(0).at(0)); + QCOMPARE(entry.title, "Example Domain"); + + auto object = m_testHelper.evaluateQObject("Falkon.History"); + QSignalSpy qmlHistorySpy(object, SIGNAL(visited(QmlHistoryItem*))); + mApp->history()->addHistoryEntry(QUrl("https://sample.com"), "Sample Domain"); + QTRY_COMPARE(qmlHistorySpy.count(), 1); + mApp->history()->clearHistory(); +} + +void QmlHistoryApiTest::testSearch() +{ + QSignalSpy historySpy(mApp->history(), &History::historyEntryAdded); + mApp->history()->addHistoryEntry(QUrl("https://example.com"), "Example Domain"); + mApp->history()->addHistoryEntry(QUrl("https://another-example.com"), "Another Example Domain"); + mApp->history()->addHistoryEntry(QUrl("https://sample.com"), "Sample Domain"); + QTRY_COMPARE(historySpy.count(), 3); + auto list = m_testHelper.evaluate("Falkon.History.search('example')").toVariant().toList(); + QCOMPARE(list.length(), 2); +} + +void QmlHistoryApiTest::testVisits() +{ + int visits = m_testHelper.evaluate("Falkon.History.getVisits('https://sample.com')").toInt(); + QCOMPARE(visits, 1); + QSignalSpy historySpy(mApp->history(), &History::historyEntryEdited); + mApp->history()->addHistoryEntry(QUrl("https://sample.com"), "Sample Domain"); + QTRY_COMPARE(historySpy.count(), 1); + visits = m_testHelper.evaluate("Falkon.History.getVisits('https://sample.com')").toInt(); + QCOMPARE(visits, 2); +} + +void QmlHistoryApiTest::testRemoval() +{ + QSignalSpy historySpy(mApp->history(), &History::historyEntryDeleted); + m_testHelper.evaluate("Falkon.History.deleteUrl('https://sample.com')"); + QTRY_COMPARE(historySpy.count(), 1); + + auto object = m_testHelper.evaluateQObject("Falkon.History"); + QSignalSpy qmlHistorySpy(object, SIGNAL(visitRemoved(QmlHistoryItem*))); + mApp->history()->deleteHistoryEntry("https://example.com", "Example Domain"); + QTRY_COMPARE(qmlHistorySpy.count(), 1); +} + +FALKONTEST_MAIN(QmlHistoryApiTest) diff --git a/autotests/qml/qmltabsapitest.h b/autotests/qml/qmltabsapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltabsapitest.h @@ -0,0 +1,34 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlTabsApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testInitWindowCount(); + void testTabsAPI(); +}; diff --git a/autotests/qml/qmltabsapitest.cpp b/autotests/qml/qmltabsapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltabsapitest.cpp @@ -0,0 +1,114 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmltabsapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include "tabwidget.h" + +void QmlTabsApiTest::initTestCase() +{ +} + +void QmlTabsApiTest::cleanupTestCase() +{ +} + +void QmlTabsApiTest::testInitWindowCount() +{ + QCOMPARE(mApp->windowCount(), 1); + QCOMPARE(mApp->getWindow()->tabCount(), 0); +} + +void QmlTabsApiTest::testTabsAPI() +{ + // Tab Insertion + QObject *qmlTabsObject = m_testHelper.evaluateQObject("Falkon.Tabs"); + QVERIFY(qmlTabsObject); + QSignalSpy qmlTabsInsertedSpy(qmlTabsObject, SIGNAL(tabInserted(QVariantMap))); + m_testHelper.evaluate("Falkon.Tabs.addTab({" + " url: 'https://example.com/'" + "})"); + QCOMPARE(qmlTabsInsertedSpy.count(), 1); + QVariantMap retMap1 = QVariant(qmlTabsInsertedSpy.at(0).at(0)).toMap(); + int index1 = retMap1.value(QSL("index"), -1).toInt(); + int windowId1 = retMap1.value(QSL("windowId"), -1).toInt(); + QCOMPARE(index1, 0); + QCOMPARE(windowId1, 0); + + QObject *qmlTabObject1 = m_testHelper.evaluateQObject("Falkon.Tabs.get({index: 0})"); + QVERIFY(qmlTabObject1); + QCOMPARE(qmlTabObject1->property("url").toString(), "https://example.com/"); + QCOMPARE(qmlTabObject1->property("index").toInt(), 0); + QCOMPARE(qmlTabObject1->property("pinned").toBool(), false); + + m_testHelper.evaluate("Falkon.Tabs.addTab({" + " url: 'https://another-example.com/'," + "})"); + QCOMPARE(qmlTabsInsertedSpy.count(), 2); + QVariantMap retMap2 = QVariant(qmlTabsInsertedSpy.at(1).at(0)).toMap(); + int index2 = retMap2.value(QSL("index"), -1).toInt(); + int windowId2 = retMap2.value(QSL("windowId"), -1).toInt(); + QCOMPARE(index2, 1); + QCOMPARE(windowId2, 0); + + bool pinnedTab = m_testHelper.evaluate("Falkon.Tabs.pinTab({index: 1})").toBool(); + QVERIFY(pinnedTab); + QObject *qmlTabObject2 = m_testHelper.evaluateQObject("Falkon.Tabs.get({index: 0})"); + QVERIFY(qmlTabObject2); + QCOMPARE(qmlTabObject2->property("url").toString(), "https://another-example.com/"); + QCOMPARE(qmlTabObject2->property("index").toInt(), 0); + QCOMPARE(qmlTabObject2->property("pinned").toBool(), true); + + bool unpinnedTab = m_testHelper.evaluate("Falkon.Tabs.unpinTab({index: 0})").toBool(); + QVERIFY(unpinnedTab); + QObject *qmlTabObject3 = m_testHelper.evaluateQObject("Falkon.Tabs.get({index: 0})"); + QVERIFY(qmlTabObject3); + QCOMPARE(qmlTabObject3->property("url").toString(), "https://another-example.com/"); + QCOMPARE(qmlTabObject3->property("index").toInt(), 0); + QCOMPARE(qmlTabObject3->property("pinned").toBool(), false); + + // Next-Previous-Current + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 0); + m_testHelper.evaluate("Falkon.Tabs.nextTab()"); + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 1); + m_testHelper.evaluate("Falkon.Tabs.nextTab()"); + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 0); + m_testHelper.evaluate("Falkon.Tabs.previousTab()"); + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 1); + m_testHelper.evaluate("Falkon.Tabs.previousTab()"); + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 0); + m_testHelper.evaluate("Falkon.Tabs.setCurrentIndex({index: 1})"); + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 1); + m_testHelper.evaluate("Falkon.Tabs.setCurrentIndex({index: 0})"); + QCOMPARE(mApp->getWindow()->tabWidget()->currentIndex(), 0); + + // Move Tab + QSignalSpy qmlTabsMovedSpy(qmlTabsObject, SIGNAL(tabMoved(QVariantMap))); + m_testHelper.evaluate("Falkon.Tabs.moveTab({from: 0, to:1, windowId: 0})"); + QCOMPARE(qmlTabsMovedSpy.count(), 1); + + // Tab Removal + QCOMPARE(mApp->getWindow()->tabCount(), 2); + QSignalSpy qmlTabsRemovedSpy(qmlTabsObject, SIGNAL(tabRemoved(QVariantMap))); + m_testHelper.evaluate("Falkon.Tabs.closeTab({index: 0})"); + QCOMPARE(qmlTabsRemovedSpy.count(), 1); + QCOMPARE(mApp->getWindow()->tabCount(), 1); +} + +FALKONTEST_MAIN(QmlTabsApiTest) diff --git a/autotests/qml/qmltesthelper.h b/autotests/qml/qmltesthelper.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltesthelper.h @@ -0,0 +1,31 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include "qmltestitem.h" +#include + +class QmlTestHelper +{ +public: + explicit QmlTestHelper(); + QJSValue evaluate(const QString &source); + QObject *evaluateQObject(const QString &source); + QQmlEngine engine; + QmlTestItem *testItem; +}; diff --git a/autotests/qml/qmltesthelper.cpp b/autotests/qml/qmltesthelper.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltesthelper.cpp @@ -0,0 +1,57 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmltesthelper.h" +#include "qml/qmlplugins.h" +#include +#include + +QmlTestHelper::QmlTestHelper() +{ + QmlPlugins::registerQmlTypes(); + qmlRegisterType("org.kde.falkon.test", 1, 0, "TestItem"); + QQmlComponent component(&engine); + component.setData("import org.kde.falkon 1.0 as Falkon\n" + "import org.kde.falkon.test 1.0 as FalkonTest\n" + "import QtQuick 2.7\n" + "FalkonTest.TestItem {" + " evalFunc: function(source) {" + " return eval(source);" + " }" + "}" + , QUrl()); + testItem = qobject_cast(component.create()); + Q_ASSERT(testItem); +} + +QJSValue QmlTestHelper::evaluate(const QString &source) +{ + auto out = testItem->evaluate(source); + if (out.isError()) { + qWarning() << "Error:" << out.toString(); + } + return out; +} + +QObject *QmlTestHelper::evaluateQObject(const QString &source) +{ + auto out = evaluate(source); + if (out.isQObject()) { + return out.toQObject(); + } + return out.toVariant().value(); +} diff --git a/autotests/qml/qmltestitem.h b/autotests/qml/qmltestitem.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltestitem.h @@ -0,0 +1,36 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include + +class QmlTestItem : public QObject +{ + Q_OBJECT + Q_PROPERTY(QJSValue evalFunc READ evalFunc WRITE setEvalFunc) + +public: + explicit QmlTestItem(QObject *parent = nullptr); + QJSValue evalFunc(); + void setEvalFunc(const QJSValue &func); + QJSValue evaluate(const QString &source); + +private: + QJSValue m_evalFunc; +}; diff --git a/autotests/qml/qmltestitem.cpp b/autotests/qml/qmltestitem.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltestitem.cpp @@ -0,0 +1,39 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmltestitem.h" + +QmlTestItem::QmlTestItem(QObject *parent) : + QObject(parent) +{ +} + +QJSValue QmlTestItem::evalFunc() +{ + return m_evalFunc; +} + +void QmlTestItem::setEvalFunc(const QJSValue &func) +{ + m_evalFunc = func; +} + +QJSValue QmlTestItem::evaluate(const QString &source) +{ + Q_ASSERT(m_evalFunc.isCallable()); + return m_evalFunc.call({source}); +} diff --git a/autotests/qml/qmltopsitesapitest.h b/autotests/qml/qmltopsitesapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltopsitesapitest.h @@ -0,0 +1,33 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlTopSitesApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testTopSites(); +}; diff --git a/autotests/qml/qmltopsitesapitest.cpp b/autotests/qml/qmltopsitesapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmltopsitesapitest.cpp @@ -0,0 +1,44 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmltopsitesapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include "pluginproxy.h" +#include "speeddial.h" + +void QmlTopSitesApiTest::initTestCase() +{ +} + +void QmlTopSitesApiTest::cleanupTestCase() +{ +} + +void QmlTopSitesApiTest::testTopSites() +{ + mApp->plugins()->speedDial()->addPage(QUrl("https://example.com"), "Example Domain"); + auto list = m_testHelper.evaluate("Falkon.TopSites.get()").toVariant().toList(); + QCOMPARE(list.length(), 1); + QObject* object = qvariant_cast(list.at(0)); + QVERIFY(object); + QCOMPARE(object->property("title").toString(), "Example Domain"); + QCOMPARE(object->property("url").toString(), "https://example.com"); +} + +FALKONTEST_MAIN(QmlTopSitesApiTest) diff --git a/autotests/qml/qmluserscriptapitest.h b/autotests/qml/qmluserscriptapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmluserscriptapitest.h @@ -0,0 +1,38 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlUserScriptApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testCount(); + void testSize(); + void testEmpty(); + void testContains(); + void testFind(); + void testInsertRemove(); +}; diff --git a/autotests/qml/qmluserscriptapitest.cpp b/autotests/qml/qmluserscriptapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmluserscriptapitest.cpp @@ -0,0 +1,98 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmluserscriptapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include +#include +#include +#include "qml/api/userscript/qmluserscript.h" +#include "qml/api/userscript/qmluserscripts.h" + +void QmlUserScriptApiTest::initTestCase() +{ +} + +void QmlUserScriptApiTest::cleanupTestCase() +{ +} + +void QmlUserScriptApiTest::testCount() +{ + int count = m_testHelper.evaluate("Falkon.UserScripts.count").toInt(); + QCOMPARE(count, mApp->webProfile()->scripts()->count()); +} + +void QmlUserScriptApiTest::testSize() +{ + int size = m_testHelper.evaluate("Falkon.UserScripts.size").toInt(); + QCOMPARE(size, mApp->webProfile()->scripts()->size()); +} + +void QmlUserScriptApiTest::testEmpty() +{ + bool empty = m_testHelper.evaluate("Falkon.UserScripts.empty").toBool(); + QCOMPARE(empty, mApp->webProfile()->scripts()->isEmpty()); +} + +void QmlUserScriptApiTest::testContains() +{ + QWebEngineScript script = mApp->webProfile()->scripts()->toList().at(0); + QObject *object = m_testHelper.evaluateQObject("Falkon.UserScripts"); + QmlUserScripts *userScripts = dynamic_cast(object); + QVERIFY(userScripts); + QmlUserScript *userScript = new QmlUserScript(); + userScript->setWebEngineScript(script); + bool contains = userScripts->contains(userScript); + QCOMPARE(contains, true); +} + +void QmlUserScriptApiTest::testFind() +{ + QWebEngineScript script = mApp->webProfile()->scripts()->toList().at(0); + QObject *object = m_testHelper.evaluateQObject("Falkon.UserScripts"); + QmlUserScripts *userScripts = dynamic_cast(object); + QVERIFY(userScripts); + QObject *scriptFound = userScripts->findScript(script.name()); + QVERIFY(scriptFound); + QCOMPARE(scriptFound->property("name").toString(), script.name()); +} + +void QmlUserScriptApiTest::testInsertRemove() +{ + int initialCount = m_testHelper.evaluate("Falkon.UserScripts.count").toInt(); + QObject *object = m_testHelper.evaluateQObject("Falkon.UserScripts"); + QmlUserScripts *userScripts = dynamic_cast(object); + QVERIFY(userScripts); + QmlUserScript *userScript = new QmlUserScript(); + userScript->setProperty("name", "Hello World"); + userScript->setProperty("sourceCode", "(function() {" + " alert('Hello World')" + "})()"); + userScripts->insert(userScript); + int finalCount = m_testHelper.evaluate("Falkon.UserScripts.count").toInt(); + QCOMPARE(finalCount, initialCount + 1); + + userScripts->remove(userScript); + + int ultimateCount = m_testHelper.evaluate("Falkon.UserScripts.count").toInt(); + QCOMPARE(ultimateCount, initialCount); +} + +FALKONTEST_MAIN(QmlUserScriptApiTest) diff --git a/autotests/qml/qmlwindowsapitest.h b/autotests/qml/qmlwindowsapitest.h new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlwindowsapitest.h @@ -0,0 +1,33 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#pragma once + +#include +#include "qmltesthelper.h" + +class QmlWindowsApiTest : public QObject +{ + Q_OBJECT + QmlTestHelper m_testHelper; + +private Q_SLOTS: + void initTestCase(); + void cleanupTestCase(); + + void testWindowsAPI(); +}; diff --git a/autotests/qml/qmlwindowsapitest.cpp b/autotests/qml/qmlwindowsapitest.cpp new file mode 100644 --- /dev/null +++ b/autotests/qml/qmlwindowsapitest.cpp @@ -0,0 +1,67 @@ +/* ============================================================ +* Falkon - Qt web browser +* Copyright (C) 2018 Anmol Gautam +* +* This program is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program. If not, see . +* ============================================================ */ +#include "qmlwindowsapitest.h" +#include "autotests.h" +#include "qmltesthelper.h" +#include "mainapplication.h" +#include "qml/api/windows/qmlwindow.h" +#include "pluginproxy.h" +#include "browserwindow.h" + +void QmlWindowsApiTest::initTestCase() +{ +} + +void QmlWindowsApiTest::cleanupTestCase() +{ +} + +void QmlWindowsApiTest::testWindowsAPI() +{ + QObject *currentWindowObject = m_testHelper.evaluateQObject("Falkon.Windows.getCurrent()"); + QVERIFY(currentWindowObject); + QCOMPARE(currentWindowObject->property("title").toString(), mApp->getWindow()->windowTitle()); + QCOMPARE(currentWindowObject->property("type").toInt(), (int)mApp->getWindow()->windowType()); + QCOMPARE(currentWindowObject->property("tabs").toList().length(), mApp->getWindow()->tabCount()); + + QObject *windowObject = m_testHelper.evaluateQObject("Falkon.Windows"); + QVERIFY(windowObject); + QSignalSpy qmlWindowCreatedSignal(windowObject, SIGNAL(created(QmlWindow*))); + qRegisterMetaType(); + QSignalSpy windowCreatedSingal(mApp->plugins(), SIGNAL(mainWindowCreated(BrowserWindow*))); + QObject *newQmlWindow = m_testHelper.evaluateQObject("Falkon.Windows.create({})"); + QVERIFY(newQmlWindow); + QCOMPARE(mApp->windowCount(), 2); + // FIXME: signal is emitted 2 times here - + // 1st for the initial window, 2nd for the created window + QTRY_COMPARE(qmlWindowCreatedSignal.count(), 2); + QTRY_COMPARE(windowCreatedSingal.count(), 2); + QObject *newQmlSignalWindow = qvariant_cast(qmlWindowCreatedSignal.at(1).at(0)); + QVERIFY(newQmlSignalWindow); + QCOMPARE(newQmlWindow->property("id").toInt(), newQmlSignalWindow->property("id").toInt()); + + int qmlWindowCount = m_testHelper.evaluate("Falkon.Windows.getAll().length").toInt(); + QCOMPARE(qmlWindowCount, mApp->windowCount()); + + QSignalSpy qmlWindowRemovedSignal(windowObject, SIGNAL(removed(QmlWindow*))); + int newQmlWindowId = newQmlSignalWindow->property("id").toInt(); + m_testHelper.evaluate(QString("Falkon.Windows.remove(%1)").arg(newQmlWindowId)); + QTRY_COMPARE(qmlWindowRemovedSignal.count(), 1); +} + +FALKONTEST_MAIN(QmlWindowsApiTest) diff --git a/src/lib/adblock/metadata.desktop b/src/lib/adblock/metadata.desktop --- a/src/lib/adblock/metadata.desktop +++ b/src/lib/adblock/metadata.desktop @@ -38,6 +38,7 @@ Comment[nn]=Blokkerer uønskt vevinnhald Comment[pl]=Blokuje niechciane treści z sieci Comment[pt]=Bloqueia o conteúdo Web indesejado +Comment[pt_BR]=Bloqueie conteúdos web indesejados Comment[sv]=Blockerar oönskat webbinnehåll Comment[uk]=Блокує небажані інтернет-дані Comment[x-test]=xxBlocks unwanted web contentxx diff --git a/src/lib/data/breeze-fallback/index.theme b/src/lib/data/breeze-fallback/index.theme --- a/src/lib/data/breeze-fallback/index.theme +++ b/src/lib/data/breeze-fallback/index.theme @@ -43,6 +43,7 @@ Comment[nn]=Breeze-laget Comment[pl]=Zespół Bryzy Comment[pt]=Equipa do Brisa +Comment[pt_BR]=Equipe Breeze Comment[sv]=Breeze-gruppen Comment[uk]=Команда Breeze Comment[x-test]=xxBreeze Teamxx diff --git a/src/plugins/AutoScroll/metadata.desktop b/src/plugins/AutoScroll/metadata.desktop --- a/src/plugins/AutoScroll/metadata.desktop +++ b/src/plugins/AutoScroll/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Autorulling Name[pl]=Samoprzewijanie Name[pt]=Deslocamento Automático +Name[pt_BR]=AutoScroll Name[sv]=Rulla automatiskt Name[uk]=Автогортання Name[x-test]=xxAutoScrollxx @@ -36,6 +37,7 @@ Comment[nn]=Gjev støtte for autorulling med midtknappen på musa Comment[pl]=Zapewnia obsługę samoprzewijania na środkowy przycisk myszy Comment[pt]=Oferece o suporte para o deslocamento automático com o botão do meio do rato +Comment[pt_BR]=Fornece suporte para rolagem automática com o botão do meio do mouse Comment[sv]=Tillhandahåller stöd för automatisk rullning med musens mittenknapp Comment[uk]=Забезпечує підтримку автогортання середньою кнопкою миші Comment[x-test]=xxProvides support for autoscroll with middle mouse buttonxx diff --git a/src/plugins/GnomeKeyringPasswords/metadata.desktop b/src/plugins/GnomeKeyringPasswords/metadata.desktop --- a/src/plugins/GnomeKeyringPasswords/metadata.desktop +++ b/src/plugins/GnomeKeyringPasswords/metadata.desktop @@ -15,6 +15,7 @@ Name[nn]=Passord for Gnome-nøkkelring Name[pl]=Hasła pęku kluczy Gnome Name[pt]=Senhas no Porta-Chaves do Gnome +Name[pt_BR]=Senhas do chaveiro do Gnome Name[sv]=Gnome-nyckelring lösenord Name[uk]=Паролі сховища ключів Gnome Name[x-test]=xxGnome Keyring Passwordsxx @@ -35,6 +36,7 @@ Comment[nn]=Gjev støtte for lagring av passord i Gnome-nøkkelringen Comment[pl]=Zapewnia obsługę przechowywania haseł w pęku kluczy gnome Comment[pt]=Oferece o suporte para gravar as senhas no 'gnome-keyring' +Comment[pt_BR]=Fornece suporte para armazenar senhas no gnome-keyring Comment[sv]=Tillhandahåller stöd för att lagra lösenord i Gnome-nyckelring Comment[uk]=Забезпечує підтримку зберігання паролів у gnome-keyring Comment[x-test]=xxProvides support for storing passwords in gnome-keyringxx diff --git a/src/plugins/GreaseMonkey/metadata.desktop b/src/plugins/GreaseMonkey/metadata.desktop --- a/src/plugins/GreaseMonkey/metadata.desktop +++ b/src/plugins/GreaseMonkey/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=GreaseMonkey Name[pl]=GreaseMonkey Name[pt]=GreaseMonkey +Name[pt_BR]=GreaseMonkey Name[sv]=GreaseMonkey Name[uk]=GreaseMonkey Name[x-test]=xxGreaseMonkeyxx @@ -36,6 +37,7 @@ Comment[nn]=Gjev støtte for brukarskript Comment[pl]=Zapewnia obsługę dla skryptów użytkownika Comment[pt]=Oferece o suporte para programas do utilizador +Comment[pt_BR]=Fornece suporte para scripts do usuário Comment[sv]=Tillhandahåller stöd för användarskript Comment[uk]=Забезпечує підтримку скриптів користувача Comment[x-test]=xxProvides support for userscriptsxx diff --git a/src/plugins/MouseGestures/metadata.desktop b/src/plugins/MouseGestures/metadata.desktop --- a/src/plugins/MouseGestures/metadata.desktop +++ b/src/plugins/MouseGestures/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Muserørsler Name[pl]=Gesty myszy Name[pt]=Gestos do Rato +Name[pt_BR]=Gestos do mouse Name[sv]=Musgester Name[uk]=Керування мишею Name[x-test]=xxMouse Gesturesxx @@ -37,6 +38,7 @@ Comment[nn]=Gjev støtte for muserørsler for nettsidenavigering Comment[pl]=Zapewnia obsługę poruszania się po stronach przy użyciu gestów myszy Comment[pt]=Oferece o suporte para navegar nas páginas Web com gestos do rato +Comment[pt_BR]=Fornece suporte para navegação em sites usando gestos do mouse Comment[sv]=Tillhandahåller stöd för att navigera på webbsidor med musgester Comment[uk]=Забезпечує підтримку навігації сторінками за допомогою жестів вказівником миші Comment[x-test]=xxProvides support for navigating in webpages by mouse gesturesxx diff --git a/src/plugins/PIM/metadata.desktop b/src/plugins/PIM/metadata.desktop --- a/src/plugins/PIM/metadata.desktop +++ b/src/plugins/PIM/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=PIM Name[pl]=ZIO Name[pt]=PIM +Name[pt_BR]=PIM Name[sv]=Personlig information Name[uk]=Керування інформацією Name[x-test]=xxPIMxx @@ -36,6 +37,7 @@ Comment[nn]=Gjer det mogleg for Falkon å lagra nokre persondata Comment[pl]=Dodaje możliwość przechowywania pewnych danych osobistych Comment[pt]=Adiciona ao Falkon a capacidade de guardar alguns dados pessoais +Comment[pt_BR]=Adiciona a habilitade ao Falkon para armazenar alguns dados pessoais Comment[sv]=Lägger till möjlighet för Falkon att lagra viss personlig information Comment[uk]=Додає у Falkon можливість зберігати особисті дані Comment[x-test]=xxAdds ability for Falkon to store some personal dataxx diff --git a/src/plugins/StatusBarIcons/metadata.desktop b/src/plugins/StatusBarIcons/metadata.desktop --- a/src/plugins/StatusBarIcons/metadata.desktop +++ b/src/plugins/StatusBarIcons/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Statuslinje-ikon Name[pl]=Ikony paska stanu Name[pt]=Ícones da Barra de Estado +Name[pt_BR]=Ícones da barra de status Name[sv]=Ikoner i statusraden Name[uk]=Піктограми смужки стану Name[x-test]=xxStatusBar Iconsxx @@ -36,6 +37,7 @@ Comment[nn]=Leggjer til fleire ikon og sideforstørring via statuslinja Comment[pl]=Dodaje dodatkowe ikony i element do powiększania na pasku stanu Comment[pt]=Adiciona ícones extra e um item de ampliação à barra de estado +Comment[pt_BR]=Adiciona ícones adicionais e widget de zoom na barra de status Comment[sv]=Lägger till ytterligare ikoner och en zoomkomponent i statusraden Comment[uk]=Додає піктограми і віджет масштабування на смужку стану Comment[x-test]=xxAdds additional icons and zoom widget to statusbarxx diff --git a/src/plugins/TabManager/metadata.desktop b/src/plugins/TabManager/metadata.desktop --- a/src/plugins/TabManager/metadata.desktop +++ b/src/plugins/TabManager/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Fanehandsamar Name[pl]=Zarządzanie kartami Name[pt]=Gestor de Páginas +Name[pt_BR]=Gerenciador de abas Name[sv]=Flikhanterare Name[uk]=Керування вкладками Name[x-test]=xxTab Managerxx @@ -37,6 +38,7 @@ Comment[nn]=Gjer det mogleg å handtera faner og vindauge Comment[pl]=Dodaje możliwość zarządzania kartami i oknami Comment[pt]=Adiciona a capacidade para gerir páginas e janelas +Comment[pt_BR]=Adiciona a habilidade de gerenciar abas e janelas Comment[sv]=Lägger till möjlighet att hantera flikar och fönster Comment[uk]=Додає можливість керування вкладками і вікнами Comment[x-test]=xxAdds ability to managing tabs and windowsxx diff --git a/src/plugins/TestPlugin/metadata.desktop b/src/plugins/TestPlugin/metadata.desktop --- a/src/plugins/TestPlugin/metadata.desktop +++ b/src/plugins/TestPlugin/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Eksempel-tillegg Name[pl]=Przykładowa wtyczka Name[pt]='Plugin' de Exemplo +Name[pt_BR]=Plugin de exemplo Name[sv]=Exempelinsticksprogram Name[uk]=Приклад додатка Name[x-test]=xxExample Pluginxx @@ -37,6 +38,7 @@ Comment[nn]=Veldig enkelt og lite eksempel-tillegg Comment[pl]=Bardzo prosty minimalny przykład wtyczki Comment[pt]='Plugin' de exemplo muito simples e minimalista +Comment[pt_BR]=Um exemplo de plugin mínimo e simples Comment[sv]=Mycket enkelt minimalt exempel på ett insticksprogram Comment[uk]=Дуже простий мінімальний приклад додатка Comment[x-test]=xxVery simple minimal plugin examplexx diff --git a/src/plugins/VerticalTabs/metadata.desktop b/src/plugins/VerticalTabs/metadata.desktop --- a/src/plugins/VerticalTabs/metadata.desktop +++ b/src/plugins/VerticalTabs/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Loddrette faner Name[pl]=Pionowe karty Name[pt]=Páginas Verticais +Name[pt_BR]=Abas verticais Name[sv]=Vertikala flikar Name[uk]=Вертикальні вкладки Name[x-test]=xxVertical Tabsxx @@ -36,6 +37,7 @@ Comment[nn]=Gjer det mogleg å visa faner i sidestolpen Comment[pl]=Dodaje możliwość pokazywania kart na pasku bocznym Comment[pt]=Adiciona a capacidade de mostrar as páginas na barra lateral +Comment[pt_BR]=Adiciona a habilidade de mostrar abas na barra lateral Comment[sv]=Lägger till möjlighet att visa flikar i sidorader Comment[uk]=Додає можливість показу вкладок на бічній панелі Comment[x-test]=xxAdds ability to show tabs in sidebarxx diff --git a/src/scripts/hellopython/metadata.desktop b/src/scripts/hellopython/metadata.desktop --- a/src/scripts/hellopython/metadata.desktop +++ b/src/scripts/hellopython/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Hei-Python Name[pl]=Witaj Python Name[pt]=Olá em Python +Name[pt_BR]=Olá Python Name[sv]=Hej Python Name[uk]=Привіт, Python Name[x-test]=xxHello Pythonxx @@ -37,6 +38,7 @@ Comment[nn]=Eksempel på Python-tillegg Comment[pl]=Przykładowe rozszerzenie Python Comment[pt]=Extensão de exemplo em Python +Comment[pt_BR]=Exemplo de extensão python Comment[sv]=Exempel på Python-utökning Comment[uk]=Приклад розширення мовою Python Comment[x-test]=xxExample Python extensionxx diff --git a/themes/chrome/metadata.desktop b/themes/chrome/metadata.desktop --- a/themes/chrome/metadata.desktop +++ b/themes/chrome/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Chrome Name[pl]=Chrome Name[pt]=Chrome +Name[pt_BR]=Chrome Name[sv]=Chrome Name[uk]=Хромування Name[x-test]=xxChromexx @@ -37,6 +38,7 @@ Comment[nn]=Chrome-liknande tema for Falkon, basert på Firefox Chromifox-temaet Comment[pl]=Wygląd przypominający Chrome dla Falkona oparty na wyglądzie Firefox Chromifox Comment[pt]=Tema semelhante ao Chrome para o Falkon, baseado no tema Chromifox do Firefox +Comment[pt_BR]=Tema parecido com o Chrome para o Falkon, baseado no tema Chromifox do Firefox Comment[sv]=Chrome-liknande tema för Falkon baserat på Firefox Chromifox-tema Comment[uk]=Chrome-подібна тема для Falkon, заснована на темі Chromifox для Firefox Comment[x-test]=xxChrome like theme for Falkon based on Firefox Chromifox themexx diff --git a/themes/linux/metadata.desktop b/themes/linux/metadata.desktop --- a/themes/linux/metadata.desktop +++ b/themes/linux/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Linux Name[pl]=Linux Name[pt]=Linux +Name[pt_BR]=Linux Name[sv]=Linux Name[uk]=Linux Name[x-test]=xxLinuxxx @@ -36,6 +37,7 @@ Comment[nn]=Standardtema for Linux, som brukar systemutsjånad på skjermelement og nokre ikon frå skrivebordsikontemaet Comment[pl]=Domyślny prosty wygląd dla Linuksa używający natywnego wyglądu elementów interfejsu i podstawowych ikon z zestawu ikon dla pulpitu Comment[pt]=Tema predefinido simples para o Linux, usando o estilo gráfico nativo e alguns ícones básicos do conjunto de ícones do ambiente de trabalho +Comment[pt_BR]=Tema simples padrão para o Linux usando estilo de widgets nativos e alguns ícones básicos do conjunto de ícones da área de trabalho Comment[sv]=Enkelt standardtema för Linux som använder inbyggd komponentstil och några grundläggande ikoner från skrivbordets ikonuppsättning Comment[uk]=Типова проста тема для Linux із використанням природного стилю віджетів і декількох базових піктограм із набору піктограм стільниці Comment[x-test]=xxDefault simple theme for Linux using native widget style and some basic icons from desktop icon setxx diff --git a/themes/mac/metadata.desktop b/themes/mac/metadata.desktop --- a/themes/mac/metadata.desktop +++ b/themes/mac/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Mac Name[pl]=Mac Name[pt]=Mac +Name[pt_BR]=Mac Name[sv]=Mac Name[uk]=Mac Name[x-test]=xxMacxx @@ -37,6 +38,7 @@ Comment[nn]=Mac-liknande tema for Falkon, basert på Firefox Mac OS X-temaet Comment[pl]=Wygląd przypominający Maka dla Falkona oparty na wyglądzie Firefox Mac OS X Comment[pt]=Tema semelhante ao Mac para o Falkon, baseado no tema Mac OS X do Firefox +Comment[pt_BR]=Tema estilo Mac para o Falkon baseado no tema Mac OS X do Firefox Comment[sv]=Mac-liknande tema för Falkon baserat på Firefox Mac OS X-tema Comment[uk]=Mac-подібна тема для Falkon, заснована на темі Mac OS X для Firefox Comment[x-test]=xxMac like theme for Falkon based on Firefox Mac OS X themexx diff --git a/themes/windows/metadata.desktop b/themes/windows/metadata.desktop --- a/themes/windows/metadata.desktop +++ b/themes/windows/metadata.desktop @@ -16,6 +16,7 @@ Name[nn]=Windows Name[pl]=Windows Name[pt]=Windows +Name[pt_BR]=Windows Name[sv]=Windows Name[uk]=Windows Name[x-test]=xxWindowsxx @@ -37,6 +38,7 @@ Comment[nn]=Windows-liknande tema, basert på Material-stilen Comment[pl]=Wygląd przypominający Windowsa dla Falkona oparty na wyglądzie Material Comment[pt]=Tema semelhante ao Windows, baseado no 'material design' +Comment[pt_BR]=Tema estilo Windows baseado no Material design Comment[sv]=Windows-liknande tema baserat på Material design Comment[uk]=Windows-подібна тема, заснована на дизайні Material Comment[x-test]=xxWindows like theme based on Material designxx