diff options
author | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-12 07:30:35 +0000 |
---|---|---|
committer | thakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-09-12 07:30:35 +0000 |
commit | a954bf7d89777070fa9980d6692e3787dd61e26f (patch) | |
tree | 31a0b26e4f0abfbe45437127d9f9703b5ceb6960 | |
parent | 8e5722d2311e0a91cca92692c012e64bb01fb2cf (diff) | |
download | chromium_src-a954bf7d89777070fa9980d6692e3787dd61e26f.zip chromium_src-a954bf7d89777070fa9980d6692e3787dd61e26f.tar.gz chromium_src-a954bf7d89777070fa9980d6692e3787dd61e26f.tar.bz2 |
Let cmd-e write the selection into the find pasteboard.
Note that chrome still does not support _reading_ from the find pasteboard, so hitting cmd-e followed by cmd-g in chrome still doesn't work. Also, cmd-f doesn't write to the find pasteboard yet either.
BUG=14562
TEST=Select some text on a web page, hit cmd-e, go to the same web page in safari, hit cmd-g. Safari should search for the text you selected in chrome.
Review URL: http://codereview.chromium.org/197035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@26075 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/nibs/MainMenu.xib | 40 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.cc | 7 | ||||
-rw-r--r-- | chrome/browser/renderer_host/render_view_host.h | 1 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.cc | 4 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter.h | 3 | ||||
-rw-r--r-- | chrome/browser/renderer_host/resource_message_filter_mac.mm | 28 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.cc | 4 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents.h | 1 | ||||
-rw-r--r-- | chrome/browser/tab_contents/tab_contents_view_mac.mm | 4 | ||||
-rw-r--r-- | chrome/chrome.gyp | 1 | ||||
-rw-r--r-- | chrome/common/render_messages_internal.h | 6 | ||||
-rw-r--r-- | chrome/renderer/render_view.cc | 17 | ||||
-rw-r--r-- | chrome/renderer/render_view.h | 1 |
13 files changed, 105 insertions, 12 deletions
diff --git a/chrome/app/nibs/MainMenu.xib b/chrome/app/nibs/MainMenu.xib index 0b4f21c..0265535 100644 --- a/chrome/app/nibs/MainMenu.xib +++ b/chrome/app/nibs/MainMenu.xib @@ -8,7 +8,7 @@ <string key="IBDocument.HIToolboxVersion">353.00</string> <object class="NSMutableArray" key="IBDocument.EditedObjectIDs"> <bool key="EncodedWithXMLCoder">YES</bool> - <integer value="503"/> + <integer value="221"/> </object> <object class="NSArray" key="IBDocument.PluginDependencies"> <bool key="EncodedWithXMLCoder">YES</bool> @@ -546,7 +546,6 @@ <int key="NSMnemonicLoc">2147483647</int> <reference key="NSOnImage" ref="353210768"/> <reference key="NSMixedImage" ref="549394948"/> - <int key="NSTag">7</int> </object> <object class="NSMenuItem" id="88285865"> <reference key="NSMenu" ref="963351320"/> @@ -1672,6 +1671,14 @@ </object> <int key="connectionID">645</int> </object> + <object class="IBConnectionRecord"> + <object class="IBActionConnection" key="connection"> + <string key="label">copyToFindPboard:</string> + <reference key="source" ref="1014"/> + <reference key="destination" ref="159080638"/> + </object> + <int key="connectionID">646</int> + </object> </object> <object class="IBMutableOrderedSet" key="objectRecords"> <object class="NSArray" key="orderedObjects"> @@ -2848,7 +2855,7 @@ <reference ref="9"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> - <string>{{484, 501}, {287, 263}}</string> + <string>{{167, 219}, {287, 263}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> <string>{{197, 734}, {243, 243}}</string> @@ -2882,7 +2889,7 @@ <reference ref="9"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> - <string>{{645, 481}, {241, 103}}</string> + <string>{{454, 199}, {241, 103}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> <string>{{608, 612}, {241, 103}}</string> @@ -2898,13 +2905,13 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> <string>{{525, 802}, {197, 73}}</string> - <string>{{-320, 383}, {1437, 20}}</string> + <string>{{-107, 482}, {1437, 20}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> <string>{74, 862}</string> <string>{{11, 977}, {478, 20}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{126, 170}, {383, 213}}</string> + <string>{{319, 221}, {383, 213}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>{{475, 832}, {234, 43}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -2951,7 +2958,7 @@ <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <reference ref="9"/> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> - <string>{{509, 130}, {279, 63}}</string> + <string>{{702, 181}, {279, 63}}</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> <string>com.apple.InterfaceBuilder.CocoaPlugin</string> @@ -3034,7 +3041,7 @@ </object> </object> <nil key="sourceID"/> - <int key="maxID">645</int> + <int key="maxID">646</int> </object> <object class="IBClassDescriber" key="IBDocument.Classes"> <object class="NSMutableArray" key="referencedPartialClassDescriptions"> @@ -3127,8 +3134,17 @@ <string key="className">FirstResponder</string> <string key="superclassName">NSObject</string> <object class="NSMutableDictionary" key="actions"> - <string key="NS.key.0">commandDispatch:</string> - <string key="NS.object.0">id</string> + <bool key="EncodedWithXMLCoder">YES</bool> + <object class="NSMutableArray" key="dict.sortedKeys"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>commandDispatch:</string> + <string>copyToFindPboard:</string> + </object> + <object class="NSMutableArray" key="dict.values"> + <bool key="EncodedWithXMLCoder">YES</bool> + <string>id</string> + <string>id</string> + </object> </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> <string key="majorKey">IBUserSource</string> @@ -3192,19 +3208,19 @@ <bool key="EncodedWithXMLCoder">YES</bool> <object class="NSMutableArray" key="dict.sortedKeys"> <bool key="EncodedWithXMLCoder">YES</bool> - <string>backgroundButton_</string> <string>closeButton_</string> <string>contextMenu_</string> <string>iconView_</string> <string>target_</string> + <string>titleView_</string> </object> <object class="NSMutableArray" key="dict.values"> <bool key="EncodedWithXMLCoder">YES</bool> <string>NSButton</string> - <string>NSButton</string> <string>NSMenu</string> <string>NSView</string> <string>id</string> + <string>NSTextField</string> </object> </object> <object class="IBClassDescriptionSource" key="sourceIdentifier"> diff --git a/chrome/browser/renderer_host/render_view_host.cc b/chrome/browser/renderer_host/render_view_host.cc index 2acd476..9253e87 100644 --- a/chrome/browser/renderer_host/render_view_host.cc +++ b/chrome/browser/renderer_host/render_view_host.cc @@ -534,6 +534,13 @@ void RenderViewHost::Copy() { Send(new ViewMsg_Copy(routing_id())); } +void RenderViewHost::CopyToFindPboard() { +#if defined(OS_MACOSX) + // Windows/Linux don't have the concept of a find pasteboard. + Send(new ViewMsg_CopyToFindPboard(routing_id())); +#endif +} + void RenderViewHost::Paste() { Send(new ViewMsg_Paste(routing_id())); } diff --git a/chrome/browser/renderer_host/render_view_host.h b/chrome/browser/renderer_host/render_view_host.h index e4b6332..3a1c273 100644 --- a/chrome/browser/renderer_host/render_view_host.h +++ b/chrome/browser/renderer_host/render_view_host.h @@ -269,6 +269,7 @@ class RenderViewHost : public RenderWidgetHost, void Redo(); void Cut(); void Copy(); + void CopyToFindPboard(); void Paste(); void Replace(const std::wstring& text); void ToggleSpellCheck(); diff --git a/chrome/browser/renderer_host/resource_message_filter.cc b/chrome/browser/renderer_host/resource_message_filter.cc index 1190fd3..095131f 100644 --- a/chrome/browser/renderer_host/resource_message_filter.cc +++ b/chrome/browser/renderer_host/resource_message_filter.cc @@ -323,6 +323,10 @@ bool ResourceMessageFilter::OnMessageReceived(const IPC::Message& msg) { OnClipboardReadAsciiText) IPC_MESSAGE_HANDLER_DELAY_REPLY(ViewHostMsg_ClipboardReadHTML, OnClipboardReadHTML) +#if defined(OS_MACOSX) + IPC_MESSAGE_HANDLER(ViewHostMsg_ClipboardFindPboardWriteStringAsync, + OnClipboardFindPboardWriteString) +#endif IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromExtension, OnGetMimeTypeFromExtension) IPC_MESSAGE_HANDLER(ViewHostMsg_GetMimeTypeFromFile, diff --git a/chrome/browser/renderer_host/resource_message_filter.h b/chrome/browser/renderer_host/resource_message_filter.h index 743b7f6..897e373 100644 --- a/chrome/browser/renderer_host/resource_message_filter.h +++ b/chrome/browser/renderer_host/resource_message_filter.h @@ -180,6 +180,9 @@ class ResourceMessageFilter : public IPC::ChannelProxy::MessageFilter, void OnClipboardReadText(Clipboard::Buffer buffer, IPC::Message* reply); void OnClipboardReadAsciiText(Clipboard::Buffer buffer, IPC::Message* reply); void OnClipboardReadHTML(Clipboard::Buffer buffer, IPC::Message* reply); +#if defined(OS_MACOSX) + void OnClipboardFindPboardWriteString(const string16& text); +#endif #if !defined(OS_MACOSX) // Not handled in the IO thread on Mac. diff --git a/chrome/browser/renderer_host/resource_message_filter_mac.mm b/chrome/browser/renderer_host/resource_message_filter_mac.mm new file mode 100644 index 0000000..b63c5bf --- /dev/null +++ b/chrome/browser/renderer_host/resource_message_filter_mac.mm @@ -0,0 +1,28 @@ +// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/renderer_host/resource_message_filter.h" + +#import <Cocoa/Cocoa.h> + +#include "base/sys_string_conversions.h" + +// The number of utf16 code units that will be written to the find pasteboard, +// longer texts are silently ignored. This is to prevent that a compromised +// renderer can write unlimited amounts of data into the find pasteboard. +static const size_t kMaxFindPboardStringLength = 4096; + +// Called on the IO thread. +void ResourceMessageFilter::OnClipboardFindPboardWriteString( + const string16& text) { + if (text.length() <= kMaxFindPboardStringLength) { + NSString* nsText = base::SysUTF16ToNSString(text); + if (nsText) { + NSPasteboard* findPboard = [NSPasteboard pasteboardWithName:NSFindPboard]; + [findPboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] + owner:nil]; + [findPboard setString:nsText forType:NSStringPboardType]; + } + } +} diff --git a/chrome/browser/tab_contents/tab_contents.cc b/chrome/browser/tab_contents/tab_contents.cc index 0e1673a..5d384ce 100644 --- a/chrome/browser/tab_contents/tab_contents.cc +++ b/chrome/browser/tab_contents/tab_contents.cc @@ -727,6 +727,10 @@ void TabContents::Copy() { render_view_host()->Copy(); } +void TabContents::CopyToFindPboard() { + render_view_host()->CopyToFindPboard(); +} + void TabContents::Paste() { render_view_host()->Paste(); } diff --git a/chrome/browser/tab_contents/tab_contents.h b/chrome/browser/tab_contents/tab_contents.h index 334c465..1d91cd5 100644 --- a/chrome/browser/tab_contents/tab_contents.h +++ b/chrome/browser/tab_contents/tab_contents.h @@ -317,6 +317,7 @@ class TabContents : public PageNavigator, // cut/copy/paste focus. (http://b/1117225) virtual void Cut(); virtual void Copy(); + virtual void CopyToFindPboard(); virtual void Paste(); // Called on a TabContents when it isn't a popup, but a new window. diff --git a/chrome/browser/tab_contents/tab_contents_view_mac.mm b/chrome/browser/tab_contents/tab_contents_view_mac.mm index ac7cded..96c1f6c 100644 --- a/chrome/browser/tab_contents/tab_contents_view_mac.mm +++ b/chrome/browser/tab_contents/tab_contents_view_mac.mm @@ -336,6 +336,10 @@ void TabContentsViewMac::Observe(NotificationType type, [self tabContents]->Copy(); } +- (void)copyToFindPboard:(id)sender { + [self tabContents]->CopyToFindPboard(); +} + - (void)paste:(id)sender { [self tabContents]->Paste(); } diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index bef409d..546c201 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -1724,6 +1724,7 @@ 'browser/renderer_host/resource_message_filter.cc', 'browser/renderer_host/resource_message_filter.h', 'browser/renderer_host/resource_message_filter_gtk.cc', + 'browser/renderer_host/resource_message_filter_mac.mm', 'browser/renderer_host/resource_message_filter_win.cc', 'browser/renderer_host/resource_request_details.h', 'browser/renderer_host/safe_browsing_resource_handler.cc', diff --git a/chrome/common/render_messages_internal.h b/chrome/common/render_messages_internal.h index 350bb83..6658624 100644 --- a/chrome/common/render_messages_internal.h +++ b/chrome/common/render_messages_internal.h @@ -193,6 +193,7 @@ IPC_BEGIN_MESSAGES(View) IPC_MESSAGE_ROUTED0(ViewMsg_Redo) IPC_MESSAGE_ROUTED0(ViewMsg_Cut) IPC_MESSAGE_ROUTED0(ViewMsg_Copy) + IPC_MESSAGE_ROUTED0(ViewMsg_CopyToFindPboard) IPC_MESSAGE_ROUTED0(ViewMsg_Paste) IPC_MESSAGE_ROUTED1(ViewMsg_Replace, std::wstring) IPC_MESSAGE_ROUTED0(ViewMsg_ToggleSpellCheck) @@ -1097,6 +1098,11 @@ IPC_BEGIN_MESSAGES(ViewHost) string16 /* markup */, GURL /* url */) +#if defined(OS_MACOSX) + IPC_MESSAGE_CONTROL1(ViewHostMsg_ClipboardFindPboardWriteStringAsync, + string16 /* text */) +#endif + #if defined(OS_WIN) // Request that the given font be loaded by the browser. // Please see ResourceMessageFilter::OnLoadFont for details. diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index af8ddbf..1da9696 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -356,6 +356,7 @@ void RenderView::OnMessageReceived(const IPC::Message& message) { IPC_MESSAGE_HANDLER(ViewMsg_Redo, OnRedo) IPC_MESSAGE_HANDLER(ViewMsg_Cut, OnCut) IPC_MESSAGE_HANDLER(ViewMsg_Copy, OnCopy) + IPC_MESSAGE_HANDLER(ViewMsg_CopyToFindPboard, OnCopyToFindPboard) IPC_MESSAGE_HANDLER(ViewMsg_Paste, OnPaste) IPC_MESSAGE_HANDLER(ViewMsg_Replace, OnReplace) IPC_MESSAGE_HANDLER(ViewMsg_ToggleSpellPanel, OnToggleSpellPanel) @@ -830,6 +831,22 @@ void RenderView::OnCopy() { UserMetricsRecordAction(L"Copy"); } +void RenderView::OnCopyToFindPboard() { + if (!webview()) + return; + + // Since the find pasteboard supports only plain text, this can be simpler + // than the |OnCopy()| case. + WebFrame* frame = webview()->GetFocusedFrame(); + if (frame->hasSelection()) { + string16 selection = frame->selectionAsText(); + RenderThread::current()->Send( + new ViewHostMsg_ClipboardFindPboardWriteStringAsync(selection)); + } + + UserMetricsRecordAction(L"CopyToFindPboard"); +} + void RenderView::OnPaste() { if (!webview()) return; diff --git a/chrome/renderer/render_view.h b/chrome/renderer/render_view.h index cac8ca8..4f9bc89 100644 --- a/chrome/renderer/render_view.h +++ b/chrome/renderer/render_view.h @@ -535,6 +535,7 @@ class RenderView : public RenderWidget, void OnRedo(); void OnCut(); void OnCopy(); + void OnCopyToFindPboard(); void OnPaste(); void OnReplace(const std::wstring& text); void OnAdvanceToNextMisspelling(); |