summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorlgarron <lgarron@chromium.org>2015-07-10 00:39:56 -0700
committerCommit bot <commit-bot@chromium.org>2015-07-10 07:41:48 +0000
commit145aaa8a7762909442a684415333ebce4f65a229 (patch)
treeced809b5822f9a1d00d2cd42c5a2c84ce1dc2456
parentcd131d403bc15f9a7aca116b14d08268a3c6aded (diff)
downloadchromium_src-145aaa8a7762909442a684415333ebce4f65a229.zip
chromium_src-145aaa8a7762909442a684415333ebce4f65a229.tar.gz
chromium_src-145aaa8a7762909442a684415333ebce4f65a229.tar.bz2
Route 'Select All' OS method through RenderWidgetHostDelegate.
This allows Cmd-A / "Select All" to be used on SSL interstitials on OSX. BUG=507416 Review URL: https://codereview.chromium.org/1212373009 Cr-Commit-Position: refs/heads/master@{#338248}
-rw-r--r--content/browser/frame_host/interstitial_page_impl.cc10
-rw-r--r--content/browser/frame_host/interstitial_page_impl.h1
-rw-r--r--content/browser/frame_host/interstitial_page_impl_browsertest.cc54
-rw-r--r--content/browser/frame_host/render_widget_host_view_child_frame_unittest.cc1
-rw-r--r--content/browser/frame_host/render_widget_host_view_guest_unittest.cc1
-rw-r--r--content/browser/renderer_host/render_widget_host_delegate.h1
-rw-r--r--content/browser/renderer_host/render_widget_host_unittest.cc1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_aura_unittest.cc2
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac.mm7
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm1
-rw-r--r--content/browser/renderer_host/render_widget_host_view_mac_unittest.mm1
-rw-r--r--content/browser/renderer_host/text_input_client_mac_unittest.mm1
-rw-r--r--content/browser/web_contents/web_contents_impl.h3
13 files changed, 69 insertions, 15 deletions
diff --git a/content/browser/frame_host/interstitial_page_impl.cc b/content/browser/frame_host/interstitial_page_impl.cc
index a42a802..f622283 100644
--- a/content/browser/frame_host/interstitial_page_impl.cc
+++ b/content/browser/frame_host/interstitial_page_impl.cc
@@ -459,6 +459,16 @@ void InterstitialPageImpl::Paste() {
RecordAction(base::UserMetricsAction("Paste"));
}
+void InterstitialPageImpl::SelectAll() {
+ FrameTreeNode* focused_node = frame_tree_.GetFocusedFrame();
+ if (!focused_node)
+ return;
+
+ focused_node->current_frame_host()->Send(new InputMsg_SelectAll(
+ focused_node->current_frame_host()->GetRoutingID()));
+ RecordAction(base::UserMetricsAction("SelectAll"));
+}
+
RenderViewHostDelegateView* InterstitialPageImpl::GetDelegateView() {
return rvh_delegate_view_.get();
}
diff --git a/content/browser/frame_host/interstitial_page_impl.h b/content/browser/frame_host/interstitial_page_impl.h
index c0eca02..3cbad79 100644
--- a/content/browser/frame_host/interstitial_page_impl.h
+++ b/content/browser/frame_host/interstitial_page_impl.h
@@ -108,6 +108,7 @@ class CONTENT_EXPORT InterstitialPageImpl
void Cut() override;
void Copy() override;
void Paste() override;
+ void SelectAll() override;
// RenderViewHostDelegate implementation:
RenderViewHostDelegateView* GetDelegateView() override;
diff --git a/content/browser/frame_host/interstitial_page_impl_browsertest.cc b/content/browser/frame_host/interstitial_page_impl_browsertest.cc
index 70a07e6..405b3b1 100644
--- a/content/browser/frame_host/interstitial_page_impl_browsertest.cc
+++ b/content/browser/frame_host/interstitial_page_impl_browsertest.cc
@@ -30,21 +30,28 @@ class TestInterstitialPageDelegate : public InterstitialPageDelegate {
return "<html>"
"<head>"
"<script>"
+ "function create_input_and_set_text(text) {"
+ " var input = document.createElement('input');"
+ " input.id = 'input';"
+ " document.body.appendChild(input);"
+ " document.getElementById('input').value = text;"
+ " input.addEventListener('input',"
+ " function() { document.title='TEXT_CHANGED'; });"
+ "}"
"function focus_select_input() {"
" document.getElementById('input').select();"
"}"
- "function set_input_text(text) {"
- " document.getElementById('input').value = text;"
- "}"
"function get_input_text() {"
" window.domAutomationController.send("
" document.getElementById('input').value);"
"}"
+ "function get_selection() {"
+ " window.domAutomationController.send("
+ " window.getSelection().toString());"
+ "}"
"</script>"
"</head>"
- "<body>"
- " <input id='input' oninput='document.title=\"TEXT_CHANGED\"'>"
- "</body>"
+ "<body>original body text</body>"
"</html>";
}
};
@@ -259,9 +266,14 @@ class InterstitialPageImplTest : public ContentBrowserTest {
"get_input_text()", input_text);
}
- bool SetInputText(const std::string& text) {
+ bool GetSelection(std::string* input_text) {
+ return ExecuteScriptAndExtractString(interstitial_->GetMainFrame(),
+ "get_selection()", input_text);
+ }
+
+ bool CreateInputAndSetText(const std::string& text) {
return ExecuteScript(interstitial_->GetMainFrame(),
- "set_input_text('" + text + "')");
+ "create_input_and_set_text('" + text + "')");
}
std::string PerformCut() {
@@ -292,6 +304,12 @@ class InterstitialPageImplTest : public ContentBrowserTest {
title_update_watcher_->Wait();
}
+ void PerformSelectAll() {
+ RenderFrameHostImpl* rfh =
+ static_cast<RenderFrameHostImpl*>(interstitial_->GetMainFrame());
+ rfh->GetRenderWidgetHost()->delegate()->SelectAll();
+ }
+
private:
void RunTaskOnIOThreadAndWait(const base::Closure& task) {
base::WaitableEvent completion(false, false);
@@ -316,7 +334,7 @@ class InterstitialPageImplTest : public ContentBrowserTest {
IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, Cut) {
SetUpInterstitialPage();
- ASSERT_TRUE(SetInputText("text-to-cut"));
+ ASSERT_TRUE(CreateInputAndSetText("text-to-cut"));
ASSERT_TRUE(FocusInputAndSelectText());
std::string clipboard_text = PerformCut();
@@ -332,7 +350,7 @@ IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, Cut) {
IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, Copy) {
SetUpInterstitialPage();
- ASSERT_TRUE(SetInputText("text-to-copy"));
+ ASSERT_TRUE(CreateInputAndSetText("text-to-copy"));
ASSERT_TRUE(FocusInputAndSelectText());
std::string clipboard_text = PerformCopy();
@@ -351,7 +369,7 @@ IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, Paste) {
SetClipboardText("text-to-paste");
- ASSERT_TRUE(SetInputText(std::string()));
+ ASSERT_TRUE(CreateInputAndSetText(std::string()));
ASSERT_TRUE(FocusInputAndSelectText());
PerformPaste();
@@ -364,4 +382,18 @@ IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, Paste) {
TearDownTestClipboard();
}
+IN_PROC_BROWSER_TEST_F(InterstitialPageImplTest, SelectAll) {
+ SetUpInterstitialPage();
+
+ std::string input_text;
+ ASSERT_TRUE(GetSelection(&input_text));
+ EXPECT_EQ(std::string(), input_text);
+
+ PerformSelectAll();
+ ASSERT_TRUE(GetSelection(&input_text));
+ EXPECT_EQ("original body text", input_text);
+
+ TearDownInterstitialPage();
+}
+
} // namespace content
diff --git a/content/browser/frame_host/render_widget_host_view_child_frame_unittest.cc b/content/browser/frame_host/render_widget_host_view_child_frame_unittest.cc
index d79c301..1d34441 100644
--- a/content/browser/frame_host/render_widget_host_view_child_frame_unittest.cc
+++ b/content/browser/frame_host/render_widget_host_view_child_frame_unittest.cc
@@ -32,6 +32,7 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
};
class MockCrossProcessFrameConnector : public CrossProcessFrameConnector {
diff --git a/content/browser/frame_host/render_widget_host_view_guest_unittest.cc b/content/browser/frame_host/render_widget_host_view_guest_unittest.cc
index 4369293..e450b38 100644
--- a/content/browser/frame_host/render_widget_host_view_guest_unittest.cc
+++ b/content/browser/frame_host/render_widget_host_view_guest_unittest.cc
@@ -37,6 +37,7 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
};
class RenderWidgetHostViewGuestTest : public testing::Test {
diff --git a/content/browser/renderer_host/render_widget_host_delegate.h b/content/browser/renderer_host/render_widget_host_delegate.h
index 0fa71b4..b204bad 100644
--- a/content/browser/renderer_host/render_widget_host_delegate.h
+++ b/content/browser/renderer_host/render_widget_host_delegate.h
@@ -83,6 +83,7 @@ class CONTENT_EXPORT RenderWidgetHostDelegate {
virtual void Cut() = 0;
virtual void Copy() = 0;
virtual void Paste() = 0;
+ virtual void SelectAll() = 0;
// Requests the renderer to move the selection extent to a new position.
virtual void MoveRangeSelectionExtent(const gfx::Point& extent) {}
diff --git a/content/browser/renderer_host/render_widget_host_unittest.cc b/content/browser/renderer_host/render_widget_host_unittest.cc
index f378a4a..9d3f0dc 100644
--- a/content/browser/renderer_host/render_widget_host_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_unittest.cc
@@ -372,6 +372,7 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
private:
bool prehandle_keyboard_event_;
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
index b80624d..fff506f 100644
--- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
+++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -152,6 +152,8 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
+
private:
scoped_ptr<NativeWebKeyboardEvent> last_event_;
DISALLOW_COPY_AND_ASSIGN(MockRenderWidgetHostDelegate);
diff --git a/content/browser/renderer_host/render_widget_host_view_mac.mm b/content/browser/renderer_host/render_widget_host_view_mac.mm
index 6100e33..91c9fd9 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac.mm
@@ -3123,9 +3123,10 @@ extern NSString *NSTextInputReplacementRangeAttributeName;
// menu handler, neither is true.
// Explicitly call SelectAll() here to make sure the renderer returns
// selection results.
- WebContents* web_contents = renderWidgetHostView_->GetWebContents();
- if (web_contents)
- web_contents->SelectAll();
+ content::RenderWidgetHostDelegate* render_widget_host_delegate =
+ renderWidgetHostView_->render_widget_host_->delegate();
+ if (render_widget_host_delegate)
+ render_widget_host_delegate->SelectAll();
}
- (void)startSpeaking:(id)sender {
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
index e650222..7d4f518 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_editcommand_helper_unittest.mm
@@ -78,6 +78,7 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
};
// Create a RenderWidget for which we can filter messages.
diff --git a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
index 0bc61bc..d582cab 100644
--- a/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
+++ b/content/browser/renderer_host/render_widget_host_view_mac_unittest.mm
@@ -122,6 +122,7 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
};
class MockRenderWidgetHostImpl : public RenderWidgetHostImpl {
diff --git a/content/browser/renderer_host/text_input_client_mac_unittest.mm b/content/browser/renderer_host/text_input_client_mac_unittest.mm
index 9f53031..2479255 100644
--- a/content/browser/renderer_host/text_input_client_mac_unittest.mm
+++ b/content/browser/renderer_host/text_input_client_mac_unittest.mm
@@ -32,6 +32,7 @@ class MockRenderWidgetHostDelegate : public RenderWidgetHostDelegate {
void Cut() override {}
void Copy() override {}
void Paste() override {}
+ void SelectAll() override {}
};
// This test does not test the WebKit side of the dictionary system (which
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h
index 0ebb78b..3ef5847 100644
--- a/content/browser/web_contents/web_contents_impl.h
+++ b/content/browser/web_contents/web_contents_impl.h
@@ -567,10 +567,11 @@ class CONTENT_EXPORT WebContentsImpl
BrowserAccessibilityManager* GetRootBrowserAccessibilityManager() override;
BrowserAccessibilityManager* GetOrCreateRootBrowserAccessibilityManager()
override;
- // Following three functions are already listed under WebContents overrides.
+ // The following 4 functions are already listed under WebContents overrides:
// void Cut() override;
// void Copy() override;
// void Paste() override;
+ // void SelectAll() override;
void MoveRangeSelectionExtent(const gfx::Point& extent) override;
void SelectRange(const gfx::Point& base, const gfx::Point& extent) override;