summaryrefslogtreecommitdiffstats
path: root/WebKit/android/nav/CachedNode.h
diff options
context:
space:
mode:
authorCary Clark <cary@android.com>2010-01-27 17:00:54 -0500
committerCary Clark <cary@android.com>2010-02-17 13:13:54 -0500
commitf4cefb9302ee62602c19cdfbdb6cc1fbdf540953 (patch)
tree26eb246c8427d0fe96326d32ae7f30bf8ec80c82 /WebKit/android/nav/CachedNode.h
parent441d8e9da254d840927752354b40a3b160d3ce68 (diff)
downloadexternal_webkit-f4cefb9302ee62602c19cdfbdb6cc1fbdf540953.zip
external_webkit-f4cefb9302ee62602c19cdfbdb6cc1fbdf540953.tar.gz
external_webkit-f4cefb9302ee62602c19cdfbdb6cc1fbdf540953.tar.bz2
Add UI considerations to layers
companion fix is in framework/base With fixed layers, parts of the web page are now in motion relative to the document when the page scrolls. Many routines that formerly read static coordinates need to compute locations. In some cases, new computations are cached for speed -- for instance, the current cursor position is cached when it is frequently compared. The cursor rings and other drawing elements like finding text on the page now to be drawn in the correct order so that they appear both under and over layers. There's quite a bit more work to be done. Major pieces are drawing the text selection in the correct order, and computing locations based on nest layers. With this checkin, only the position of the child- most layer is considered when computing bounds. http://b/2369549 JavaScriptCore/wtf/Platform.h - Turn compositing on. All routines that reference LayerAndroid are bracketed by this condition. WebCore/platform/graphics/android/LayerAndroid.h WebCore/platform/graphics/android/LayerAndroid.cpp - Add a unique id to each layer. The unique id is used to associate a layer created when the DOM is parsed in the webkit thread with its copy in the UI thread. - Add: draw the text found on the page, as a call out in the primary draw. The call out must follow the drawing the layers' contents to show the found text correctly. Note that this adds a new slot with identical contents in every child LayerAndroid. In a future optimization, a RootLayerAndroid could hold data common for all child layers. - Add: clipArea(), which returns an array of rectangles describing the clip for this LayerAndroid and its children. Generally, this is the part of the webpage which is covered by one or more fixed layers. - Add: find(FloatPoint) that returns the deepest layer that contains this point. This is used to match taps to the layer that is tapped on. - Add: draw all layer pictures and identify which layer is being drawn. This is used to analyze the picture contents for finding and selecting text. - Add: find the layer that matches a given id; this is used to map cached DOM node data back to the layer that contains it. - Fix up includes, delete unused interfaces WebKit/android/jni/WebViewCore.h WebKit/android/jni/WebViewCore.cpp - Remove local mRootLayer; use the one in WebView.cpp instead (which is in sync with WebView.java) WebKit/Android.mk WebKit/android/nav/CachedLayer.h WebKit/android/nav/CachedLayer.cpp - CacheLayer associates the cached node with the LayerAndroid instance. It contains the index to the node in the cached frame, the LayerAndroid's unique id, and the spacial offset of the node within the layer when the DOM information was captured. It also caches a pointer to the LayerAndroid instance. CacheLayer computes the node's location each time it is called, since the fixed layer may be constantly moving relative to the document's coordinates. WebKit/android/nav/CacheBuilder.h WebKit/android/nav/CacheBuilder.cpp - Track the active layer while building the nav cache. The 'Tracker' structs were refactored to share common code, and a new 'LayerTracker' struct identifies when the node walker is inside a layer. - Added code to dump layer information for debugging. - Note that CachedNode::cursorRingsPtr can only be called during nav data construction - The cache builder can limit or exclude nodes that are clipped out -- but until I have more understanding of layer clipping, treat contained nodes as unclipped. WebKit/android/nav/CachedDebug.h - Add a variant that can dump either to a log file or the console including the function it was dumped from. WebKit/android/nav/CachedFrame.h WebKit/android/nav/CachedFrame.cpp - Add an array of CacheLayer instances. - Protect bounds from direct access since they must always be computed. - Remove misnamed focus parameter from many routines since the cursor node can be read from the root frame. - Add: adjustBounds(), which computes the bounds as the layer moves. - Add: checkRings(), which gets the appropriate picture for the node. - Remove disabled code - Find the layer list for the matching node by using a binary search - Add: resetLayers() to reset the LayerAndroid pointer in CachedLayers when the layer world changes. WebKit/android/nav/CachedHistory.h WebKit/android/nav/CachedHistory.cpp - Update history data to have matching frame and node WebKit/android/nav/CachedNode.h WebKit/android/nav/CachedNode.cpp - Refactor functions that directly read coordinates to compute them. In some cases, pass the frame in so that the layer coordinates can be found. - Add a bit to note that the node belongs to a layer. - Remove duplicate bounds interfaces. - Add methods to get cursor ring data at runtime. - Update debugging info. WebKit/android/nav/CachedRoot.h WebKit/android/nav/CachedRoot.cpp - Isolate direct picture access so that the layer picture can be returned. - Add knowledge of how the base is covered by layers. - Add a pointer to the root LayerAndroid. - delete disabled code. - Move the cursor ring into view if it is obscured by a layer (this isn't totally working) - Before finding the next node to move to, set up 'cursor cache' data, including the visible picture. WebKit/android/nav/FindCanvas.h WebKit/android/nav/FindCanvas.cpp - Move find code here so that it can be called from layers. WebKit/android/nav/WebView.cpp - Add java interface to get viewport metrics on demand. - Pass frame with the node. - Remove the find on page code (now in FindCanvas). - Compute focus rings instead of reading them directly. - Transfer layer id when getting new nav cache. - Set up root LayerAndroid. - Add utility to track if cursor is in a layer. - Simplify drawLayers() to use common view metrics.
Diffstat (limited to 'WebKit/android/nav/CachedNode.h')
-rw-r--r--WebKit/android/nav/CachedNode.h28
1 files changed, 17 insertions, 11 deletions
diff --git a/WebKit/android/nav/CachedNode.h b/WebKit/android/nav/CachedNode.h
index a433a47..825eab7 100644
--- a/WebKit/android/nav/CachedNode.h
+++ b/WebKit/android/nav/CachedNode.h
@@ -33,6 +33,8 @@
#include "PlatformString.h"
#include "wtf/Vector.h"
+class SkPicture;
+
namespace WebCore {
class Node;
}
@@ -77,6 +79,7 @@ public:
NOT_CURSOR_NODE,
OUTSIDE_OF_BEST, // containership
OUTSIDE_OF_ORIGINAL, // containership
+ UNDER_LAYER,
CONDITION_SIZE // FIXME: test that CONDITION_SIZE fits in mCondition
};
CachedNode() {
@@ -84,8 +87,8 @@ public:
// constructor
}
- const WebCore::IntRect& bounds() const { return mBounds; }
- WebCore::IntRect* boundsPtr() { return &mBounds; }
+ WebCore::IntRect bounds(const CachedFrame* ) const;
+ WebCore::IntRect* boundsPtr() { return &mBounds; } // CacheBuilder only
int childFrameIndex() const { return isFrame() ? mDataIndex : -1; }
void clearCondition() const { mCondition = NOT_REJECTED; }
void clearCursor(CachedFrame* );
@@ -93,19 +96,18 @@ public:
WTF::Vector<WebCore::IntRect>* rings);
bool clip(const WebCore::IntRect& );
bool clippedOut() { return mClippedOut; }
- void cursorRingBounds(WebCore::IntRect* ) const;
- WTF::Vector<WebCore::IntRect>& cursorRings() { return mCursorRing; }
- const WTF::Vector<WebCore::IntRect>& cursorRings() const { return mCursorRing; }
+ WebCore::IntRect cursorRingBounds(const CachedFrame* ) const;
+ // cursorRingsPtr() only for CacheBuilder since it points to raw data
+ WTF::Vector<WebCore::IntRect>* cursorRingsPtr() { return &mCursorRing; }
+ void cursorRings(const CachedFrame* , WTF::Vector<WebCore::IntRect>* ) const;
bool disabled() const { return mDisabled; }
const CachedNode* document() const { return &this[-mIndex]; }
- void fixUpCursorRects(const CachedRoot* root);
- const WebCore::IntRect& getBounds() const { return mBounds; }
- void getBounds(WebCore::IntRect* bounds) const { *bounds = mBounds; }
+ void fixUpCursorRects(const CachedFrame* frame);
const WebCore::String& getExport() const { return mExport; }
bool hasCursorRing() const { return mHasCursorRing; }
bool hasMouseOver() const { return mHasMouseOver; }
void hideCursor(CachedFrame* );
- const WebCore::IntRect& hitBounds() const { return mHitBounds; }
+ WebCore::IntRect hitBounds(const CachedFrame* ) const;
int index() const { return mIndex; }
void init(WebCore::Node* node);
bool isAnchor() const { return mType == ANCHOR_CACHEDNODETYPE; }
@@ -114,8 +116,9 @@ public:
bool isFocus() const { return mIsFocus; }
bool isFrame() const { return mType == FRAME_CACHEDNODETYPE; }
bool isHidden() const { return mIsHidden; }
- bool isNavable(const WebCore::IntRect& clip) const {
- return clip.intersects(mBounds);
+ bool isInLayer() const { return mIsInLayer; }
+ bool isNavable(const CachedFrame* frame, const WebCore::IntRect& clip) const {
+ return clip.intersects(bounds(frame));
}
bool isPlugin() const { return mType == PLUGIN_CACHEDNODETYPE; }
bool isSyntheticLink() const {
@@ -136,6 +139,7 @@ public:
int parentIndex() const { return mParentIndex; }
bool partRectsContains(const CachedNode* other) const;
void reset();
+ WebCore::IntRect ring(const CachedFrame* , size_t part) const;
void setBounds(const WebCore::IntRect& bounds) { mBounds = bounds; }
void setClippedOut(bool clipped) { mClippedOut = clipped; }
void setCondition(Condition condition) const { mCondition = condition; }
@@ -150,6 +154,7 @@ public:
void setIndex(int index) { mIndex = index; }
void setIsCursor(bool isCursor) { mIsCursor = isCursor; }
void setIsFocus(bool isFocus) { mIsFocus = isFocus; }
+ void setIsInLayer(bool isInLayer) { mIsInLayer = isInLayer; }
void setIsParentAnchor(bool isAnchor) { mIsParentAnchor = isAnchor; }
void setIsTransparent(bool isTransparent) { mIsTransparent = isTransparent; }
void setIsUnclipped(bool unclipped) { mIsUnclipped = unclipped; }
@@ -189,6 +194,7 @@ private:
bool mIsCursor : 1;
bool mIsFocus : 1;
bool mIsHidden : 1;
+ bool mIsInLayer : 1;
bool mIsParentAnchor : 1;
bool mIsTransparent : 1;
bool mIsUnclipped : 1;