summaryrefslogtreecommitdiffstats
path: root/content/browser/renderer_host/text_input_client_mac.h
diff options
context:
space:
mode:
authoravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-12 16:45:32 +0000
committeravi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2011-09-12 16:45:32 +0000
commit86a7d3ca7f467269213f8ce08ab138bbed5326f2 (patch)
treeeae0402b5fc2109882d1596387febab0418d5bc5 /content/browser/renderer_host/text_input_client_mac.h
parentae1db5c0ef02b23f7e670eee09b2d06ec978a364 (diff)
downloadchromium_src-86a7d3ca7f467269213f8ce08ab138bbed5326f2.zip
chromium_src-86a7d3ca7f467269213f8ce08ab138bbed5326f2.tar.gz
chromium_src-86a7d3ca7f467269213f8ce08ab138bbed5326f2.tar.bz2
Move TextInputClient from chrome to content.
BUG=95573 TEST=dictionary popup still works Review URL: http://codereview.chromium.org/7844003 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@100703 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/browser/renderer_host/text_input_client_mac.h')
-rw-r--r--content/browser/renderer_host/text_input_client_mac.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/content/browser/renderer_host/text_input_client_mac.h b/content/browser/renderer_host/text_input_client_mac.h
new file mode 100644
index 0000000..00c67b8
--- /dev/null
+++ b/content/browser/renderer_host/text_input_client_mac.h
@@ -0,0 +1,86 @@
+// Copyright (c) 2011 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.
+
+#ifndef CONTENT_BROWSER_RENDERER_HOST_TEXT_INPUT_CLIENT_MAC_H_
+#define CONTENT_BROWSER_RENDERER_HOST_TEXT_INPUT_CLIENT_MAC_H_
+
+#import <Cocoa/Cocoa.h>
+
+#include "base/memory/scoped_nsobject.h"
+#include "base/synchronization/condition_variable.h"
+#include "base/synchronization/lock.h"
+#include "ui/gfx/point.h"
+
+template <typename T> struct DefaultSingletonTraits;
+
+class RenderWidgetHost;
+
+// This class helps with the Mac OS X dictionary popup. For the design overview,
+// look at this document:
+// http://dev.chromium.org/developers/design-documents/system-dictionary-pop-up-architecture
+//
+// This service is used to marshall information for these three methods that are
+// implemented in RenderWidgetHostViewMac:
+// -[NSTextInput characterIndexForPoint:]
+// -[NSTextInput attributedSubstringFromRange:]
+// -[NSTextInput firstRectForCharacterRange:]
+//
+// Because these methods are part of a synchronous system API, implementing them
+// requires getting information from the renderer synchronously. Rather than
+// using an actual sync IPC message, a normal async ViewMsg is used with a lock
+// and condition (managed by this service).
+class TextInputClientMac {
+ public:
+ // Returns the singleton instance.
+ static TextInputClientMac* GetInstance();
+
+ // Each of the three methods mentioned above has an associated pair of methods
+ // to get data from the renderer. The Get*() methods block the calling thread
+ // (always the UI thread) with a short timeout after the async message has
+ // been sent to the renderer to lookup the information needed to respond to
+ // the system. The Set*AndSignal() methods store the looked up information in
+ // this service and signal the condition to allow the Get*() methods to
+ // unlock and return that stored value.
+ //
+ // Returns NSNotFound if the request times out or is not completed.
+ NSUInteger GetCharacterIndexAtPoint(RenderWidgetHost* rwh, gfx::Point point);
+ // Returns nil if the request times out or is completed.
+ NSAttributedString* GetAttributedSubstringFromRange(RenderWidgetHost* rwh,
+ NSRange range);
+ // Returns NSZeroRect if the request times out or is not completed. The result
+ // is in WebKit coordinates.
+ NSRect GetFirstRectForRange(RenderWidgetHost* rwh, NSRange range);
+
+ // When the renderer sends the ViewHostMsg reply, the RenderMessageFilter will
+ // call the corresponding method on the IO thread to unlock the condition and
+ // allow the Get*() methods to continue/return.
+ void SetCharacterIndexAndSignal(NSUInteger index);
+ void SetFirstRectAndSignal(NSRect first_rect);
+ void SetSubstringAndSignal(NSAttributedString* string);
+
+ private:
+ friend struct DefaultSingletonTraits<TextInputClientMac>;
+ TextInputClientMac();
+ ~TextInputClientMac();
+
+ // The critical sections that the Condition guards are in Get*() methods.
+ // These methods lock the internal condition for use before the asynchronous
+ // message is sent to the renderer to lookup the required information. These
+ // are only used on the UI thread.
+ void BeforeRequest();
+ // Called at the end of a critical section. This will release the lock and
+ // condition.
+ void AfterRequest();
+
+ NSUInteger character_index_;
+ NSRect first_rect_;
+ scoped_nsobject<NSAttributedString> substring_;
+
+ base::Lock lock_;
+ base::ConditionVariable condition_;
+
+ DISALLOW_COPY_AND_ASSIGN(TextInputClientMac);
+};
+
+#endif // CONTENT_BROWSER_RENDERER_HOST_TEXT_INPUT_CLIENT_MAC_H_