| Index: chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
| diff --git a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
| index 4cd227706404746b0c0bc0def195fd5572ba938b..a06446b7ac41606c3d191efc851e72b01f240e52 100644
|
| --- a/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
| +++ b/chrome/browser/renderer_host/site_per_process_text_input_browsertest.cc
|
| @@ -24,7 +24,6 @@
|
| #include "content/public/test/text_input_test_utils.h"
|
| #include "net/dns/mock_host_resolver.h"
|
| #include "net/test/embedded_test_server/embedded_test_server.h"
|
| -#include "ui/base/clipboard/clipboard.h"
|
| #include "ui/base/ime/composition_underline.h"
|
| #include "ui/base/ime/text_edit_commands.h"
|
| #include "ui/base/ime/text_input_client.h"
|
| @@ -143,6 +142,24 @@
|
| DISALLOW_COPY_AND_ASSIGN(TextInputManagerTypeObserver);
|
| };
|
|
|
| +// This class observes TextInputManager for the first change in TextInputState.
|
| +class TextInputManagerChangeObserver : public TextInputManagerObserverBase {
|
| + public:
|
| + explicit TextInputManagerChangeObserver(content::WebContents* web_contents)
|
| + : TextInputManagerObserverBase(web_contents) {
|
| + tester()->SetUpdateTextInputStateCalledCallback(base::Bind(
|
| + &TextInputManagerChangeObserver::VerifyChange, base::Unretained(this)));
|
| + }
|
| +
|
| + private:
|
| + void VerifyChange() {
|
| + if (tester()->IsTextInputStateChanged())
|
| + OnSuccess();
|
| + }
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TextInputManagerChangeObserver);
|
| +};
|
| +
|
| // This class observes |TextInputState.type| for a specific RWHV.
|
| class ViewTextInputTypeObserver : public TextInputManagerObserverBase {
|
| public:
|
| @@ -262,43 +279,20 @@
|
| &TextSelectionObserver::VerifyChange, base::Unretained(this)));
|
| }
|
|
|
| - void WaitForSelectedText(const std::string& text,
|
| - bool user_initiated = true) {
|
| - expected_text_ = text;
|
| - expected_user_initiated_ = user_initiated;
|
| - if (last_selected_text_.has_value() &&
|
| - last_selected_text_ == expected_text_ &&
|
| - last_user_initiated_ == expected_user_initiated_) {
|
| - OnSuccess();
|
| - } else {
|
| - Wait();
|
| - }
|
| + void WaitForSelectedText(const std::string& text) {
|
| + selected_text_ = text;
|
| + Wait();
|
| }
|
|
|
| private:
|
| void VerifyChange() {
|
| - last_selected_text_ =
|
| - base::UTF16ToUTF8(tester()->GetUpdatedView()->GetSelectedText());
|
| - EXPECT_TRUE(tester()->GetTextSelectionUserInitiatedForView(
|
| - tester()->GetUpdatedView(), &last_user_initiated_));
|
| -
|
| - // Check whether the expected values are already set.
|
| - if (!expected_text_.has_value())
|
| - return;
|
| -
|
| - if (last_selected_text_ == expected_text_ &&
|
| - last_user_initiated_ == expected_user_initiated_) {
|
| + if (base::UTF16ToUTF8(tester()->GetUpdatedView()->GetSelectedText()) ==
|
| + selected_text_) {
|
| OnSuccess();
|
| }
|
| }
|
|
|
| - // These optional properties are also used to verify that the last and
|
| - // expected properties are set.
|
| - base::Optional<std::string> last_selected_text_;
|
| - base::Optional<std::string> expected_text_;
|
| -
|
| - bool last_user_initiated_;
|
| - bool expected_user_initiated_;
|
| + std::string selected_text_;
|
|
|
| DISALLOW_COPY_AND_ASSIGN(TextSelectionObserver);
|
| };
|
| @@ -986,124 +980,6 @@
|
| }
|
| }
|
|
|
| -// The following tests verify that the TextInputManager notifies about a
|
| -// text selection change event, the corresponding |user_initiated| property
|
| -// of TextSelection is valid, and the selection clipboard is updated
|
| -// according to the source of the event.
|
| -// See: https://crbug.com/671986
|
| -
|
| -// Test text selection change event for non-user initiated cases
|
| -// (eg. JavaScript). Non-user initiated events should not update the selection
|
| -// clipboard.
|
| -IN_PROC_BROWSER_TEST_F(SitePerProcessTextInputManagerTest,
|
| - NonUserInitiatedTextSelection) {
|
| -#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
| - ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
|
| - ASSERT_TRUE(clipboard);
|
| - clipboard->Clear(ui::CLIPBOARD_TYPE_SELECTION);
|
| -#endif
|
| -
|
| - CreateIframePage("a(b, c)");
|
| - std::vector<std::string> values{"node_a", "node_b", "node_c"};
|
| - std::vector<content::RenderFrameHost*> frames{GetFrame(IndexVector{}),
|
| - GetFrame(IndexVector{0}),
|
| - GetFrame(IndexVector{1})};
|
| -
|
| - for (size_t i = 0; i < frames.size(); ++i)
|
| - AddInputFieldToFrame(frames[i], "text", values[i], true);
|
| -
|
| - // Test text selection from JavaScript across frames (non-user initiated).
|
| - for (size_t i = 0; i < frames.size(); ++i) {
|
| - // Trigger text selection.
|
| - TextSelectionObserver trigger_observer(active_contents());
|
| - EXPECT_TRUE(
|
| - ExecuteScript(frames[i], "document.querySelector('input').select();"));
|
| - trigger_observer.WaitForSelectedText(values[i], false);
|
| -
|
| -#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
| - // Non-user initiated text selection should not update the selection
|
| - // clipboard. See: https://crbug.com/12392
|
| - base::string16 result_text;
|
| - clipboard->ReadText(ui::CLIPBOARD_TYPE_SELECTION, &result_text);
|
| - EXPECT_TRUE(result_text.empty());
|
| -#endif
|
| -
|
| - // Clear text selection.
|
| - TextSelectionObserver clear_observer(active_contents());
|
| - EXPECT_TRUE(ExecuteScript(frames[i], "document.getSelection().empty();"));
|
| - clear_observer.WaitForSelectedText("", false);
|
| - }
|
| -}
|
| -
|
| -// Test text selection change event for user initiated cases (eg. key press)
|
| -// User initiated events should update the selection clipboard where it is
|
| -// supported.
|
| -IN_PROC_BROWSER_TEST_F(SitePerProcessTextInputManagerTest,
|
| - UserInitiatedTextSelection) {
|
| -#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
| - ui::Clipboard* clipboard = ui::Clipboard::GetForCurrentThread();
|
| - ASSERT_TRUE(clipboard);
|
| - clipboard->Clear(ui::CLIPBOARD_TYPE_SELECTION);
|
| -#endif
|
| -
|
| - CreateIframePage("a(b, c)");
|
| - std::vector<std::string> values{"node_a", "node_b", "node_c"};
|
| - std::vector<content::RenderFrameHost*> frames{GetFrame(IndexVector{}),
|
| - GetFrame(IndexVector{0}),
|
| - GetFrame(IndexVector{1})};
|
| -
|
| - for (size_t i = 0; i < frames.size(); ++i)
|
| - AddInputFieldToFrame(frames[i], "text", values[i], true);
|
| -
|
| - // Test text selection by user input across frames (user initiated).
|
| - for (size_t i = 0; i < frames.size(); ++i) {
|
| - // Focus on input element.
|
| - std::string result;
|
| - std::string script =
|
| - "function getInputField() {"
|
| - " return document.querySelector('input');"
|
| - "}"
|
| - "function onInputFocus(e) {"
|
| - " domAutomationController.setAutomationId(0);"
|
| - " domAutomationController.send(getInputField().value);"
|
| - "}"
|
| - "getInputField().addEventListener('focus', onInputFocus);";
|
| - EXPECT_TRUE(ExecuteScript(frames[i], script));
|
| - EXPECT_TRUE(ExecuteScriptAndExtractString(
|
| - frames[i], "window.focus(); document.querySelector('input').focus();",
|
| - &result));
|
| - EXPECT_EQ(values[i], result);
|
| - EXPECT_EQ(frames[i], active_contents()->GetFocusedFrame());
|
| -
|
| - // Press ctrl+a to select text in the input field.
|
| - TextSelectionObserver trigger_observer(active_contents());
|
| -#if !defined(OS_MACOSX)
|
| - SimulateKeyPress(active_contents(), ui::DomKey::FromCharacter('A'),
|
| - ui::DomCode::US_A, ui::VKEY_A, true, false, false, false);
|
| -#else
|
| - // On macOS the select all shortcut (Cmd+A) is handled by the browser via
|
| - // keyboard accelerator. Thus we can't simulate key press on WebContents.
|
| - // As a workaround, call the SelectAll directly as the shortcut would do.
|
| - active_contents()->SelectAll();
|
| -#endif
|
| - trigger_observer.WaitForSelectedText(values[i], true);
|
| -
|
| -#if defined(USE_AURA) && defined(OS_LINUX) && !defined(OS_CHROMEOS)
|
| - // User initiated text selection should update the selection clipboard.
|
| - base::string16 result_text;
|
| - clipboard->ReadText(ui::CLIPBOARD_TYPE_SELECTION, &result_text);
|
| - EXPECT_EQ(base::ASCIIToUTF16(values[i]), result_text);
|
| -#endif
|
| -
|
| - // Press down key to clear text selection.
|
| - TextSelectionObserver clear_observer(active_contents());
|
| - SimulateKeyPress(active_contents(), ui::DomKey::ARROW_DOWN,
|
| - ui::DomCode::ARROW_DOWN, ui::VKEY_DOWN, false, false,
|
| - false, false);
|
| - clear_observer.WaitForSelectedText("", true);
|
| - }
|
| -}
|
| -
|
| // TODO(ekaramad): The following tests are specifically written for Aura and are
|
| // based on InputMethodObserver. Write similar tests for Mac/Android/Mus
|
| // (crbug.com/602723).
|
|
|