mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-12 04:45:45 +00:00
Bug 1019441 - Part 2: Add marionette test cases for selection carets. r=roc, r=mdas
Add marionette test cases for selection carets feature in bug 987718. Test cases target <input>, <textarea>, editable and non-editable elements. Run tests on browser manually: ./mach marionette-test layout/base/tests/marionette/test_seletioncarets.py Run tests on b2g emulator manually: ./mach marionette-webapi layout/base/tests/marionette/test_seletioncarets.py
This commit is contained in:
parent
74116ed31d
commit
dd76b7d29d
@ -13,3 +13,4 @@ skip = false
|
||||
|
||||
[test_touchcaret.py]
|
||||
b2g = false ; Bug 1020261
|
||||
[test_selectioncarets.py]
|
||||
|
244
layout/base/tests/marionette/test_selectioncarets.py
Normal file
244
layout/base/tests/marionette/test_selectioncarets.py
Normal file
@ -0,0 +1,244 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
from by import By
|
||||
from marionette import Actions
|
||||
from marionette_test import MarionetteTestCase
|
||||
from selection import SelectionManager
|
||||
|
||||
|
||||
class SelectionCaretsTest(MarionetteTestCase):
|
||||
_long_press_time = 1 # 1 second
|
||||
_input_selector = (By.ID, 'input')
|
||||
_textarea_selector = (By.ID, 'textarea')
|
||||
_textarea_rtl_selector = (By.ID, 'textarea_rtl')
|
||||
_contenteditable_selector = (By.ID, 'contenteditable')
|
||||
_content_selector = (By.ID, 'content')
|
||||
|
||||
def setUp(self):
|
||||
# Code to execute before a tests are run.
|
||||
MarionetteTestCase.setUp(self)
|
||||
self.actions = Actions(self.marionette)
|
||||
|
||||
def openTestHtml(self, enabled=True):
|
||||
'''Open html for testing and locate elements, and enable/disable touch
|
||||
caret.'''
|
||||
self.marionette.execute_script(
|
||||
'SpecialPowers.setBoolPref("selectioncaret.enabled", %s);' %
|
||||
('true' if enabled else 'false'))
|
||||
|
||||
test_html = self.marionette.absolute_url('test_selectioncarets.html')
|
||||
self.marionette.navigate(test_html)
|
||||
|
||||
self._input = self.marionette.find_element(*self._input_selector)
|
||||
self._textarea = self.marionette.find_element(*self._textarea_selector)
|
||||
self._textarea_rtl = self.marionette.find_element(*self._textarea_rtl_selector)
|
||||
self._contenteditable = self.marionette.find_element(*self._contenteditable_selector)
|
||||
self._content = self.marionette.find_element(*self._content_selector)
|
||||
|
||||
def _long_press_to_select_first_word(self, el, sel):
|
||||
# Move caret inside the first word.
|
||||
el.tap()
|
||||
sel.move_caret_to_front()
|
||||
sel.move_caret_by_offset(1)
|
||||
x, y = sel.caret_location()
|
||||
|
||||
# Long press the caret position. Selection carets should appear, and
|
||||
# select the first word.
|
||||
self.actions.long_press(el, self._long_press_time, x, y).perform()
|
||||
|
||||
def _test_long_press_to_select_a_word(self, el, assertFunc):
|
||||
sel = SelectionManager(el)
|
||||
original_content = sel.content
|
||||
words = original_content.split()
|
||||
self.assertTrue(len(words) >= 2, 'Expect at least two words in the content.')
|
||||
|
||||
# Goal: Replace the first word with '!'
|
||||
content_to_add = '!'
|
||||
target_content = original_content.replace(words[0], content_to_add, 1)
|
||||
|
||||
self._long_press_to_select_first_word(el, sel)
|
||||
|
||||
# Replace the first word.
|
||||
el.send_keys(content_to_add)
|
||||
assertFunc(target_content, sel.content)
|
||||
|
||||
def _test_move_selection_carets(self, el, assertFunc):
|
||||
sel = SelectionManager(el)
|
||||
original_content = sel.content
|
||||
words = original_content.split()
|
||||
self.assertTrue(len(words) >= 1, 'Expect at least one word in the content.')
|
||||
|
||||
# Goal: Replace all text after the first word with '!'
|
||||
content_to_add = '!'
|
||||
target_content = words[0] + content_to_add
|
||||
|
||||
# Get the location of the selection carets at the end of the content for
|
||||
# later use.
|
||||
el.tap()
|
||||
sel.select_all()
|
||||
(_, _), (end_caret_x, end_caret_y) = sel.selection_carets_location()
|
||||
|
||||
self._long_press_to_select_first_word(el, sel)
|
||||
|
||||
# Move the right caret to the end of the content.
|
||||
(caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location()
|
||||
self.actions.flick(el, caret2_x, caret2_y, end_caret_x, end_caret_y).perform()
|
||||
|
||||
# Move the left caret to the previous position of the right caret.
|
||||
self.actions.flick(el, caret1_x, caret2_y, caret2_x, caret2_y).perform()
|
||||
|
||||
el.send_keys(content_to_add)
|
||||
assertFunc(target_content, sel.content)
|
||||
|
||||
def _test_minimum_select_one_character(self, el, assertFunc):
|
||||
sel = SelectionManager(el)
|
||||
original_content = sel.content
|
||||
words = original_content.split()
|
||||
self.assertTrue(len(words) >= 1, 'Expect at least one word in the content.')
|
||||
|
||||
# Goal: Replace last character of the first word with '!'
|
||||
content_to_add = '!'
|
||||
new_word = words[0][:-1] + content_to_add
|
||||
target_content = original_content.replace(words[0], new_word, 1)
|
||||
|
||||
self._long_press_to_select_first_word(el, sel)
|
||||
|
||||
# Move the left caret to the position of right caret.
|
||||
(caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location()
|
||||
self.actions.flick(el, caret1_x, caret1_y, caret2_x, caret2_y,).perform()
|
||||
|
||||
# Expect to replace the last character of the first word.
|
||||
el.send_keys(content_to_add)
|
||||
assertFunc(target_content, sel.content)
|
||||
|
||||
def _test_minimum_select_one_character_by_selection(self, el, assertFunc):
|
||||
sel = SelectionManager(el)
|
||||
el.tap()
|
||||
sel.select_all()
|
||||
|
||||
# Move the right caret to the position of the left caret. Since the
|
||||
# minimum selection range by selection carets is one character, the
|
||||
# first character should be selected.
|
||||
(caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location()
|
||||
self.actions.flick(el, caret2_x, caret2_y, caret1_x, caret1_y).perform()
|
||||
|
||||
cmd = sel.js_selection_cmd() +\
|
||||
'''return (sel.anchorNode == sel.focusNode) &&
|
||||
(sel.focusOffset - sel.anchorOffset == 1);'''
|
||||
result = self.marionette.execute_script(cmd, script_args=[el])
|
||||
|
||||
assertFunc(result)
|
||||
|
||||
########################################################################
|
||||
# <input> test cases with selection carets enabled
|
||||
########################################################################
|
||||
def test_input_long_press_to_select_a_word(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_long_press_to_select_a_word(self._input, self.assertEqual)
|
||||
|
||||
def test_input_move_selection_carets(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_move_selection_carets(self._input, self.assertEqual)
|
||||
|
||||
def test_input_minimum_select_one_caracter(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_minimum_select_one_character(self._input, self.assertEqual)
|
||||
|
||||
########################################################################
|
||||
# <input> test cases with selection carets disabled
|
||||
########################################################################
|
||||
def test_input_long_press_to_select_a_word_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_long_press_to_select_a_word(self._input, self.assertNotEqual)
|
||||
|
||||
def test_input_move_selection_carets_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_move_selection_carets(self._input, self.assertNotEqual)
|
||||
|
||||
########################################################################
|
||||
# <textarea> test cases with selection carets enabled
|
||||
########################################################################
|
||||
def test_textarea_long_press_to_select_a_word(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_long_press_to_select_a_word(self._textarea, self.assertEqual)
|
||||
|
||||
def test_textarea_move_selection_carets(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_move_selection_carets(self._textarea, self.assertEqual)
|
||||
|
||||
def test_textarea_minimum_select_one_caracter(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_minimum_select_one_character(self._textarea, self.assertEqual)
|
||||
|
||||
########################################################################
|
||||
# <textarea> test cases with selection carets disabled
|
||||
########################################################################
|
||||
def test_textarea_long_press_to_select_a_word_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_long_press_to_select_a_word(self._textarea, self.assertNotEqual)
|
||||
|
||||
def test_textarea_move_selection_carets_disable(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_move_selection_carets(self._textarea, self.assertNotEqual)
|
||||
|
||||
########################################################################
|
||||
# <textarea> right-to-left test cases with selection carets enabled
|
||||
########################################################################
|
||||
def test_textarea_rtl_long_press_to_select_a_word(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_long_press_to_select_a_word(self._textarea_rtl, self.assertEqual)
|
||||
|
||||
def test_textarea_rtl_move_selection_carets(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_move_selection_carets(self._textarea_rtl, self.assertEqual)
|
||||
|
||||
def test_textarea_rtl_minimum_select_one_caracter(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_minimum_select_one_character(self._textarea_rtl, self.assertEqual)
|
||||
|
||||
########################################################################
|
||||
# <textarea> right-to-left test cases with selection carets disabled
|
||||
########################################################################
|
||||
def test_textarea_rtl_long_press_to_select_a_word_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_long_press_to_select_a_word(self._textarea_rtl, self.assertNotEqual)
|
||||
|
||||
def test_textarea_rtl_move_selection_carets_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_move_selection_carets(self._textarea_rtl, self.assertNotEqual)
|
||||
|
||||
########################################################################
|
||||
# <div> contenteditable test cases with selection carets enabled
|
||||
########################################################################
|
||||
def test_contenteditable_long_press_to_select_a_word(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_long_press_to_select_a_word(self._contenteditable, self.assertEqual)
|
||||
|
||||
def test_contenteditable_move_selection_carets(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_move_selection_carets(self._contenteditable, self.assertEqual)
|
||||
|
||||
def test_contenteditable_minimum_select_one_character(self):
|
||||
self.openTestHtml(enabled=True)
|
||||
self._test_minimum_select_one_character(self._contenteditable, self.assertEqual)
|
||||
|
||||
########################################################################
|
||||
# <div> contenteditable test cases with selection carets disabled
|
||||
########################################################################
|
||||
def test_contenteditable_long_press_to_select_a_word_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_long_press_to_select_a_word(self._contenteditable, self.assertNotEqual)
|
||||
|
||||
def test_contenteditable_move_selection_carets_disabled(self):
|
||||
self.openTestHtml(enabled=False)
|
||||
self._test_move_selection_carets(self._contenteditable, self.assertNotEqual)
|
||||
|
||||
########################################################################
|
||||
# <div> non-editable test cases with selection carets enabled
|
||||
########################################################################
|
||||
# def test_content_non_editable_minimum_select_one_character_by_selection(self):
|
||||
# self.openTestHtml(enabled=True)
|
||||
# self._test_minimum_select_one_character_by_selection(self._content, self.assertFalse)
|
@ -0,0 +1,23 @@
|
||||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html id="html">
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<title>Bug 1019441: Marionette tests for selection carets</title>
|
||||
</head>
|
||||
<body>
|
||||
<div><input id="input" value="ABC DEF GHI"></div>
|
||||
<br />
|
||||
<div><textarea id="textarea" rows="4" cols="8">ABC DEF GHI JKL MNO PQR</textarea></div>
|
||||
<br />
|
||||
<div><textarea dir="rtl" id="textarea_rtl" rows="8" cols="8">موزيلا فيرفكس موزيلا فيرفكس</textarea></div>
|
||||
<br />
|
||||
<div style="width: 10em; height: 4em; word-wrap: break-word; overflow: auto;" contenteditable="true" id="contenteditable">ABC DEF GHI</div>
|
||||
<br />
|
||||
<div style="width: 10em; height: 4em; word-wrap: break-word; overflow: auto;" id="content">ABC DEF GHI</div>
|
||||
<br />
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue
Block a user