TestWebViewEditor.cpp [plain text]
#include "config.h"
#include "WebViewTest.h"
#include <wtf/gobject/GRefPtr.h>
class EditorTest: public WebViewTest {
public:
MAKE_GLIB_TEST_FIXTURE(EditorTest);
static const unsigned int kClipboardWaitTimeout = 50;
static const unsigned int kClipboardWaitMaxTries = 2;
EditorTest()
: m_clipboard(gtk_clipboard_get(GDK_SELECTION_CLIPBOARD))
, m_canExecuteEditingCommand(false)
, m_triesCount(0)
{
gtk_clipboard_clear(m_clipboard);
}
static void canExecuteEditingCommandReadyCallback(GObject*, GAsyncResult* result, EditorTest* test)
{
GOwnPtr<GError> error;
test->m_canExecuteEditingCommand = webkit_web_view_can_execute_editing_command_finish(test->m_webView, result, &error.outPtr());
g_assert(!error.get());
g_main_loop_quit(test->m_mainLoop);
}
bool canExecuteEditingCommand(const char* command)
{
m_canExecuteEditingCommand = false;
webkit_web_view_can_execute_editing_command(m_webView, command, reinterpret_cast<GAsyncReadyCallback>(canExecuteEditingCommandReadyCallback), this);
g_main_loop_run(m_mainLoop);
return m_canExecuteEditingCommand;
}
static gboolean waitForClipboardText(EditorTest* test)
{
test->m_triesCount++;
if (gtk_clipboard_wait_is_text_available(test->m_clipboard) || test->m_triesCount > kClipboardWaitMaxTries) {
g_main_loop_quit(test->m_mainLoop);
return FALSE;
}
return TRUE;
}
void copyClipboard()
{
webkit_web_view_execute_editing_command(m_webView, WEBKIT_EDITING_COMMAND_COPY);
m_triesCount = 0;
g_timeout_add(kClipboardWaitTimeout, reinterpret_cast<GSourceFunc>(waitForClipboardText), this);
g_main_loop_run(m_mainLoop);
}
GtkClipboard* m_clipboard;
bool m_canExecuteEditingCommand;
size_t m_triesCount;
};
static void testWebViewEditorCutCopyPasteNonEditable(EditorTest* test, gconstpointer)
{
static const char* selectedSpanHTML = "<html><body contentEditable=\"false\">"
"<span id=\"mainspan\">All work and no play <span id=\"subspan\">make Jack a dull</span> boy.</span>"
"<script>document.getSelection().collapse();\n"
"document.getSelection().selectAllChildren(document.getElementById('subspan'));\n"
"</script></body></html>";
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_CUT));
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_COPY));
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_PASTE));
test->loadHtml(selectedSpanHTML, 0);
test->waitUntilLoadFinished();
g_assert(test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_COPY));
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_CUT));
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_PASTE));
test->copyClipboard();
GOwnPtr<char> clipboardText(gtk_clipboard_wait_for_text(test->m_clipboard));
g_assert_cmpstr(clipboardText.get(), ==, "make Jack a dull");
}
static void testWebViewEditorCutCopyPasteEditable(EditorTest* test, gconstpointer)
{
static const char* selectedSpanHTML = "<html><body contentEditable=\"true\">"
"<span id=\"mainspan\">All work and no play <span>make Jack a dull</span> boy.</span>"
"<script>document.getSelection().collapse();\n"
"document.getSelection().selectAllChildren(document.getElementById('mainspan'));\n"
"</script></body></html>";
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_CUT));
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_COPY));
g_assert(!test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_PASTE));
test->loadHtml(selectedSpanHTML, 0);
test->waitUntilLoadFinished();
g_assert(test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_CUT));
g_assert(test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_COPY));
g_assert(test->canExecuteEditingCommand(WEBKIT_EDITING_COMMAND_PASTE));
test->copyClipboard();
GOwnPtr<char> clipboardText(gtk_clipboard_wait_for_text(test->m_clipboard));
g_assert_cmpstr(clipboardText.get(), ==, "All work and no play make Jack a dull boy.");
}
void beforeAll()
{
EditorTest::add("WebKitWebView", "cut-copy-paste/non-editable", testWebViewEditorCutCopyPasteNonEditable);
EditorTest::add("WebKitWebView", "cut-copy-paste/editable", testWebViewEditorCutCopyPasteEditable);
}
void afterAll()
{
}