blob: 8adc560d21d2aa867d865100d34319f5ce32b2f6 [file] [log] [blame]
/*
* Copyright (C) 2012, 2017 Igalia S.L.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2,1 of the License, or (at your option) any later version.
*
* This library 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#include "config.h"
#include "LoadTrackingTest.h"
#include <wtf/glib/GRefPtr.h>
static const char* testString = "<html><body>first testing second testing secondHalf</body></html>";
class FindControllerTest: public WebViewTest {
public:
MAKE_GLIB_TEST_FIXTURE(FindControllerTest);
FindControllerTest()
: m_findController(webkit_web_view_get_find_controller(m_webView))
, m_runFindUntilCompletion(false)
{
assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_findController.get()));
}
~FindControllerTest()
{
if (m_findController)
g_signal_handlers_disconnect_matched(m_findController.get(), G_SIGNAL_MATCH_DATA, 0, 0, 0, 0, this);
}
void find(const char* searchText, guint32 findOptions, guint maxMatchCount)
{
g_signal_connect(m_findController.get(), "found-text", G_CALLBACK(foundTextCallback), this);
g_signal_connect(m_findController.get(), "failed-to-find-text", G_CALLBACK(failedToFindTextCallback), this);
webkit_find_controller_search(m_findController.get(), searchText, findOptions, maxMatchCount);
}
void count(const char* searchText, guint32 findOptions, guint maxMatchCount)
{
g_signal_connect(m_findController.get(), "counted-matches", G_CALLBACK(countedMatchesCallback), this);
webkit_find_controller_count_matches(m_findController.get(), searchText, findOptions, maxMatchCount);
}
void waitUntilFindFinished()
{
m_runFindUntilCompletion = true;
g_main_loop_run(m_mainLoop);
}
GRefPtr<WebKitFindController> m_findController;
bool m_textFound;
unsigned m_matchCount;
private:
bool m_runFindUntilCompletion;
static void foundTextCallback(WebKitFindController*, guint matchCount, FindControllerTest* test)
{
test->m_textFound = true;
test->m_matchCount = matchCount;
if (test->m_runFindUntilCompletion)
g_main_loop_quit(test->m_mainLoop);
}
static void failedToFindTextCallback(WebKitFindController*, FindControllerTest* test)
{
test->m_textFound = false;
if (test->m_runFindUntilCompletion)
g_main_loop_quit(test->m_mainLoop);
}
static void countedMatchesCallback(WebKitFindController*, guint matchCount, FindControllerTest* test)
{
test->m_matchCount = matchCount;
if (test->m_runFindUntilCompletion)
g_main_loop_quit(test->m_mainLoop);
}
};
static void testFindControllerTextFound(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("testing", WEBKIT_FIND_OPTIONS_NONE, 1);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
}
static void testFindControllerTextNotFound(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("notFound", WEBKIT_FIND_OPTIONS_NONE, 1);
test->waitUntilFindFinished();
g_assert_false(test->m_textFound);
}
static void testFindControllerMatchCount(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("testing", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_cmpuint(test->m_matchCount, ==, 2);
g_assert_true(test->m_textFound);
}
static void testFindControllerMaxMatchCount(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("testing", WEBKIT_FIND_OPTIONS_NONE, 1);
test->waitUntilFindFinished();
g_assert_cmpuint(test->m_matchCount, ==, G_MAXUINT);
g_assert_true(test->m_textFound);
}
static void testFindControllerNext(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("testing", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
g_assert_cmpuint(test->m_matchCount, ==, 2);
webkit_find_controller_search_next(test->m_findController.get());
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
g_assert_cmpuint(test->m_matchCount, ==, 1);
g_assert_false(webkit_find_controller_get_options(test->m_findController.get()) & WEBKIT_FIND_OPTIONS_BACKWARDS);
webkit_find_controller_search_next(test->m_findController.get());
test->waitUntilFindFinished();
g_assert_false(test->m_textFound);
g_assert_cmpuint(test->m_matchCount, ==, 1);
g_assert_false(webkit_find_controller_get_options(test->m_findController.get()) & WEBKIT_FIND_OPTIONS_BACKWARDS);
}
static void testFindControllerPrevious(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("testing", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_cmpuint(test->m_matchCount, ==, 2);
g_assert_true(test->m_textFound);
webkit_find_controller_search_next(test->m_findController.get());
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
g_assert_cmpuint(test->m_matchCount, ==, 1);
g_assert_false(webkit_find_controller_get_options(test->m_findController.get()) & WEBKIT_FIND_OPTIONS_BACKWARDS);
webkit_find_controller_search_previous(test->m_findController.get());
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
g_assert_cmpuint(test->m_matchCount, ==, 1);
g_assert_true(webkit_find_controller_get_options(test->m_findController.get()) & WEBKIT_FIND_OPTIONS_BACKWARDS);
}
static void testFindControllerCountedMatches(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->count("testing", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_cmpuint(test->m_matchCount, ==, 2);
test->count("first", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_cmpuint(test->m_matchCount, ==, 1);
test->count("notFound", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_cmpuint(test->m_matchCount, ==, 0);
}
static void testFindControllerOptions(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->find("Testing", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_false(test->m_textFound);
test->find("Testing", WEBKIT_FIND_OPTIONS_CASE_INSENSITIVE, 2);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
test->find("esting", WEBKIT_FIND_OPTIONS_NONE, 2);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
test->find("esting", WEBKIT_FIND_OPTIONS_AT_WORD_STARTS, 2);
test->waitUntilFindFinished();
g_assert_false(test->m_textFound);
test->find("Half", WEBKIT_FIND_OPTIONS_AT_WORD_STARTS, 2);
test->waitUntilFindFinished();
g_assert_false(test->m_textFound);
test->find("Half", WEBKIT_FIND_OPTIONS_AT_WORD_STARTS | WEBKIT_FIND_OPTIONS_TREAT_MEDIAL_CAPITAL_AS_WORD_START, 2);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
test->find("testing", WEBKIT_FIND_OPTIONS_WRAP_AROUND, 3);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
webkit_find_controller_search_next(test->m_findController.get());
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
webkit_find_controller_search_next(test->m_findController.get());
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
}
// TODO: Rewrite this test to avoid using snapshots so it can be re-enabled
// for WPE or, alternatively, make snapshots work for WPE as well.
#if PLATFORM(GTK)
static void testFindControllerHide(FindControllerTest* test, gconstpointer)
{
test->loadHtml(testString, 0);
test->waitUntilLoadFinished();
test->showInWindow();
cairo_surface_t* originalSurface = cairo_surface_reference(
test->getSnapshotAndWaitUntilReady(WEBKIT_SNAPSHOT_REGION_FULL_DOCUMENT, WEBKIT_SNAPSHOT_OPTIONS_NONE));
g_assert_nonnull(originalSurface);
test->find("testing", WEBKIT_FIND_OPTIONS_NONE, 1);
test->waitUntilFindFinished();
g_assert_true(test->m_textFound);
cairo_surface_t* highlightSurface = cairo_surface_reference(
test->getSnapshotAndWaitUntilReady(WEBKIT_SNAPSHOT_REGION_FULL_DOCUMENT, WEBKIT_SNAPSHOT_OPTIONS_NONE));
g_assert_nonnull(highlightSurface);
g_assert_false(Test::cairoSurfacesEqual(originalSurface, highlightSurface));
WebKitFindController* findController = webkit_web_view_get_find_controller(test->m_webView);
webkit_find_controller_search_finish(findController);
webkit_web_view_execute_editing_command(test->m_webView, "Unselect");
cairo_surface_t* unhighlightSurface = cairo_surface_reference(
test->getSnapshotAndWaitUntilReady(WEBKIT_SNAPSHOT_REGION_FULL_DOCUMENT, WEBKIT_SNAPSHOT_OPTIONS_NONE));
g_assert_nonnull(unhighlightSurface);
g_assert_true(Test::cairoSurfacesEqual(originalSurface, unhighlightSurface));
cairo_surface_destroy(originalSurface);
cairo_surface_destroy(highlightSurface);
cairo_surface_destroy(unhighlightSurface);
}
#endif
static void testFindControllerInstance(FindControllerTest* test, gconstpointer)
{
WebKitFindController* findController1 = webkit_web_view_get_find_controller(test->m_webView);
WebKitFindController* findController2 = webkit_web_view_get_find_controller(test->m_webView);
g_assert_true(findController1 == findController2);
}
static void testFindControllerGetters(FindControllerTest* test, gconstpointer)
{
const char* searchText = "testing";
guint maxMatchCount = 1;
guint32 findOptions = WEBKIT_FIND_OPTIONS_WRAP_AROUND | WEBKIT_FIND_OPTIONS_AT_WORD_STARTS;
WebKitFindController* findController = webkit_web_view_get_find_controller(test->m_webView);
webkit_find_controller_search(findController, searchText, findOptions, maxMatchCount);
g_assert_true(webkit_find_controller_get_web_view(findController) == test->m_webView);
g_assert_cmpstr(webkit_find_controller_get_search_text(findController), ==, searchText);
g_assert_cmpuint(webkit_find_controller_get_max_match_count(findController), ==, maxMatchCount);
g_assert_cmpuint(webkit_find_controller_get_options(findController), ==, findOptions);
}
void beforeAll()
{
FindControllerTest::add("WebKitFindController", "getters", testFindControllerGetters);
FindControllerTest::add("WebKitFindController", "instance", testFindControllerInstance);
FindControllerTest::add("WebKitFindController", "text-found", testFindControllerTextFound);
FindControllerTest::add("WebKitFindController", "text-not-found", testFindControllerTextNotFound);
FindControllerTest::add("WebKitFindController", "match-count", testFindControllerMatchCount);
FindControllerTest::add("WebKitFindController", "max-match-count", testFindControllerMaxMatchCount);
FindControllerTest::add("WebKitFindController", "next", testFindControllerNext);
FindControllerTest::add("WebKitFindController", "previous", testFindControllerPrevious);
FindControllerTest::add("WebKitFindController", "counted-matches", testFindControllerCountedMatches);
FindControllerTest::add("WebKitFindController", "options", testFindControllerOptions);
#if PLATFORM(GTK)
FindControllerTest::add("WebKitFindController", "hide", testFindControllerHide);
#endif
}
void afterAll()
{
}