summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-12 07:30:35 +0000
committerthakis@chromium.org <thakis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-09-12 07:30:35 +0000
commita954bf7d89777070fa9980d6692e3787dd61e26f (patch)
tree31a0b26e4f0abfbe45437127d9f9703b5ceb6960
parent8e5722d2311e0a91cca92692c012e64bb01fb2cf (diff)
downloadchromium_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.xib40
-rw-r--r--chrome/browser/renderer_host/render_view_host.cc7
-rw-r--r--chrome/browser/renderer_host/render_view_host.h1
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.cc4
-rw-r--r--chrome/browser/renderer_host/resource_message_filter.h3
-rw-r--r--chrome/browser/renderer_host/resource_message_filter_mac.mm28
-rw-r--r--chrome/browser/tab_contents/tab_contents.cc4
-rw-r--r--chrome/browser/tab_contents/tab_contents.h1
-rw-r--r--chrome/browser/tab_contents/tab_contents_view_mac.mm4
-rw-r--r--chrome/chrome.gyp1
-rw-r--r--chrome/common/render_messages_internal.h6
-rw-r--r--chrome/renderer/render_view.cc17
-rw-r--r--chrome/renderer/render_view.h1
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();