| Index: chrome/browser/renderer_host/text_input_client_mac.h
|
| diff --git a/chrome/browser/renderer_host/text_input_client_mac.h b/chrome/browser/renderer_host/text_input_client_mac.h
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..57a37c88aa1d963ae598e55a63f63ae6c8586da6
|
| --- /dev/null
|
| +++ b/chrome/browser/renderer_host/text_input_client_mac.h
|
| @@ -0,0 +1,82 @@
|
| +// 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 CHROME_BROWSER_RENDERER_HOST_TEXT_INPUT_CLIENT_MAC_H_
|
| +#define CHROME_BROWSER_RENDERER_HOST_TEXT_INPUT_CLIENT_MAC_H_
|
| +
|
| +#import <Cocoa/Cocoa.h>
|
| +
|
| +#include "base/scoped_nsobject.h"
|
| +#include "base/synchronization/condition_variable.h"
|
| +#include "base/synchronization/lock.h"
|
| +
|
| +template <typename T> struct DefaultSingletonTraits;
|
| +
|
| +// 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();
|
| +
|
| + // The critical sections that the Condition guards are in RWHVM, specifically
|
| + // three methods that are part of the NSTextInput protocol that the dictionary
|
| + // service uses to display the popup. 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();
|
| +
|
| + // Each of the three methods mentioned above has an associated pair of methods
|
| + // to get data from the renderer. The Wait*() 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 Wait*() methods to
|
| + // unlock and return that stored value.
|
| + //
|
| + // Returns NSNotFound if the request times out or is not completed.
|
| + NSUInteger WaitForCharacterIndex();
|
| + // Returns nil if the request times out or is completed.
|
| + NSAttributedString* WaitForSubstring();
|
| + // Returns NSZeroRect if the request times out or is not completed. The result
|
| + // is in WebKit coordinates.
|
| + NSRect WaitForFirstRect();
|
| +
|
| + // 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 Wait*() methods to continue/return.
|
| + void SetCharacterIndexAndSignal(NSUInteger index);
|
| + void SetFirstRectAndSignal(NSRect first_rect);
|
| + void SetSubstringAndSignal(NSAttributedString* string);
|
| +
|
| + private:
|
| + friend struct DefaultSingletonTraits<TextInputClientMac>;
|
| + TextInputClientMac();
|
| +
|
| + NSUInteger character_index_;
|
| + NSRect first_rect_;
|
| + scoped_nsobject<NSAttributedString> substring_;
|
| +
|
| + base::Lock lock_;
|
| + base::ConditionVariable condition_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TextInputClientMac);
|
| +};
|
| +
|
| +#endif // CHROME_BROWSER_RENDERER_HOST_TEXT_INPUT_CLIENT_MAC_H_
|
|
|