From 732119fb5b59a32ab86e19504e7afc6e0ef4fbee Mon Sep 17 00:00:00 2001 From: Ting-Yu Lin Date: Tue, 8 Mar 2016 22:21:31 +0800 Subject: [PATCH] Bug 1253989 Part 3 - Use @parameterized to rewrite selection mode tests. r=mtseng * Inline some of the open_*_html methods since they're called only once. * Save test running time by finding the elements needed in tests instead of find all of the elements in open_*_html methods. * Remove test_long_press_to_select_non_selectable_word() since it's covered by test_focus_not_changed_by_long_press_on_non_selectable(). * Use hyphen for element ids. * Replace "left" and "right" caret by "first" and "second" caret, respectively. MozReview-Commit-ID: Ey5m5zO3HYc --HG-- extra : rebase_source : c94b84ced75560ce1167cda35ee94dd4cc81ee4d --- .../test_accessiblecaret_selection_mode.py | 464 +++++++----------- .../marionette/www/test_selectioncarets.html | 4 +- 2 files changed, 166 insertions(+), 302 deletions(-) diff --git a/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py b/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py index bfcbd0fc5e20..8a98722e3048 100644 --- a/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py +++ b/layout/base/tests/marionette/test_accessiblecaret_selection_mode.py @@ -3,11 +3,14 @@ # 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/. +import re + +from marionette.marionette_test import ( + MarionetteTestCase, SkipTest, parameterized +) from marionette_driver.by import By from marionette_driver.marionette import Actions -from marionette import MarionetteTestCase, SkipTest from marionette_driver.selection import SelectionManager -import re def skip_if_not_rotatable(target): @@ -19,12 +22,19 @@ def skip_if_not_rotatable(target): class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): - '''Test cases for AccessibleCaret under selection mode, aka selection carets. - - ''' + '''Test cases for AccessibleCaret under selection mode.''' + _input_id = 'input' + _textarea_id = 'textarea' + _textarea2_id = 'textarea2' + _textarea_rtl_id = 'textarea-rtl' + _contenteditable_id = 'contenteditable' + _contenteditable2_id = 'contenteditable2' + _content_id = 'content' + _content2_id = 'content2' + _non_selectable_id = 'non-selectable' def setUp(self): - # Code to execute before a tests are run. + # Code to execute before every test is running. super(AccessibleCaretSelectionModeTestCase, self).setUp() self.carets_tested_pref = 'layout.accessiblecaret.enabled' self.prefs = { @@ -36,62 +46,17 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): self.actions = Actions(self.marionette) def open_test_html(self): - 'Open html for testing and locate elements.' test_html = self.marionette.absolute_url('test_selectioncarets.html') self.marionette.navigate(test_html) - self._input = self.marionette.find_element(By.ID, 'input') - self._textarea = self.marionette.find_element(By.ID, 'textarea') - self._textarea_rtl = self.marionette.find_element(By.ID, 'textarea_rtl') - self._contenteditable = self.marionette.find_element(By.ID, 'contenteditable') - self._content = self.marionette.find_element(By.ID, 'content') - self._non_selectable = self.marionette.find_element(By.ID, 'non_selectable') - def open_test_html2(self): - 'Open html for testing and locate elements.' test_html2 = self.marionette.absolute_url('test_selectioncarets_multipleline.html') self.marionette.navigate(test_html2) - self._textarea2 = self.marionette.find_element(By.ID, 'textarea2') - self._contenteditable2 = self.marionette.find_element(By.ID, 'contenteditable2') - self._content2 = self.marionette.find_element(By.ID, 'content2') - def open_test_html_multirange(self): - 'Open html for testing non-editable support.' test_html = self.marionette.absolute_url('test_selectioncarets_multiplerange.html') self.marionette.navigate(test_html) - self._body = self.marionette.find_element(By.ID, 'bd') - self._sel1 = self.marionette.find_element(By.ID, 'sel1') - self._sel2 = self.marionette.find_element(By.ID, 'sel2') - self._sel3 = self.marionette.find_element(By.ID, 'sel3') - self._sel4 = self.marionette.find_element(By.ID, 'sel4') - self._sel6 = self.marionette.find_element(By.ID, 'sel6') - self._nonsel1 = self.marionette.find_element(By.ID, 'nonsel1') - - def open_test_html_long_text(self): - 'Open html for testing long text.' - test_html = self.marionette.absolute_url('test_selectioncarets_longtext.html') - self.marionette.navigate(test_html) - - self._body = self.marionette.find_element(By.ID, 'bd') - self._longtext = self.marionette.find_element(By.ID, 'longtext') - - def open_test_html_iframe(self): - 'Open html for testing iframe.' - test_html = self.marionette.absolute_url('test_selectioncarets_iframe.html') - self.marionette.navigate(test_html) - - self._iframe = self.marionette.find_element(By.ID, 'frame') - - def open_test_html_display_none(self): - 'Open html for testing html with display: none.' - test_html = self.marionette.absolute_url('test_carets_display_none.html') - self.marionette.navigate(test_html) - - self._html = self.marionette.find_element(By.ID, 'html') - self._content = self.marionette.find_element(By.ID, 'content') - def word_offset(self, text, ordinal): 'Get the character offset of the ordinal-th word in text.' tokens = re.split(r'(\S+)', text) # both words and spaces @@ -129,7 +94,7 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): sel = SelectionManager(el) offset = self.word_offset(sel.content, ordinal) - # Move caret to the word. + # Move the blinking cursor to the word. el.tap() sel.move_caret_to_front() sel.move_caret_by_offset(offset) @@ -184,7 +149,17 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): return s.replace('\r\n', '\n').replace('\r', '\n') - def _test_long_press_to_select_a_word(self, el, assertFunc): + @parameterized(_input_id, el_id=_input_id) + @parameterized(_textarea_id, el_id=_textarea_id) + @parameterized(_textarea_rtl_id, el_id=_textarea_rtl_id) + @parameterized(_contenteditable_id, el_id=_contenteditable_id) + @parameterized(_content_id, el_id=_content_id) + def test_long_press_to_select_a_word(self, el_id): + self.open_test_html() + el = self.marionette.find_element(By.ID, el_id) + self._test_long_press_to_select_a_word(el) + + def _test_long_press_to_select_a_word(self, el): sel = SelectionManager(el) original_content = sel.content words = original_content.split() @@ -195,9 +170,16 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): self.long_press_on_word(el, 0) # Ignore extra spaces selected after the word. - assertFunc(target_content, sel.selected_content) + self.assertEqual(target_content, sel.selected_content) - def _test_move_selection_carets(self, el, assertFunc): + @parameterized(_input_id, el_id=_input_id) + @parameterized(_textarea_id, el_id=_textarea_id) + @parameterized(_textarea_rtl_id, el_id=_textarea_rtl_id) + @parameterized(_contenteditable_id, el_id=_contenteditable_id) + @parameterized(_content_id, el_id=_content_id) + def test_drag_carets(self, el_id): + self.open_test_html() + el = self.marionette.find_element(By.ID, el_id) sel = SelectionManager(el) original_content = sel.content words = original_content.split() @@ -214,17 +196,34 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): self.long_press_on_word(el, 0) - # Move the right caret to the end of the content. + # Drag the second 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. + # Drag the first caret to the previous position of the second caret. self.actions.flick(el, caret1_x, caret1_y, caret2_x, caret2_y).perform() - assertFunc(target_content, sel.selected_content) + self.assertEqual(target_content, sel.selected_content) - def _test_minimum_select_one_character(self, el, assertFunc, - x=None, y=None): + @parameterized(_input_id, el_id=_input_id) + @parameterized(_textarea_id, el_id=_textarea_id) + @parameterized(_textarea_rtl_id, el_id=_textarea_rtl_id) + @parameterized(_contenteditable_id, el_id=_contenteditable_id) + @parameterized(_content_id, el_id=_content_id) + def test_minimum_select_one_character(self, el_id): + self.open_test_html() + el = self.marionette.find_element(By.ID, el_id) + self._test_minimum_select_one_character(el) + + @parameterized(_textarea2_id, el_id=_textarea2_id) + @parameterized(_contenteditable2_id, el_id=_contenteditable2_id) + @parameterized(_content2_id, el_id=_content2_id) + def test_minimum_select_one_character2(self, el_id): + self.open_test_html2() + el = self.marionette.find_element(By.ID, el_id) + self._test_minimum_select_one_character(el) + + def _test_minimum_select_one_character(self, el, x=None, y=None): sel = SelectionManager(el) original_content = sel.content words = original_content.split() @@ -247,21 +246,45 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): x, y = self.word_location(el, 0) self.long_press_on_location(el, x, y) - # Move the right caret to the end of the content. + # Drag the second 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 right caret to the position of the left caret. + # Drag the second caret to the position of the first caret. (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() - assertFunc(target_content, sel.selected_content) + self.assertEqual(target_content, sel.selected_content) - def _test_focus_obtained_by_long_press(self, el1, el2): + @parameterized(_input_id + '_to_' + _textarea_id, + el1_id=_input_id, el2_id=_textarea_id) + @parameterized(_input_id + '_to_' + _contenteditable_id, + el1_id=_input_id, el2_id=_contenteditable_id) + @parameterized(_input_id + '_to_' + _content_id, + el1_id=_input_id, el2_id=_content_id) + @parameterized(_textarea_id + '_to_' + _input_id, + el1_id=_textarea_id, el2_id=_input_id) + @parameterized(_textarea_id + '_to_' + _contenteditable_id, + el1_id=_textarea_id, el2_id=_contenteditable_id) + @parameterized(_textarea_id + '_to_' + _content_id, + el1_id=_textarea_id, el2_id=_content_id) + @parameterized(_contenteditable_id + '_to_' + _input_id, + el1_id=_contenteditable_id, el2_id=_input_id) + @parameterized(_contenteditable_id + '_to_' + _textarea_id, + el1_id=_contenteditable_id, el2_id=_textarea_id) + @parameterized(_contenteditable_id + '_to_' + _content_id, + el1_id=_contenteditable_id, el2_id=_content_id) + @parameterized(_content_id + '_to_' + _input_id, + el1_id=_content_id, el2_id=_input_id) + @parameterized(_content_id + '_to_' + _textarea_id, + el1_id=_content_id, el2_id=_textarea_id) + @parameterized(_content_id + '_to_' + _contenteditable_id, + el1_id=_content_id, el2_id=_contenteditable_id) + def test_long_press_changes_focus_from(self, el1_id, el2_id): '''Test the focus could be changed from el1 to el2 by long press. - If the focus is changed to e2 successfully, SelectionCarets should - appear and could be dragged. + If the focus is changed to e2 successfully, the carets should appear and + could be dragged. ''' # Goal: Tap to focus el1, and then select the first character on @@ -270,28 +293,45 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): # We want to collect the location of the first word in el2 here # since self.word_location() has the side effect which would # change the focus. + self.open_test_html() + el1 = self.marionette.find_element(By.ID, el1_id) + el2 = self.marionette.find_element(By.ID, el2_id) x, y = self.word_location(el2, 0) el1.tap() - self._test_minimum_select_one_character(el2, self.assertEqual, - x=x, y=y) + self._test_minimum_select_one_character(el2, x=x, y=y) + + @parameterized(_input_id, el_id=_input_id) + @parameterized(_textarea_id, el_id=_textarea_id) + @parameterized(_textarea_rtl_id, el_id=_textarea_rtl_id) + @parameterized(_contenteditable_id, el_id=_contenteditable_id) + def test_focus_not_changed_by_long_press_on_non_selectable(self, el_id): + self.open_test_html() + el = self.marionette.find_element(By.ID, el_id) + non_selectable = self.marionette.find_element(By.ID, self._non_selectable_id) - def _test_focus_not_being_changed_by_long_press_on_non_selectable(self, el): # Goal: Focus remains on the editable element el after long pressing on # the non-selectable element. sel = SelectionManager(el) self.long_press_on_word(el, 0) - self.long_press_on_location(self._non_selectable) + self.long_press_on_location(non_selectable) active_sel = SelectionManager(self.marionette.get_active_element()) self.assertEqual(sel.content, active_sel.content) - def _test_handle_tilt_when_carets_overlap_to_each_other(self, el, assertFunc): + @parameterized(_input_id, el_id=_input_id) + @parameterized(_textarea_id, el_id=_textarea_id) + @parameterized(_textarea_rtl_id, el_id=_textarea_rtl_id) + @parameterized(_contenteditable_id, el_id=_contenteditable_id) + @parameterized(_content_id, el_id=_content_id) + def test_handle_tilt_when_carets_overlap_each_other(self, el_id): '''Test tilt handling when carets overlap to each other. - Let SelectionCarets overlap to each other. If SelectionCarets are set - to tilted successfully, tapping the tilted carets should not cause the - selection to be collapsed and the carets should be draggable. - ''' + Let the two carets overlap each other. If they are set to tilted + successfully, tapping the tilted carets should not cause the selection + to be collapsed and the carets should be draggable. + ''' + self.open_test_html() + el = self.marionette.find_element(By.ID, el_id) sel = SelectionManager(el) original_content = sel.content words = original_content.split() @@ -301,7 +341,7 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): self.long_press_on_word(el, 0) target_content = sel.selected_content - # Move the left caret to the position of the right caret to trigger + # Drag the first caret to the position of the second caret to trigger # carets overlapping. (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() @@ -313,16 +353,10 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): (caret3_x, caret3_y), (caret4_x, caret4_y) = sel.selection_carets_location() # The following values are from ua.css and all.js - if self.carets_tested_pref == 'selectioncaret.enabled': - caret_width = 44 - caret_margin_left = -23 - tilt_right_margin_left = 18 - tilt_left_margin_left = -17 - elif self.carets_tested_pref == 'layout.accessiblecaret.enabled': - caret_width = float(self.marionette.get_pref('layout.accessiblecaret.width')) - caret_margin_left = float(self.marionette.get_pref('layout.accessiblecaret.margin-left')) - tilt_right_margin_left = 0.41 * caret_width; - tilt_left_margin_left = -0.39 * caret_width; + caret_width = float(self.marionette.get_pref('layout.accessiblecaret.width')) + caret_margin_left = float(self.marionette.get_pref('layout.accessiblecaret.margin-left')) + tilt_right_margin_left = 0.41 * caret_width + tilt_left_margin_left = -0.39 * caret_width left_caret_left_edge_x = caret3_x + caret_margin_left + tilt_left_margin_left el.tap(left_caret_left_edge_x + 2, caret3_y) @@ -331,53 +365,46 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): tilt_right_margin_left + caret_width) el.tap(right_caret_right_edge_x - 2, caret4_y) - # Drag the left caret back to the initial selection, the first word. + # Drag the first caret back to the initial selection, the first word. self.actions.flick(el, caret3_x, caret3_y, caret1_x, caret1_y).perform() - assertFunc(target_content, sel.selected_content) - - def test_long_press_to_select_non_selectable_word(self): - '''Testing long press on non selectable field. - We should not select anything when long press on non selectable fields.''' - - self.open_test_html_multirange() - halfY = self._nonsel1.size['height'] / 2 - self.long_press_on_location(self._nonsel1, 0, halfY) - sel = SelectionManager(self._nonsel1) - range_count = sel.range_count() - self.assertEqual(range_count, 0) + self.assertEqual(target_content, sel.selected_content) def test_drag_caret_over_non_selectable_field(self): '''Testing drag caret over non selectable field. So that the selected content should exclude non selectable field and end selection caret should appear in last range's position.''' self.open_test_html_multirange() + body = self.marionette.find_element(By.ID, 'bd') + sel3 = self.marionette.find_element(By.ID, 'sel3') + sel4 = self.marionette.find_element(By.ID, 'sel4') + sel6 = self.marionette.find_element(By.ID, 'sel6') # Select target element and get target caret location - self.long_press_on_word(self._sel4, 3) - sel = SelectionManager(self._body) + self.long_press_on_word(sel4, 3) + sel = SelectionManager(body) (_, _), (end_caret_x, end_caret_y) = sel.selection_carets_location() - self.long_press_on_word(self._sel6, 0) + self.long_press_on_word(sel6, 0) (_, _), (end_caret2_x, end_caret2_y) = sel.selection_carets_location() # Select start element - self.long_press_on_word(self._sel3, 3) + self.long_press_on_word(sel3, 3) # Drag end caret to target location (caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location() - self.actions.flick(self._body, caret2_x, caret2_y, end_caret_x, end_caret_y, 1).perform() + self.actions.flick(body, caret2_x, caret2_y, end_caret_x, end_caret_y, 1).perform() self.assertEqual(self.to_unix_line_ending(sel.selected_content.strip()), 'this 3\nuser can select this') (caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location() - self.actions.flick(self._body, caret2_x, caret2_y, end_caret2_x, end_caret2_y, 1).perform() + self.actions.flick(body, caret2_x, caret2_y, end_caret2_x, end_caret2_y, 1).perform() self.assertEqual(self.to_unix_line_ending(sel.selected_content.strip()), 'this 3\nuser can select this 4\nuser can select this 5\nuser') # Drag first caret to target location (caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location() - self.actions.flick(self._body, caret1_x, caret1_y, end_caret_x, end_caret_y, 1).perform() + self.actions.flick(body, caret1_x, caret1_y, end_caret_x, end_caret_y, 1).perform() self.assertEqual(self.to_unix_line_ending(sel.selected_content.strip()), '4\nuser can select this 5\nuser') @@ -386,21 +413,24 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): Test caret visibility when caret is dragged to beginning of a line ''' self.open_test_html_multirange() + body = self.marionette.find_element(By.ID, 'bd') + sel1 = self.marionette.find_element(By.ID, 'sel1') + sel2 = self.marionette.find_element(By.ID, 'sel2') # Select the first word in the second line - self.long_press_on_word(self._sel2, 0) - sel = SelectionManager(self._body) + self.long_press_on_word(sel2, 0) + sel = SelectionManager(body) (start_caret_x, start_caret_y), (end_caret_x, end_caret_y) = sel.selection_carets_location() # Select target word in the first line - self.long_press_on_word(self._sel1, 2) + self.long_press_on_word(sel1, 2) # Drag end caret to the beginning of the second line (caret1_x, caret1_y), (caret2_x, caret2_y) = sel.selection_carets_location() - self.actions.flick(self._body, caret2_x, caret2_y, start_caret_x, start_caret_y).perform() + self.actions.flick(body, caret2_x, caret2_y, start_caret_x, start_caret_y).perform() # Drag end caret back to the target word - self.actions.flick(self._body, start_caret_x, start_caret_y, caret2_x, caret2_y).perform() + self.actions.flick(body, start_caret_x, start_caret_y, caret2_x, caret2_y).perform() self.assertEqual(self.to_unix_line_ending(sel.selected_content), 'select') @@ -409,18 +439,23 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): '''Bug 1094072 If positions of carets are updated correctly, they should be draggable. ''' - self.open_test_html_long_text() + test_html = self.marionette.absolute_url('test_selectioncarets_longtext.html') + self.marionette.navigate(test_html) + + body = self.marionette.find_element(By.ID, 'bd') + longtext = self.marionette.find_element(By.ID, 'longtext') # Select word in portrait mode, then change to landscape mode self.marionette.set_orientation('portrait') - self.long_press_on_word(self._longtext, 12) - sel = SelectionManager(self._body) + self.long_press_on_word(longtext, 12) + sel = SelectionManager(body) (p_start_caret_x, p_start_caret_y), (p_end_caret_x, p_end_caret_y) = sel.selection_carets_location() self.marionette.set_orientation('landscape') (l_start_caret_x, l_start_caret_y), (l_end_caret_x, l_end_caret_y) = sel.selection_carets_location() # Drag end caret to the start caret to change the selected content - self.actions.flick(self._body, l_end_caret_x, l_end_caret_y, l_start_caret_x, l_start_caret_y).perform() + self.actions.flick(body, l_end_caret_x, l_end_caret_y, + l_start_caret_x, l_start_caret_y).perform() # Change orientation back to portrait mode to prevent affecting # other tests @@ -435,16 +470,18 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): huge offset. If we use the right coordinate system, selection should work. Otherwise, it would be hard to trigger select word. ''' - self.open_test_html_iframe() + test_html = self.marionette.absolute_url('test_selectioncarets_iframe.html') + self.marionette.navigate(test_html) + iframe = self.marionette.find_element(By.ID, 'frame') # switch to inner iframe and scroll to the bottom - self.marionette.switch_to_frame(self._iframe) + self.marionette.switch_to_frame(iframe) self.marionette.execute_script( 'document.getElementById("bd").scrollTop += 999') # long press to select bottom text - self._body = self.marionette.find_element(By.ID, 'bd') - sel = SelectionManager(self._body) + body = self.marionette.find_element(By.ID, 'bd') + sel = SelectionManager(body) self._bottomtext = self.marionette.find_element(By.ID, 'bottomtext') self.long_press_on_location(self._bottomtext) @@ -455,197 +492,24 @@ class AccessibleCaretSelectionModeTestCase(MarionetteTestCase): display: none. ''' - self.open_test_html_display_none() + test_html = self.marionette.absolute_url('test_carets_display_none.html') + self.marionette.navigate(test_html) + html = self.marionette.find_element(By.ID, 'html') + content = self.marionette.find_element(By.ID, 'content') # Remove 'display: none' from self.marionette.execute_script( 'arguments[0].style.display = "unset";', - script_args=[self._html] + script_args=[html] ) # If AccessibleCaretEventHub is initialized successfully, select a word # should work. - self._test_long_press_to_select_a_word(self._content, self.assertEqual) - - ######################################################################## - # test cases with selection carets enabled - ######################################################################## - def test_input_long_press_to_select_a_word(self): - self.open_test_html() - self._test_long_press_to_select_a_word(self._input, self.assertEqual) - - def test_input_move_selection_carets(self): - self.open_test_html() - self._test_move_selection_carets(self._input, self.assertEqual) - - def test_input_minimum_select_one_character(self): - self.open_test_html() - self._test_minimum_select_one_character(self._input, self.assertEqual) - - def test_input_focus_obtained_by_long_press_from_textarea(self): - self.open_test_html() - self._test_focus_obtained_by_long_press(self._textarea, self._input) - - def test_input_focus_obtained_by_long_press_from_contenteditable(self): - self.open_test_html() - self._test_focus_obtained_by_long_press(self._contenteditable, self._input) - - def test_input_focus_obtained_by_long_press_from_content_non_editable(self): - self.open_test_html() - self._test_focus_obtained_by_long_press(self._content, self._input) - - def test_input_handle_tilt_when_carets_overlap_to_each_other(self): - self.open_test_html() - self._test_handle_tilt_when_carets_overlap_to_each_other(self._input, self.assertEqual) - - def test_input_focus_not_changed_by_long_press_on_non_selectable(self): - self.open_test_html() - self._test_focus_not_being_changed_by_long_press_on_non_selectable(self._input) - - ######################################################################## - #
-
+

ABC DEF GHI

ABC DEF GHI

-
Non-selectable
+
Non-selectable