1 /* 2 * Copyright (C) 2010 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26 #ifndef SpellCheckRequester_h 27 #define SpellCheckRequester_h 28 29 #include "core/dom/Element.h" 30 #include "core/dom/Range.h" 31 #include "platform/Timer.h" 32 #include "platform/text/TextChecking.h" 33 #include "wtf/Deque.h" 34 #include "wtf/Noncopyable.h" 35 #include "wtf/RefPtr.h" 36 #include "wtf/Vector.h" 37 #include "wtf/text/WTFString.h" 38 39 namespace blink { 40 41 class LocalFrame; 42 class SpellCheckRequester; 43 class TextCheckerClient; 44 45 class SpellCheckRequest FINAL : public TextCheckingRequest { 46 public: 47 static PassRefPtrWillBeRawPtr<SpellCheckRequest> create(TextCheckingTypeMask, TextCheckingProcessType, PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange, int requestNumber = 0); 48 virtual ~SpellCheckRequest(); 49 50 PassRefPtrWillBeRawPtr<Range> checkingRange() const { return m_checkingRange; } 51 PassRefPtrWillBeRawPtr<Range> paragraphRange() const { return m_paragraphRange; } 52 PassRefPtrWillBeRawPtr<Element> rootEditableElement() const { return m_rootEditableElement; } 53 54 void setCheckerAndSequence(SpellCheckRequester*, int sequence); 55 #if !ENABLE(OILPAN) 56 void requesterDestroyed(); 57 #endif 58 59 virtual const TextCheckingRequestData& data() const OVERRIDE; 60 virtual void didSucceed(const Vector<TextCheckingResult>&) OVERRIDE; 61 virtual void didCancel() OVERRIDE; 62 63 int requestNumber() const { return m_requestNumber; } 64 65 virtual void trace(Visitor*) OVERRIDE; 66 67 private: 68 SpellCheckRequest(PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange, const String&, TextCheckingTypeMask, TextCheckingProcessType, const Vector<uint32_t>& documentMarkersInRange, const Vector<unsigned>& documentMarkerOffsets, int requestNumber); 69 70 RawPtrWillBeMember<SpellCheckRequester> m_requester; 71 RefPtrWillBeMember<Range> m_checkingRange; 72 RefPtrWillBeMember<Range> m_paragraphRange; 73 RefPtrWillBeMember<Element> m_rootEditableElement; 74 TextCheckingRequestData m_requestData; 75 int m_requestNumber; 76 }; 77 78 class SpellCheckRequester FINAL : public NoBaseWillBeGarbageCollectedFinalized<SpellCheckRequester> { 79 WTF_MAKE_NONCOPYABLE(SpellCheckRequester); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED; 80 public: 81 static PassOwnPtrWillBeRawPtr<SpellCheckRequester> create(LocalFrame& frame) 82 { 83 return adoptPtrWillBeNoop(new SpellCheckRequester(frame)); 84 } 85 86 ~SpellCheckRequester(); 87 void trace(Visitor*); 88 89 bool isAsynchronousEnabled() const; 90 bool isCheckable(Range*) const; 91 92 void requestCheckingFor(PassRefPtrWillBeRawPtr<SpellCheckRequest>); 93 void cancelCheck(); 94 95 int lastRequestSequence() const 96 { 97 return m_lastRequestSequence; 98 } 99 100 int lastProcessedSequence() const 101 { 102 return m_lastProcessedSequence; 103 } 104 105 private: 106 friend class SpellCheckRequest; 107 108 explicit SpellCheckRequester(LocalFrame&); 109 110 bool canCheckAsynchronously(Range*) const; 111 TextCheckerClient& client() const; 112 void timerFiredToProcessQueuedRequest(Timer<SpellCheckRequester>*); 113 void invokeRequest(PassRefPtrWillBeRawPtr<SpellCheckRequest>); 114 void enqueueRequest(PassRefPtrWillBeRawPtr<SpellCheckRequest>); 115 void didCheckSucceed(int sequence, const Vector<TextCheckingResult>&); 116 void didCheckCancel(int sequence); 117 void didCheck(int sequence, const Vector<TextCheckingResult>&); 118 119 RawPtrWillBeMember<LocalFrame> m_frame; 120 LocalFrame& frame() const 121 { 122 ASSERT(m_frame); 123 return *m_frame; 124 } 125 126 int m_lastRequestSequence; 127 int m_lastProcessedSequence; 128 129 Timer<SpellCheckRequester> m_timerToProcessQueuedRequest; 130 131 RefPtrWillBeMember<SpellCheckRequest> m_processingRequest; 132 133 typedef WillBeHeapDeque<RefPtrWillBeMember<SpellCheckRequest> > RequestQueue; 134 RequestQueue m_requestQueue; 135 }; 136 137 } // namespace blink 138 139 #endif // SpellCheckRequester_h 140