diff options
author | lgarron <lgarron@chromium.org> | 2015-07-10 00:39:56 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-07-10 07:41:48 +0000 |
commit | 145aaa8a7762909442a684415333ebce4f65a229 (patch) | |
tree | ced809b5822f9a1d00d2cd42c5a2c84ce1dc2456 | |
parent | cd131d403bc15f9a7aca116b14d08268a3c6aded (diff) | |
download | chromium_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}
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; |