13c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch/*
23c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * Copyright (C) 2010 Google Inc. All rights reserved.
33c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch *
43c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * Redistribution and use in source and binary forms, with or without
53c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * modification, are permitted provided that the following conditions
63c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * are met:
73c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * 1. Redistributions of source code must retain the above copyright
83c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch *    notice, this list of conditions and the following disclaimer.
93c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
103c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
113c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch *    documentation and/or other materials provided with the distribution.
123c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch *
133c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
143c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
153c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
163c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
193c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
203c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
213c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
223c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
233c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
243c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch */
253c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
263c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#ifndef SpellCheckRequester_h
273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#define SpellCheckRequester_h
283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
293c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/dom/Element.h"
303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "core/dom/Range.h"
311e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/Timer.h"
321e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/text/TextChecking.h"
333c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/Deque.h"
343c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/Noncopyable.h"
353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/RefPtr.h"
363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/Vector.h"
373c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#include "wtf/text/WTFString.h"
383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
39c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
403c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
41d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class LocalFrame;
42e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)class SpellCheckRequester;
433c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochclass TextCheckerClient;
443c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
4509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)class SpellCheckRequest FINAL : public TextCheckingRequest {
463c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochpublic:
477242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static PassRefPtrWillBeRawPtr<SpellCheckRequest> create(TextCheckingTypeMask, TextCheckingProcessType, PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange, int requestNumber = 0);
483c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    virtual ~SpellCheckRequest();
493c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
50a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> checkingRange() const { return m_checkingRange; }
51a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    PassRefPtrWillBeRawPtr<Range> paragraphRange() const { return m_paragraphRange; }
52f6b7aed3f7ce69aca0d7a032d144cbd088b04393Torne (Richard Coles)    PassRefPtrWillBeRawPtr<Element> rootEditableElement() const { return m_rootEditableElement; }
533c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
54e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void setCheckerAndSequence(SpellCheckRequester*, int sequence);
557242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if !ENABLE(OILPAN)
563c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void requesterDestroyed();
577242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif
583c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
593c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    virtual const TextCheckingRequestData& data() const OVERRIDE;
603c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    virtual void didSucceed(const Vector<TextCheckingResult>&) OVERRIDE;
613c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    virtual void didCancel() OVERRIDE;
623c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
63e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int requestNumber() const { return m_requestNumber; }
64e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)
657242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    virtual void trace(Visitor*) OVERRIDE;
667242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
673c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochprivate:
68a9984bf9ddc3cf73fdae3f29134a2bab379e7029Ben Murdoch    SpellCheckRequest(PassRefPtrWillBeRawPtr<Range> checkingRange, PassRefPtrWillBeRawPtr<Range> paragraphRange, const String&, TextCheckingTypeMask, TextCheckingProcessType, const Vector<uint32_t>& documentMarkersInRange, const Vector<unsigned>& documentMarkerOffsets, int requestNumber);
693c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
707242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RawPtrWillBeMember<SpellCheckRequester> m_requester;
717242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeMember<Range> m_checkingRange;
727242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeMember<Range> m_paragraphRange;
737242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeMember<Element> m_rootEditableElement;
743c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    TextCheckingRequestData m_requestData;
75e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    int m_requestNumber;
763c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch};
773c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
787242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucciclass SpellCheckRequester FINAL : public NoBaseWillBeGarbageCollectedFinalized<SpellCheckRequester> {
797242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    WTF_MAKE_NONCOPYABLE(SpellCheckRequester); WTF_MAKE_FAST_ALLOCATED_WILL_BE_REMOVED;
803c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochpublic:
817242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    static PassOwnPtrWillBeRawPtr<SpellCheckRequester> create(LocalFrame& frame)
827242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
837242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return adoptPtrWillBeNoop(new SpellCheckRequester(frame));
847242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
853c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
86e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    ~SpellCheckRequester();
877242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void trace(Visitor*);
883c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
893c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool isAsynchronousEnabled() const;
903c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool isCheckable(Range*) const;
913c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
927242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void requestCheckingFor(PassRefPtrWillBeRawPtr<SpellCheckRequest>);
933c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void cancelCheck();
943c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
953c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    int lastRequestSequence() const
963c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    {
973c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        return m_lastRequestSequence;
983c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    }
993c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1003c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    int lastProcessedSequence() const
1013c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    {
1023c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch        return m_lastProcessedSequence;
1033c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    }
1043c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1053c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdochprivate:
1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    friend class SpellCheckRequest;
1077242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    explicit SpellCheckRequester(LocalFrame&);
1093c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1103c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    bool canCheckAsynchronously(Range*) const;
111e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    TextCheckerClient& client() const;
112e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    void timerFiredToProcessQueuedRequest(Timer<SpellCheckRequester>*);
1137242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void invokeRequest(PassRefPtrWillBeRawPtr<SpellCheckRequest>);
1147242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    void enqueueRequest(PassRefPtrWillBeRawPtr<SpellCheckRequest>);
1153c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void didCheckSucceed(int sequence, const Vector<TextCheckingResult>&);
1163c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void didCheckCancel(int sequence);
1173c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    void didCheck(int sequence, const Vector<TextCheckingResult>&);
1183c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1197242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RawPtrWillBeMember<LocalFrame> m_frame;
1207242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    LocalFrame& frame() const
1217242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    {
1227242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        ASSERT(m_frame);
1237242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci        return *m_frame;
1247242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    }
1257242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1263c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    int m_lastRequestSequence;
1273c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    int m_lastProcessedSequence;
1283c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
129e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles)    Timer<SpellCheckRequester> m_timerToProcessQueuedRequest;
1303c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1317242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    RefPtrWillBeMember<SpellCheckRequest> m_processingRequest;
1327242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci
1337242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci    typedef WillBeHeapDeque<RefPtrWillBeMember<SpellCheckRequest> > RequestQueue;
1343c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch    RequestQueue m_requestQueue;
1353c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch};
1363c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
137c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
1383c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch
1393c9e4aeaee9f9b0a9a814da07bcb33319c7ea363Ben Murdoch#endif // SpellCheckRequester_h
140