Home | History | Annotate | Download | only in nav
      1 /*
      2  * Copyright 2007, The Android Open Source Project
      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  *  * Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  *  * 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 THE COPYRIGHT HOLDERS ``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 THE COPYRIGHT OWNER 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 CachedRoot_H
     27 #define CachedRoot_H
     28 
     29 #include "CachedFrame.h"
     30 #include "IntRect.h"
     31 #include "SkPicture.h"
     32 #include "SkRegion.h"
     33 #include "wtf/Vector.h"
     34 
     35 class SkRect;
     36 
     37 namespace WebCore {
     38     class LayerAndroid;
     39 }
     40 
     41 namespace android {
     42 
     43 class CachedHistory;
     44 class CachedNode;
     45 class FindCanvas;
     46 
     47 class CachedRoot : public CachedFrame {
     48 public:
     49     bool adjustForScroll(BestData* , Direction , WebCore::IntPoint* scrollPtr,
     50         bool findClosest);
     51     const SkRegion& baseUncovered() const { return mBaseUncovered; }
     52     int checkForCenter(int x, int y) const;
     53     void checkForJiggle(int* ) const;
     54     bool checkRings(SkPicture* , const WTF::Vector<WebCore::IntRect>& rings,
     55         const WebCore::IntRect& bounds) const;
     56     WebCore::IntPoint cursorLocation() const;
     57     int documentHeight() { return mContents.height(); }
     58     int documentWidth() { return mContents.width(); }
     59     void draw(FindCanvas& ) const;
     60     const CachedNode* findAt(const WebCore::IntRect& , const CachedFrame** ,
     61         int* x, int* y, bool checkForHidden) const;
     62     const WebCore::IntRect& focusBounds() const { return mFocusBounds; }
     63     WebCore::IntPoint focusLocation() const;
     64     int getAndResetSelectionEnd();
     65     int getAndResetSelectionStart();
     66     int getBlockLeftEdge(int x, int y, float scale) const;
     67     void getSimulatedMousePosition(WebCore::IntPoint* ) const;
     68     void init(WebCore::Frame* , CachedHistory* );
     69     bool innerDown(const CachedNode* , BestData* ) const;
     70     bool innerLeft(const CachedNode* , BestData* ) const;
     71     void innerMove(const CachedNode* ,BestData* bestData, Direction ,
     72         WebCore::IntPoint* scroll, bool firstCall);
     73     bool innerRight(const CachedNode* , BestData* ) const;
     74     bool innerUp(const CachedNode* , BestData* ) const;
     75     WebCore::String imageURI(int x, int y) const;
     76     bool maskIfHidden(BestData* ) const;
     77     const CachedNode* moveCursor(Direction , const CachedFrame** , WebCore::IntPoint* scroll);
     78     /**
     79      * Find the next textfield/textarea
     80      * @param start         The textfield/textarea to search from.
     81      * @param framePtr      If non-zero, returns CachedFrame* containing result.
     82      * @return CachedNode*  Next textfield/textarea or null (0) if none.
     83      */
     84     const CachedNode* nextTextField(const CachedNode* start,
     85         const CachedFrame** framePtr) const;
     86     SkPicture* pictureAt(int x, int y) const;
     87     void reset();
     88     CachedHistory* rootHistory() const { return mHistory; }
     89     const WebCore::LayerAndroid* rootLayer() const { return mRootLayer; }
     90     bool scrollDelta(WebCore::IntRect& cursorRingBounds, Direction , int* delta);
     91     const WebCore::IntRect& scrolledBounds() const { return mScrolledBounds; }
     92     void setCursor(CachedFrame* , CachedNode* );
     93     void setCursorCache(int scrollX, int scrollY) const; // compute cached state used to find next cursor
     94     void setCachedFocus(CachedFrame* , CachedNode* );
     95     void setFocusBounds(const WebCore::IntRect& r) { mFocusBounds = r; }
     96     void setTextGeneration(int textGeneration) { mTextGeneration = textGeneration; }
     97     void setMaxScroll(int x, int y) { mMaxXScroll = x; mMaxYScroll = y; }
     98     void setPicture(SkPicture* picture) { mPicture = picture; }
     99     void setRootLayer(WebCore::LayerAndroid* layer) { mRootLayer = layer; }
    100     void setScrollOnly(bool state) { mScrollOnly = state; }
    101     void setSelection(int start, int end) { mSelectionStart = start; mSelectionEnd = end; }
    102     void setupScrolledBounds() const { mScrolledBounds = mViewBounds; }
    103     void setVisibleRect(const WebCore::IntRect& r) { mViewBounds = r; }
    104     int textGeneration() const { return mTextGeneration; }
    105     int width() const { return mPicture ? mPicture->width() : 0; }
    106 private:
    107     friend class CachedFrame;
    108     CachedHistory* mHistory;
    109     SkPicture* mPicture;
    110     WebCore::LayerAndroid* mRootLayer;
    111     WebCore::IntRect mFocusBounds; // dom text input focus node bounds
    112     mutable WebCore::IntRect mScrolledBounds; // view bounds + amount visible as result of scroll
    113     int mTextGeneration;
    114     int mMaxXScroll;
    115     int mMaxYScroll;
    116     // These two are ONLY used when the tree is rebuilt and the focus is a textfield/area
    117     int mSelectionStart;
    118     int mSelectionEnd;
    119     // these four set up as cache for use by frameDown/Up/Left/Right etc
    120     mutable WebCore::IntRect mCursorBounds;
    121     mutable const CachedNode* mCursor;
    122     mutable SkRegion mBaseUncovered;
    123     bool mScrollOnly;
    124 #if DUMP_NAV_CACHE
    125 public:
    126     class Debug {
    127 public:
    128         CachedRoot* base() const;
    129         void print() const;
    130     } mDebug;
    131 #endif
    132 };
    133 
    134 }
    135 
    136 #endif
    137