Home | History | Annotate | Download | only in jni
      1 /*
      2  * Copyright 2006, 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 WebViewCore_h
     27 #define WebViewCore_h
     28 
     29 #include "CacheBuilder.h"
     30 #include "CachedHistory.h"
     31 #include "DeviceMotionAndOrientationManager.h"
     32 #include "DOMSelection.h"
     33 #include "FileChooser.h"
     34 #include "PictureSet.h"
     35 #include "PlatformGraphicsContext.h"
     36 #include "SkColor.h"
     37 #include "SkTDArray.h"
     38 #include "SkRegion.h"
     39 #include "Timer.h"
     40 #include "WebCoreRefObject.h"
     41 #include "WebCoreJni.h"
     42 #include "WebRequestContext.h"
     43 #include "android_npapi.h"
     44 
     45 #include <jni.h>
     46 #include <ui/KeycodeLabels.h>
     47 #include <ui/PixelFormat.h>
     48 
     49 namespace WebCore {
     50     class Color;
     51     class FrameView;
     52     class HTMLAnchorElement;
     53     class HTMLElement;
     54     class HTMLImageElement;
     55     class HTMLSelectElement;
     56     class RenderPart;
     57     class RenderText;
     58     class Node;
     59     class PlatformKeyboardEvent;
     60     class QualifiedName;
     61     class RenderTextControl;
     62     class ScrollView;
     63     class TimerBase;
     64     class PageGroup;
     65 }
     66 
     67 #if USE(ACCELERATED_COMPOSITING)
     68 namespace WebCore {
     69     class GraphicsLayerAndroid;
     70 }
     71 #endif
     72 
     73 namespace WebCore {
     74     class BaseLayerAndroid;
     75 }
     76 
     77 struct PluginWidgetAndroid;
     78 class SkPicture;
     79 class SkIRect;
     80 
     81 namespace android {
     82 
     83     enum Direction {
     84         DIRECTION_BACKWARD = 0,
     85         DIRECTION_FORWARD = 1
     86     };
     87 
     88     enum NavigationAxis {
     89         AXIS_CHARACTER = 0,
     90         AXIS_WORD = 1,
     91         AXIS_SENTENCE = 2,
     92         AXIS_HEADING = 3,
     93         AXIS_SIBLING = 4,
     94         AXIS_PARENT_FIRST_CHILD = 5,
     95         AXIS_DOCUMENT = 6
     96     };
     97 
     98     class CachedFrame;
     99     class CachedNode;
    100     class CachedRoot;
    101     class ListBoxReply;
    102 
    103     class WebCoreReply : public WebCoreRefObject {
    104     public:
    105         virtual ~WebCoreReply() {}
    106 
    107         virtual void replyInt(int value) {
    108             SkDEBUGF(("WebCoreReply::replyInt(%d) not handled\n", value));
    109         }
    110 
    111         virtual void replyIntArray(const int* array, int count) {
    112             SkDEBUGF(("WebCoreReply::replyIntArray() not handled\n"));
    113         }
    114             // add more replyFoo signatures as needed
    115     };
    116 
    117     // one instance of WebViewCore per page for calling into Java's WebViewCore
    118     class WebViewCore : public WebCoreRefObject {
    119     public:
    120         /**
    121          * Initialize the native WebViewCore with a JNI environment, a Java
    122          * WebViewCore object and the main frame.
    123          */
    124         WebViewCore(JNIEnv* env, jobject javaView, WebCore::Frame* mainframe);
    125         ~WebViewCore();
    126 
    127         // helper function
    128         static WebViewCore* getWebViewCore(const WebCore::FrameView* view);
    129         static WebViewCore* getWebViewCore(const WebCore::ScrollView* view);
    130 
    131         // Followings are called from native WebCore to Java
    132 
    133         /**
    134          * Notification that a form was blurred.  Pass a message to hide the
    135          * keyboard if it was showing for that Node.
    136          * @param Node The Node that blurred.
    137          */
    138         void formDidBlur(const WebCore::Node*);
    139         void focusNodeChanged(const WebCore::Node*);
    140 
    141         /**
    142          * Scroll to an absolute position.
    143          * @param x The x coordinate.
    144          * @param y The y coordinate.
    145          * @param animate If it is true, animate to the new scroll position
    146          *
    147          * This method calls Java to trigger a gradual scroll event.
    148          */
    149         void scrollTo(int x, int y, bool animate = false);
    150 
    151         /**
    152          * Record the invalid rectangle
    153          */
    154         void contentInvalidate(const WebCore::IntRect &rect);
    155         void contentInvalidateAll();
    156 
    157         /**
    158          * Satisfy any outstanding invalidates, so that the current state
    159          * of the DOM is drawn.
    160          */
    161         void contentDraw();
    162 
    163         /**
    164          * copy the layers to the UI side
    165          */
    166         void layersDraw();
    167 
    168 #if USE(ACCELERATED_COMPOSITING)
    169         GraphicsLayerAndroid* graphicsRootLayer() const;
    170 #endif
    171 
    172         /** Invalidate the view/screen, NOT the content/DOM, but expressed in
    173          *  content/DOM coordinates (i.e. they need to eventually be scaled,
    174          *  by webview into view.java coordinates
    175          */
    176         void viewInvalidate(const WebCore::IntRect& rect);
    177 
    178         /**
    179          * Invalidate part of the content that may be offscreen at the moment
    180          */
    181         void offInvalidate(const WebCore::IntRect &rect);
    182 
    183         /**
    184          * Called by webcore when the progress indicator is done
    185          * used to rebuild and display any changes in focus
    186          */
    187         void notifyProgressFinished();
    188 
    189         /**
    190          * Notify the view that WebCore did its first layout.
    191          */
    192         void didFirstLayout();
    193 
    194         /**
    195          * Notify the view to update the viewport.
    196          */
    197         void updateViewport();
    198 
    199         /**
    200          * Notify the view to restore the screen width, which in turn restores
    201          * the scale. Also restore the scale for the text wrap.
    202          */
    203         void restoreScale(float scale, float textWrapScale);
    204 
    205         /**
    206          * Tell the java side to update the focused textfield
    207          * @param pointer   Pointer to the node for the input field.
    208          * @param   changeToPassword  If true, we are changing the textfield to
    209          *          a password field, and ignore the String
    210          * @param text  If changeToPassword is false, this is the new text that
    211          *              should go into the textfield.
    212          */
    213         void updateTextfield(WebCore::Node* pointer,
    214                 bool changeToPassword, const WTF::String& text);
    215 
    216         /**
    217          * Tell the java side to update the current selection in the focused
    218          * textfield to the WebTextView.  This function finds the currently
    219          * focused textinput, and passes its selection to java.
    220          * If there is no focus, or it is not a text input, this does nothing.
    221          */
    222         void updateTextSelection();
    223 
    224         void clearTextEntry();
    225         // JavaScript support
    226         void jsAlert(const WTF::String& url, const WTF::String& text);
    227         bool jsConfirm(const WTF::String& url, const WTF::String& text);
    228         bool jsPrompt(const WTF::String& url, const WTF::String& message,
    229                 const WTF::String& defaultValue, WTF::String& result);
    230         bool jsUnload(const WTF::String& url, const WTF::String& message);
    231         bool jsInterrupt();
    232 
    233         /**
    234          * Posts a message to the UI thread to inform the Java side that the
    235          * origin has exceeded its database quota.
    236          * @param url The URL of the page that caused the quota overflow
    237          * @param databaseIdentifier the id of the database that caused the
    238          *     quota overflow.
    239          * @param currentQuota The current quota for the origin
    240          * @param estimatedSize The estimated size of the database
    241          * @return Whether the message was successfully sent.
    242          */
    243         bool exceededDatabaseQuota(const WTF::String& url,
    244                                    const WTF::String& databaseIdentifier,
    245                                    const unsigned long long currentQuota,
    246                                    const unsigned long long estimatedSize);
    247 
    248         /**
    249          * Posts a message to the UI thread to inform the Java side that the
    250          * appcache has exceeded its max size.
    251          * @param spaceNeeded is the amount of disk space that would be needed
    252          * in order for the last appcache operation to succeed.
    253          * @return Whether the message was successfully sent.
    254          */
    255         bool reachedMaxAppCacheSize(const unsigned long long spaceNeeded);
    256 
    257         /**
    258          * Set up the PageGroup's idea of which links have been visited,
    259          * with the browser history.
    260          * @param group the object to deliver the links to.
    261          */
    262         void populateVisitedLinks(WebCore::PageGroup*);
    263 
    264         /**
    265          * Instruct the browser to show a Geolocation permission prompt for the
    266          * specified origin.
    267          * @param origin The origin of the frame requesting Geolocation
    268          *     permissions.
    269          */
    270         void geolocationPermissionsShowPrompt(const WTF::String& origin);
    271         /**
    272          * Instruct the browser to hide the Geolocation permission prompt.
    273          */
    274         void geolocationPermissionsHidePrompt();
    275 
    276         jobject getDeviceMotionService();
    277         jobject getDeviceOrientationService();
    278 
    279         void addMessageToConsole(const String& message, unsigned int lineNumber, const String& sourceID, int msgLevel);
    280 
    281         /**
    282          * Tell the Java side of the scrollbar mode
    283          */
    284         void setScrollbarModes(ScrollbarMode horizontalMode, ScrollbarMode verticalMode);
    285 
    286         //
    287         // Followings support calls from Java to native WebCore
    288         //
    289 
    290         WTF::String retrieveHref(int x, int y);
    291         WTF::String retrieveAnchorText(int x, int y);
    292         WTF::String retrieveImageSource(int x, int y);
    293         WTF::String requestLabel(WebCore::Frame* , WebCore::Node* );
    294 
    295         // If the focus is a textfield (<input>), textarea, or contentEditable,
    296         // scroll the selection on screen (if necessary).
    297         void revealSelection();
    298         // Create a single picture to represent the drawn DOM (used by navcache)
    299         void recordPicture(SkPicture* picture);
    300 
    301         void moveFocus(WebCore::Frame* frame, WebCore::Node* node);
    302         void moveMouse(WebCore::Frame* frame, int x, int y);
    303         void moveMouseIfLatest(int moveGeneration,
    304             WebCore::Frame* frame, int x, int y);
    305 
    306         // set the scroll amount that webview.java is currently showing
    307         void setScrollOffset(int moveGeneration, bool sendScrollEvent, int dx, int dy);
    308 
    309         void setGlobalBounds(int x, int y, int h, int v);
    310 
    311         void setSizeScreenWidthAndScale(int width, int height, int screenWidth,
    312             float scale, int realScreenWidth, int screenHeight, int anchorX,
    313             int anchorY, bool ignoreHeight);
    314 
    315         /**
    316          * Handle key events from Java.
    317          * @return Whether keyCode was handled by this class.
    318          */
    319         bool key(const WebCore::PlatformKeyboardEvent& event);
    320 
    321         /**
    322          * Handle (trackball) click event / dpad center press from Java.
    323          * Also used when typing into an unfocused textfield, in which case 'fake'
    324          * will be true.
    325          */
    326         void click(WebCore::Frame* frame, WebCore::Node* node, bool fake);
    327 
    328         /**
    329          * Handle touch event
    330          */
    331         bool handleTouchEvent(int action, Vector<int>& ids, Vector<IntPoint>& points, int actionIndex, int metaState);
    332 
    333         /**
    334          * Handle motionUp event from the UI thread (called touchUp in the
    335          * WebCore thread).
    336          * @param touchGeneration Generation number for touches so we can ignore
    337          *      touches when a newer one has been generated.
    338          * @param frame Pointer to Frame containing the node that was touched.
    339          * @param node Pointer to Node that was touched.
    340          * @param x x-position of the touch.
    341          * @param y y-position of the touch.
    342          */
    343         void touchUp(int touchGeneration, WebCore::Frame* frame,
    344                 WebCore::Node* node, int x, int y);
    345 
    346         /**
    347          * Sets the index of the label from a popup
    348          */
    349         void popupReply(int index);
    350         void popupReply(const int* array, int count);
    351 
    352         /**
    353          *  Delete text from start to end in the focused textfield.
    354          *  If start == end, set the selection, but perform no deletion.
    355          *  If there is no focus, silently fail.
    356          *  If start and end are out of order, swap them.
    357          */
    358         void deleteSelection(int start, int end, int textGeneration);
    359 
    360         /**
    361          *  Set the selection of the currently focused textfield to (start, end).
    362          *  If start and end are out of order, swap them.
    363          */
    364         void setSelection(int start, int end);
    365 
    366         /**
    367          * Modifies the current selection.
    368          *
    369          * Note: Accessibility support.
    370          *
    371          * direction - The direction in which to alter the selection.
    372          * granularity - The granularity of the selection modification.
    373          *
    374          * returns - The selected HTML as a string. This is not a well formed
    375          *           HTML, rather the selection annotated with the tags of all
    376          *           intermediary elements it crosses.
    377          */
    378         String modifySelection(const int direction, const int granularity);
    379 
    380         /**
    381          * Moves the selection to the given node in a given frame i.e. selects that node.
    382          *
    383          * Note: Accessibility support.
    384          *
    385          * frame - The frame in which to select is the node to be selected.
    386          * node - The node to be selected.
    387          *
    388          * returns - The selected HTML as a string. This is not a well formed
    389          *           HTML, rather the selection annotated with the tags of all
    390          *           intermediary elements it crosses.
    391          */
    392         String moveSelection(WebCore::Frame* frame, WebCore::Node* node);
    393 
    394         /**
    395          *  In the currently focused textfield, replace the characters from oldStart to oldEnd
    396          *  (if oldStart == oldEnd, this will be an insert at that position) with replace,
    397          *  and set the selection to (start, end).
    398          */
    399         void replaceTextfieldText(int oldStart,
    400             int oldEnd, const WTF::String& replace, int start, int end,
    401             int textGeneration);
    402         void passToJs(int generation,
    403             const WTF::String& , const WebCore::PlatformKeyboardEvent& );
    404         /**
    405          * Scroll the focused textfield to (x, y) in document space
    406          */
    407         void scrollFocusedTextInput(float x, int y);
    408         /**
    409          * Set the FocusController's active and focused states, so that
    410          * the caret will draw (true) or not.
    411          */
    412         void setFocusControllerActive(bool active);
    413 
    414         void saveDocumentState(WebCore::Frame* frame);
    415 
    416         void addVisitedLink(const UChar*, int);
    417 
    418         // TODO: I don't like this hack but I need to access the java object in
    419         // order to send it as a parameter to java
    420         AutoJObject getJavaObject();
    421 
    422         // Return the parent WebView Java object associated with this
    423         // WebViewCore.
    424         jobject getWebViewJavaObject();
    425 
    426         void setBackgroundColor(SkColor c);
    427         void updateFrameCache();
    428         void updateCacheOnNodeChange();
    429         void dumpDomTree(bool);
    430         void dumpRenderTree(bool);
    431         void dumpNavTree();
    432 
    433         /*  We maintain a list of active plugins. The list is edited by the
    434             pluginview itself. The list is used to service invals to the plugin
    435             pageflipping bitmap.
    436          */
    437         void addPlugin(PluginWidgetAndroid*);
    438         void removePlugin(PluginWidgetAndroid*);
    439         // returns true if the pluginwidgit is in our active list
    440         bool isPlugin(PluginWidgetAndroid*) const;
    441         void invalPlugin(PluginWidgetAndroid*);
    442         void drawPlugins();
    443 
    444         // send the current screen size/zoom to all of the plugins in our list
    445         void sendPluginVisibleScreen();
    446 
    447         // notify plugin that a new drawing surface was created in the UI thread
    448         void sendPluginSurfaceReady();
    449 
    450         // send onLoad event to plugins who are descendents of the given frame
    451         void notifyPluginsOnFrameLoad(const Frame*);
    452 
    453         // gets a rect representing the current on-screen portion of the document
    454         void getVisibleScreen(ANPRectI&);
    455 
    456         // send this event to all of the plugins in our list
    457         void sendPluginEvent(const ANPEvent&);
    458 
    459         // lookup the plugin widget struct given an NPP
    460         PluginWidgetAndroid* getPluginWidget(NPP npp);
    461 
    462         // return the cursorNode if it is a plugin
    463         Node* cursorNodeIsPlugin();
    464 
    465         // Notify the Java side whether it needs to pass down the touch events
    466         void needTouchEvents(bool);
    467 
    468         void requestKeyboardWithSelection(const WebCore::Node*, int selStart, int selEnd);
    469         // Notify the Java side that webkit is requesting a keyboard
    470         void requestKeyboard(bool showKeyboard);
    471 
    472         // Generates a class loader that contains classes from the plugin's apk
    473         jclass getPluginClass(const WTF::String& libName, const char* className);
    474 
    475         // Creates a full screen surface for a plugin
    476         void showFullScreenPlugin(jobject webkitPlugin, int32_t orientation, NPP npp);
    477 
    478         // Instructs the UI thread to discard the plugin's full-screen surface
    479         void hideFullScreenPlugin();
    480 
    481         // Creates a childView for the plugin but does not attach to the view hierarchy
    482         jobject createSurface(jobject view);
    483 
    484         // Adds the plugin's view (aka surface) to the view hierarchy
    485         jobject addSurface(jobject view, int x, int y, int width, int height);
    486 
    487         // Updates a Surface coordinates and dimensions for a plugin
    488         void updateSurface(jobject childView, int x, int y, int width, int height);
    489 
    490         // Destroys a SurfaceView for a plugin
    491         void destroySurface(jobject childView);
    492 
    493         // Returns the context (android.content.Context) of the WebView
    494         jobject getContext();
    495 
    496         // Manages requests to keep the screen on while the WebView is visible
    497         void keepScreenOn(bool screenOn);
    498 
    499         bool validNodeAndBounds(Frame* , Node* , const IntRect& );
    500 
    501         // Make the rect (left, top, width, height) visible. If it can be fully
    502         // fit, center it on the screen. Otherwise make sure the point specified
    503         // by (left + xPercentInDoc * width, top + yPercentInDoc * height)
    504         // pinned at the screen position (xPercentInView, yPercentInView).
    505         void showRect(int left, int top, int width, int height, int contentWidth,
    506             int contentHeight, float xPercentInDoc, float xPercentInView,
    507             float yPercentInDoc, float yPercentInView);
    508 
    509         // Scale the rect (x, y, width, height) to make it just fit and centered
    510         // in the current view.
    511         void centerFitRect(int x, int y, int width, int height);
    512 
    513         // return a list of rects matching the touch point (x, y) with the slop
    514         Vector<IntRect> getTouchHighlightRects(int x, int y, int slop);
    515 
    516         // Open a file chooser for selecting a file to upload
    517         void openFileChooser(PassRefPtr<WebCore::FileChooser> );
    518 
    519         // reset the picture set to empty
    520         void clearContent();
    521 
    522         bool focusBoundsChanged();
    523 
    524         // record the inval area, and the picture size
    525         BaseLayerAndroid* recordContent(SkRegion* , SkIPoint* );
    526 
    527         // This creates a new BaseLayerAndroid by copying the current m_content
    528         // and doing a copy of the layers. The layers' content may be updated
    529         // as we are calling layersSync().
    530         BaseLayerAndroid* createBaseLayer(SkRegion*);
    531         bool updateLayers(LayerAndroid*);
    532 
    533         int textWrapWidth() const { return m_textWrapWidth; }
    534         float scale() const { return m_scale; }
    535         float textWrapScale() const { return m_screenWidth * m_scale / m_textWrapWidth; }
    536         WebCore::Frame* mainFrame() const { return m_mainFrame; }
    537         void updateCursorBounds(const CachedRoot* root,
    538                 const CachedFrame* cachedFrame, const CachedNode* cachedNode);
    539         void updateFrameCacheIfLoading();
    540 
    541         // utility to split slow parts of the picture set
    542         void splitContent(PictureSet*);
    543 
    544         void notifyWebAppCanBeInstalled();
    545 
    546 #if ENABLE(VIDEO)
    547         void enterFullscreenForVideoLayer(int layerId, const WTF::String& url);
    548 #endif
    549 
    550         void setWebTextViewAutoFillable(int queryId, const string16& previewSummary);
    551 
    552         DeviceMotionAndOrientationManager* deviceMotionAndOrientationManager() { return &m_deviceMotionAndOrientationManager; }
    553 
    554         void listBoxRequest(WebCoreReply* reply, const uint16_t** labels,
    555                 size_t count, const int enabled[], size_t enabledCount,
    556                 bool multiple, const int selected[], size_t selectedCountOrSelection);
    557         bool shouldPaintCaret() { return m_shouldPaintCaret; }
    558         void setShouldPaintCaret(bool should) { m_shouldPaintCaret = should; }
    559         bool isPaused() const { return m_isPaused; }
    560         void setIsPaused(bool isPaused) { m_isPaused = isPaused; }
    561         bool drawIsPaused() const;
    562         // The actual content (without title bar) size in doc coordinate
    563         int  screenWidth() const { return m_screenWidth; }
    564         int  screenHeight() const { return m_screenHeight; }
    565 #if USE(CHROME_NETWORK_STACK)
    566         void setWebRequestContextUserAgent();
    567         void setWebRequestContextCacheMode(int mode);
    568         WebRequestContext* webRequestContext();
    569 #endif
    570         // Attempts to scroll the layer to the x,y coordinates of rect. The
    571         // layer is the id of the LayerAndroid.
    572         void scrollRenderLayer(int layer, const SkRect& rect);
    573         // call only from webkit thread (like add/remove), return true if inst
    574         // is still alive
    575         static bool isInstance(WebViewCore*);
    576         // if there exists at least one WebViewCore instance then we return the
    577         // application context, otherwise NULL is returned.
    578         static jobject getApplicationContext();
    579         // Check whether a media mimeType is supported in Android media framework.
    580         static bool isSupportedMediaMimeType(const WTF::String& mimeType);
    581 
    582         // these members are shared with webview.cpp
    583         static Mutex gFrameCacheMutex;
    584         CachedRoot* m_frameCacheKit; // nav data being built by webcore
    585         SkPicture* m_navPictureKit;
    586         int m_moveGeneration; // copy of state in WebViewNative triggered by move
    587         int m_touchGeneration; // copy of state in WebViewNative triggered by touch
    588         int m_lastGeneration; // last action using up to date cache
    589         bool m_updatedFrameCache;
    590         bool m_findIsUp;
    591         bool m_hasCursorBounds;
    592         WebCore::IntRect m_cursorBounds;
    593         WebCore::IntRect m_cursorHitBounds;
    594         void* m_cursorFrame;
    595         IntPoint m_cursorLocation;
    596         void* m_cursorNode;
    597         static Mutex gCursorBoundsMutex;
    598         // These two fields go together: we use the mutex to protect access to
    599         // m_buttons, so that we, and webview.cpp can look/modify the m_buttons
    600         // field safely from our respective threads
    601         static Mutex gButtonMutex;
    602         WTF::Vector<Container> m_buttons;
    603         // end of shared members
    604 
    605         // internal functions
    606     private:
    607         CacheBuilder& cacheBuilder();
    608         WebCore::Node* currentFocus();
    609         // Compare the new set of buttons to the old one.  All of the new
    610         // buttons either replace our old ones or should be added to our list.
    611         // Then check the old buttons to see if any are no longer needed.
    612         void updateButtonList(WTF::Vector<Container>* buttons);
    613         // Create a set of pictures to represent the drawn DOM, driven by
    614         // the invalidated region and the time required to draw (used to draw)
    615         void recordPictureSet(PictureSet* master);
    616 
    617         void doMaxScroll(CacheBuilder::Direction dir);
    618         SkPicture* rebuildPicture(const SkIRect& inval);
    619         void rebuildPictureSet(PictureSet* );
    620         void sendNotifyProgressFinished();
    621         /*
    622          * Handle a mouse click, either from a touch or trackball press.
    623          * @param frame Pointer to the Frame containing the node that was clicked on.
    624          * @param node Pointer to the Node that was clicked on.
    625          * @param fake This is a fake mouse click, used to put a textfield into focus. Do not
    626          *      open the IME.
    627          */
    628         bool handleMouseClick(WebCore::Frame*, WebCore::Node*, bool fake);
    629         WebCore::HTMLAnchorElement* retrieveAnchorElement(int x, int y);
    630         WebCore::HTMLElement* retrieveElement(int x, int y,
    631             const WebCore::QualifiedName& );
    632         WebCore::HTMLImageElement* retrieveImageElement(int x, int y);
    633         // below are members responsible for accessibility support
    634         String modifySelectionTextNavigationAxis(DOMSelection* selection, int direction, int granularity);
    635         String modifySelectionDomNavigationAxis(DOMSelection* selection, int direction, int granularity);
    636         Text* traverseNextContentTextNode(Node* fromNode, Node* toNode ,int direction);
    637         bool isVisible(Node* node);
    638         bool isHeading(Node* node);
    639         String formatMarkup(DOMSelection* selection);
    640         void selectAt(int x, int y);
    641 
    642         void scrollNodeIntoView(Frame* frame, Node* node);
    643         bool isContentTextNode(Node* node);
    644         Node* getIntermediaryInputElement(Node* fromNode, Node* toNode, int direction);
    645         bool isContentInputElement(Node* node);
    646         bool isDescendantOf(Node* parent, Node* node);
    647         void advanceAnchorNode(DOMSelection* selection, int direction, String& markup, bool ignoreFirstNode, ExceptionCode& ec);
    648         Node* getNextAnchorNode(Node* anchorNode, bool skipFirstHack, int direction);
    649         Node* getImplicitBoundaryNode(Node* node, unsigned offset, int direction);
    650 
    651         // called from constructor, to add this to a global list
    652         static void addInstance(WebViewCore*);
    653         // called from destructor, to remove this from a global list
    654         static void removeInstance(WebViewCore*);
    655 
    656         friend class ListBoxReply;
    657         struct JavaGlue;
    658         struct JavaGlue*       m_javaGlue;
    659         WebCore::Frame*        m_mainFrame;
    660         WebCoreReply*          m_popupReply;
    661         WebCore::Node* m_lastFocused;
    662         WebCore::IntRect m_lastFocusedBounds;
    663         int m_blurringNodePointer;
    664         int m_lastFocusedSelStart;
    665         int m_lastFocusedSelEnd;
    666         PictureSet m_content; // the set of pictures to draw
    667         SkRegion m_addInval; // the accumulated inval region (not yet drawn)
    668         SkRegion m_rebuildInval; // the accumulated region for rebuilt pictures
    669         // Used in passToJS to avoid updating the UI text field until after the
    670         // key event has been processed.
    671         bool m_blockTextfieldUpdates;
    672         bool m_focusBoundsChanged;
    673         bool m_skipContentDraw;
    674         // Passed in with key events to know when they were generated.  Store it
    675         // with the cache so that we can ignore stale text changes.
    676         int m_textGeneration;
    677         CachedRoot* m_temp;
    678         SkPicture* m_tempPict;
    679         int m_maxXScroll;
    680         int m_maxYScroll;
    681         int m_scrollOffsetX; // webview.java's current scroll in X
    682         int m_scrollOffsetY; // webview.java's current scroll in Y
    683         WebCore::IntPoint m_mousePos;
    684         bool m_frameCacheOutOfDate;
    685         bool m_progressDone;
    686         CachedHistory m_history;
    687         int m_screenWidth; // width of the visible rect in document coordinates
    688         int m_screenHeight;// height of the visible rect in document coordinates
    689         int m_textWrapWidth;
    690         float m_scale;
    691         unsigned m_domtree_version;
    692         bool m_check_domtree_version;
    693         PageGroup* m_groupForVisitedLinks;
    694         bool m_isPaused;
    695         int m_cacheMode;
    696         bool m_shouldPaintCaret;
    697 
    698         SkTDArray<PluginWidgetAndroid*> m_plugins;
    699         WebCore::Timer<WebViewCore> m_pluginInvalTimer;
    700         void pluginInvalTimerFired(WebCore::Timer<WebViewCore>*) {
    701             this->drawPlugins();
    702         }
    703 
    704         int m_screenOnCounter;
    705         Node* m_currentNodeDomNavigationAxis;
    706         DeviceMotionAndOrientationManager m_deviceMotionAndOrientationManager;
    707 
    708 #if ENABLE(TOUCH_EVENTS)
    709         bool m_forwardingTouchEvents;
    710 #endif
    711 
    712 #if USE(CHROME_NETWORK_STACK)
    713         scoped_refptr<WebRequestContext> m_webRequestContext;
    714 #endif
    715 
    716     };
    717 
    718 }   // namespace android
    719 
    720 #endif // WebViewCore_h
    721