diff options
author | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-12 16:45:32 +0000 |
---|---|---|
committer | avi@chromium.org <avi@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2011-09-12 16:45:32 +0000 |
commit | 86a7d3ca7f467269213f8ce08ab138bbed5326f2 (patch) | |
tree | eae0402b5fc2109882d1596387febab0418d5bc5 /content/browser/renderer_host/text_input_client_mac.h | |
parent | ae1db5c0ef02b23f7e670eee09b2d06ec978a364 (diff) | |
download | chromium_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.h | 86 |
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_ |