Home | History | Annotate | Download | only in editing
      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 SpellChecker_h
     27 #define SpellChecker_h
     28 
     29 #include "core/dom/Element.h"
     30 #include "core/dom/Range.h"
     31 #include "core/platform/Timer.h"
     32 #include "core/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 WebCore {
     40 
     41 class Frame;
     42 class Node;
     43 class TextCheckerClient;
     44 class SpellChecker;
     45 
     46 class SpellCheckRequest : public TextCheckingRequest {
     47 public:
     48     static PassRefPtr<SpellCheckRequest> create(TextCheckingTypeMask, TextCheckingProcessType, PassRefPtr<Range> checkingRange, PassRefPtr<Range> paragraphRange);
     49     virtual ~SpellCheckRequest();
     50 
     51     PassRefPtr<Range> checkingRange() const { return m_checkingRange; }
     52     PassRefPtr<Range> paragraphRange() const { return m_paragraphRange; }
     53     PassRefPtr<Element> rootEditableElement() const { return m_rootEditableElement; }
     54 
     55     void setCheckerAndSequence(SpellChecker*, int sequence);
     56     void requesterDestroyed();
     57     bool isStarted() const { return m_checker; }
     58 
     59     virtual const TextCheckingRequestData& data() const OVERRIDE;
     60     virtual void didSucceed(const Vector<TextCheckingResult>&) OVERRIDE;
     61     virtual void didCancel() OVERRIDE;
     62 
     63 private:
     64     SpellCheckRequest(PassRefPtr<Range> checkingRange, PassRefPtr<Range> paragraphRange, const String&, TextCheckingTypeMask, TextCheckingProcessType, const Vector<uint32_t>& documentMarkersInRange, const Vector<unsigned>& documentMarkerOffsets);
     65 
     66     SpellChecker* m_checker;
     67     RefPtr<Range> m_checkingRange;
     68     RefPtr<Range> m_paragraphRange;
     69     RefPtr<Element> m_rootEditableElement;
     70     TextCheckingRequestData m_requestData;
     71 };
     72 
     73 class SpellChecker {
     74     WTF_MAKE_NONCOPYABLE(SpellChecker); WTF_MAKE_FAST_ALLOCATED;
     75 public:
     76     friend class SpellCheckRequest;
     77 
     78     explicit SpellChecker(Frame*);
     79     ~SpellChecker();
     80 
     81     bool isAsynchronousEnabled() const;
     82     bool isCheckable(Range*) const;
     83 
     84     void requestCheckingFor(PassRefPtr<SpellCheckRequest>);
     85     void cancelCheck();
     86 
     87     int lastRequestSequence() const
     88     {
     89         return m_lastRequestSequence;
     90     }
     91 
     92     int lastProcessedSequence() const
     93     {
     94         return m_lastProcessedSequence;
     95     }
     96 
     97 private:
     98     typedef Deque<RefPtr<SpellCheckRequest> > RequestQueue;
     99 
    100     bool canCheckAsynchronously(Range*) const;
    101     TextCheckerClient* client() const;
    102     void timerFiredToProcessQueuedRequest(Timer<SpellChecker>*);
    103     void invokeRequest(PassRefPtr<SpellCheckRequest>);
    104     void enqueueRequest(PassRefPtr<SpellCheckRequest>);
    105     void didCheckSucceed(int sequence, const Vector<TextCheckingResult>&);
    106     void didCheckCancel(int sequence);
    107     void didCheck(int sequence, const Vector<TextCheckingResult>&);
    108 
    109     Frame* m_frame;
    110     int m_lastRequestSequence;
    111     int m_lastProcessedSequence;
    112 
    113     Timer<SpellChecker> m_timerToProcessQueuedRequest;
    114 
    115     RefPtr<SpellCheckRequest> m_processingRequest;
    116     RequestQueue m_requestQueue;
    117 };
    118 
    119 } // namespace WebCore
    120 
    121 #endif // SpellChecker_h
    122