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 "DeviceMotionAndOrientationManager.h"
     30 #include "DOMSelection.h"
     31 #include "FileChooser.h"
     32 #include "FocusDirection.h"
     33 #include "GeolocationManager.h"
     34 #include "HitTestResult.h"
     35 #include "PicturePile.h"
     36 #include "PlatformGraphicsContext.h"
     37 #include "Position.h"
     38 #include "ScrollTypes.h"
     39 #include "SkColor.h"
     40 #include "SkTDArray.h"
     41 #include "SkRegion.h"
     42 #include "Text.h"
     43 #include "Timer.h"
     44 #include "WebCoreRefObject.h"
     45 #include "WebCoreJni.h"
     46 #include "WebRequestContext.h"
     47 #include "android_npapi.h"
     48 #include "VisiblePosition.h"
     49 #include "SelectText.h"
     50 
     51 #include <jni.h>
     52 #include <androidfw/KeycodeLabels.h>
     53 #include <ui/PixelFormat.h>
     54 #include <utils/threads.h>
     55 #include <wtf/Threading.h>
     56 
     57 namespace WebCore {
     58     class Color;
     59     class GraphicsOperationCollection;
     60     class FrameView;
     61     class HTMLAnchorElement;
     62     class HTMLElement;
     63     class HTMLImageElement;
     64     class HTMLSelectElement;
     65     class RenderPart;
     66     class RenderText;
     67     class Node;
     68     class PlatformKeyboardEvent;
     69     class QualifiedName;
     70     class RenderTextControl;
     71     class ScrollView;
     72     class TimerBase;
     73     class PageGroup;
     74 }
     75 
     76 #if USE(ACCELERATED_COMPOSITING)
     77 namespace WebCore {
     78     class GraphicsLayerAndroid;
     79     class LayerAndroid;
     80 }
     81 #endif
     82 
     83 namespace WebCore {
     84     class BaseLayerAndroid;
     85 }
     86 
     87 struct PluginWidgetAndroid;
     88 class SkPicture;
     89 class SkIRect;
     90 
     91 namespace android {
     92 
     93     enum Direction {
     94         DIRECTION_BACKWARD = 0,
     95         DIRECTION_FORWARD = 1
     96     };
     97 
     98     enum NavigationAxis {
     99         AXIS_CHARACTER = 0,
    100         AXIS_WORD = 1,
    101         AXIS_SENTENCE = 2,
    102         AXIS_HEADING = 3,
    103         AXIS_SIBLING = 4,
    104         AXIS_PARENT_FIRST_CHILD = 5,
    105         AXIS_DOCUMENT = 6
    106     };
    107 
    108     class ListBoxReply;
    109     class AndroidHitTestResult;
    110 
    111     class WebCoreReply : public WebCoreRefObject {
    112     public:
    113         virtual ~WebCoreReply() {}
    114 
    115         virtual void replyInt(int value) {
    116             SkDEBUGF(("WebCoreReply::replyInt(%d) not handled\n", value));
    117         }
    118 
    119         virtual void replyIntArray(const int* array, int count) {
    120             SkDEBUGF(("WebCoreReply::replyIntArray() not handled\n"));
    121         }
    122             // add more replyFoo signatures as needed
    123     };
    124 
    125     // one instance of WebViewCore per page for calling into Java's WebViewCore
    126     class WebViewCore : public WebCoreRefObject, public WebCore::PicturePainter {
    127     public:
    128         /**
    129          * Initialize the native WebViewCore with a JNI environment, a Java
    130          * WebViewCore object and the main frame.
    131          */
    132         WebViewCore(JNIEnv* env, jobject javaView, WebCore::Frame* mainframe);
    133         ~WebViewCore();
    134 
    135         // helper function
    136         static WebViewCore* getWebViewCore(const WebCore::FrameView* view);
    137         static WebViewCore* getWebViewCore(const WebCore::ScrollView* view);
    138 
    139         // Followings are called from native WebCore to Java
    140 
    141         void focusNodeChanged(WebCore::Node*);
    142 
    143         /**
    144          * Scroll to an absolute position.
    145          * @param x The x coordinate.
    146          * @param y The y coordinate.
    147          * @param animate If it is true, animate to the new scroll position
    148          *
    149          * This method calls Java to trigger a gradual scroll event.
    150          */
    151         void scrollTo(int x, int y, bool animate = false);
    152 
    153         /**
    154          * Record the invalid rectangle
    155          */
    156         void contentInvalidate(const WebCore::IntRect &rect);
    157         void contentInvalidateAll();
    158 
    159         /**
    160          * Satisfy any outstanding invalidates, so that the current state
    161          * of the DOM is drawn.
    162          */
    163         void contentDraw();
    164 
    165 #if USE(ACCELERATED_COMPOSITING)
    166         WebCore::GraphicsLayerAndroid* graphicsRootLayer() const;
    167 #endif
    168 
    169         /** Invalidate the view/screen, NOT the content/DOM, but expressed in
    170          *  content/DOM coordinates (i.e. they need to eventually be scaled,
    171          *  by webview into view.java coordinates
    172          */
    173         void viewInvalidate(const WebCore::IntRect& rect);
    174 
    175         /**
    176          * Invalidate part of the content that may be offscreen at the moment
    177          */
    178         void offInvalidate(const WebCore::IntRect &rect);
    179 
    180         /**
    181          * Called by webcore when the progress indicator is done
    182          * used to rebuild and display any changes in focus
    183          */
    184         void notifyProgressFinished();
    185 
    186         /**
    187          * Notify the view that WebCore did its first layout.
    188          */
    189         void didFirstLayout();
    190 
    191         /**
    192          * Notify the view to update the viewport.
    193          */
    194         void updateViewport();
    195 
    196         /**
    197          * Notify the view to restore the screen width, which in turn restores
    198          * the scale. Also restore the scale for the text wrap.
    199          */
    200         void restoreScale(float scale, float textWrapScale);
    201 
    202         /**
    203          * Tell the java side to update the focused textfield
    204          * @param pointer   Pointer to the node for the input field.
    205          * @param text  This is the new text that should go into the textfield.
    206          */
    207         void updateTextfield(WebCore::Node* pointer, const WTF::String& text);
    208 
    209         /**
    210          * Tell the java side to update the current selection in the focused
    211          * textfield to the WebTextView.  This function finds the currently
    212          * focused textinput, and passes its selection to java.
    213          * If there is no focus, or it is not a text input, this does nothing.
    214          */
    215         void updateTextSelection();
    216 
    217         /**
    218          * Updates the java side with the node's content size and scroll
    219          * position.
    220          */
    221         void updateTextSizeAndScroll(WebCore::Node* node);
    222 
    223         void clearTextEntry();
    224         // JavaScript support
    225         void jsAlert(const WTF::String& url, const WTF::String& text);
    226         bool jsConfirm(const WTF::String& url, const WTF::String& text);
    227         bool jsPrompt(const WTF::String& url, const WTF::String& message,
    228                 const WTF::String& defaultValue, WTF::String& result);
    229         bool jsUnload(const WTF::String& url, const WTF::String& message);
    230         bool jsInterrupt();
    231 
    232         /**
    233          * Posts a message to the UI thread to inform the Java side that the
    234          * origin has exceeded its database quota.
    235          * @param url The URL of the page that caused the quota overflow
    236          * @param databaseIdentifier the id of the database that caused the
    237          *     quota overflow.
    238          * @param currentQuota The current quota for the origin
    239          * @param estimatedSize The estimated size of the database
    240          * @return Whether the message was successfully sent.
    241          */
    242         bool exceededDatabaseQuota(const WTF::String& url,
    243                                    const WTF::String& databaseIdentifier,
    244                                    const unsigned long long currentQuota,
    245                                    const unsigned long long estimatedSize);
    246 
    247         /**
    248          * Posts a message to the UI thread to inform the Java side that the
    249          * appcache has exceeded its max size.
    250          * @param spaceNeeded is the amount of disk space that would be needed
    251          * in order for the last appcache operation to succeed.
    252          * @return Whether the message was successfully sent.
    253          */
    254         bool reachedMaxAppCacheSize(const unsigned long long spaceNeeded);
    255 
    256         /**
    257          * Set up the PageGroup's idea of which links have been visited,
    258          * with the browser history.
    259          * @param group the object to deliver the links to.
    260          */
    261         void populateVisitedLinks(WebCore::PageGroup*);
    262 
    263         /**
    264          * Instruct the browser to show a Geolocation permission prompt for the
    265          * specified origin.
    266          * @param origin The origin of the frame requesting Geolocation
    267          *     permissions.
    268          */
    269         void geolocationPermissionsShowPrompt(const WTF::String& origin);
    270         /**
    271          * Instruct the browser to hide the Geolocation permission prompt.
    272          */
    273         void geolocationPermissionsHidePrompt();
    274 
    275         jobject getDeviceMotionService();
    276         jobject getDeviceOrientationService();
    277 
    278         void addMessageToConsole(const WTF::String& message, unsigned int lineNumber, const WTF::String& sourceID, int msgLevel);
    279 
    280         /**
    281          * Tell the Java side of the scrollbar mode
    282          */
    283         void setScrollbarModes(WebCore::ScrollbarMode horizontalMode,
    284                                WebCore::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 
    299         void moveMouse(int x, int y, WebCore::HitTestResult* hoveredNode = 0,
    300                        bool isClickCandidate = false);
    301 
    302         // set the scroll amount that webview.java is currently showing
    303         void setScrollOffset(bool sendScrollEvent, int dx, int dy);
    304 
    305         void setGlobalBounds(int x, int y, int h, int v);
    306 
    307         void setSizeScreenWidthAndScale(int width, int height, int screenWidth,
    308             float scale, int realScreenWidth, int screenHeight, int anchorX,
    309             int anchorY, bool ignoreHeight);
    310 
    311         /**
    312          * Handle key events from Java.
    313          * @return Whether keyCode was handled by this class.
    314          */
    315         bool key(const WebCore::PlatformKeyboardEvent& event);
    316         bool chromeCanTakeFocus(WebCore::FocusDirection direction);
    317         void chromeTakeFocus(WebCore::FocusDirection direction);
    318         void setInitialFocus(const WebCore::PlatformKeyboardEvent& event);
    319 
    320         /**
    321          * Handle touch event
    322          * Returns an int with the following flags:
    323          * bit 0: hit an event handler
    324          * bit 1: preventDefault was called
    325          */
    326         int handleTouchEvent(int action, WTF::Vector<int>& ids,
    327                               WTF::Vector<WebCore::IntPoint>& points,
    328                               int actionIndex, int metaState);
    329 
    330         /**
    331          * Clicks the mouse at its current location
    332          */
    333         bool performMouseClick();
    334 
    335         /**
    336          * Sets the index of the label from a popup
    337          */
    338         void popupReply(int index);
    339         void popupReply(const int* array, int count);
    340 
    341         /**
    342          *  Delete text from start to end in the focused textfield.
    343          *  If start == end, set the selection, but perform no deletion.
    344          *  If there is no focus, silently fail.
    345          *  If start and end are out of order, swap them.
    346          */
    347         void deleteSelection(int start, int end, int textGeneration);
    348 
    349         /**
    350          *  Set the selection of the currently focused textfield to (start, end).
    351          *  If start and end are out of order, swap them.
    352          */
    353         void setSelection(int start, int end);
    354 
    355         /**
    356          * Modifies the current selection.
    357          *
    358          * Note: Accessibility support.
    359          *
    360          * direction - The direction in which to alter the selection.
    361          * granularity - The granularity of the selection modification.
    362          *
    363          * returns - The selected HTML as a WTF::String. This is not a well formed
    364          *           HTML, rather the selection annotated with the tags of all
    365          *           intermediary elements it crosses.
    366          */
    367         WTF::String modifySelection(const int direction, const int granularity);
    368 
    369         /**
    370          * Moves the selection to the given node in a given frame i.e. selects that node.
    371          *
    372          * Note: Accessibility support.
    373          *
    374          * frame - The frame in which to select is the node to be selected.
    375          * node - The node to be selected.
    376          *
    377          * returns - The selected HTML as a WTF::String. This is not a well formed
    378          *           HTML, rather the selection annotated with the tags of all
    379          *           intermediary elements it crosses.
    380          */
    381         WTF::String moveSelection(WebCore::Frame* frame, WebCore::Node* node);
    382 
    383         /**
    384          *  In the currently focused textfield, replace the characters from oldStart to oldEnd
    385          *  (if oldStart == oldEnd, this will be an insert at that position) with replace,
    386          *  and set the selection to (start, end).
    387          */
    388         void replaceTextfieldText(int oldStart,
    389             int oldEnd, const WTF::String& replace, int start, int end,
    390             int textGeneration);
    391         void passToJs(int generation,
    392             const WTF::String& , const WebCore::PlatformKeyboardEvent& );
    393         /**
    394          * Scroll the focused textfield to (x, y) in document space
    395          */
    396         void scrollFocusedTextInput(float x, int y);
    397         /**
    398          * Set the FocusController's active and focused states, so that
    399          * the caret will draw (true) or not.
    400          */
    401         void setFocusControllerActive(bool active);
    402 
    403         void saveDocumentState(WebCore::Frame* frame);
    404 
    405         void addVisitedLink(const UChar*, int);
    406 
    407         // TODO: I don't like this hack but I need to access the java object in
    408         // order to send it as a parameter to java
    409         AutoJObject getJavaObject();
    410 
    411         // Return the parent WebView Java object associated with this
    412         // WebViewCore.
    413         jobject getWebViewJavaObject();
    414 
    415         void setBackgroundColor(SkColor c);
    416 
    417         void dumpDomTree(bool);
    418         void dumpRenderTree(bool);
    419 
    420         /*  We maintain a list of active plugins. The list is edited by the
    421             pluginview itself. The list is used to service invals to the plugin
    422             pageflipping bitmap.
    423          */
    424         void addPlugin(PluginWidgetAndroid*);
    425         void removePlugin(PluginWidgetAndroid*);
    426         // returns true if the pluginwidgit is in our active list
    427         bool isPlugin(PluginWidgetAndroid*) const;
    428         void invalPlugin(PluginWidgetAndroid*);
    429         void drawPlugins();
    430 
    431         // send the current screen size/zoom to all of the plugins in our list
    432         void sendPluginVisibleScreen();
    433 
    434         // notify plugin that a new drawing surface was created in the UI thread
    435         void sendPluginSurfaceReady();
    436 
    437         // send onLoad event to plugins who are descendents of the given frame
    438         void notifyPluginsOnFrameLoad(const WebCore::Frame*);
    439 
    440         // gets a rect representing the current on-screen portion of the document
    441         void getVisibleScreen(ANPRectI&);
    442 
    443         // send this event to all of the plugins in our list
    444         void sendPluginEvent(const ANPEvent&);
    445 
    446         // lookup the plugin widget struct given an NPP
    447         PluginWidgetAndroid* getPluginWidget(NPP npp);
    448 
    449         // Notify the Java side whether it needs to pass down the touch events
    450         void needTouchEvents(bool);
    451 
    452         void requestKeyboardWithSelection(const WebCore::Node*, int selStart, int selEnd);
    453         // Notify the Java side that webkit is requesting a keyboard
    454         void requestKeyboard(bool showKeyboard);
    455 
    456         // Generates a class loader that contains classes from the plugin's apk
    457         jclass getPluginClass(const WTF::String& libName, const char* className);
    458 
    459         // Creates a full screen surface for a plugin
    460         void showFullScreenPlugin(jobject webkitPlugin, int32_t orientation, NPP npp);
    461 
    462         // Instructs the UI thread to discard the plugin's full-screen surface
    463         void hideFullScreenPlugin();
    464 
    465         // Creates a childView for the plugin but does not attach to the view hierarchy
    466         jobject createSurface(jobject view);
    467 
    468         // Adds the plugin's view (aka surface) to the view hierarchy
    469         jobject addSurface(jobject view, int x, int y, int width, int height);
    470 
    471         // Updates a Surface coordinates and dimensions for a plugin
    472         void updateSurface(jobject childView, int x, int y, int width, int height);
    473 
    474         // Destroys a SurfaceView for a plugin
    475         void destroySurface(jobject childView);
    476 
    477         // Returns the context (android.content.Context) of the WebView
    478         jobject getContext();
    479 
    480         // Manages requests to keep the screen on while the WebView is visible
    481         void keepScreenOn(bool screenOn);
    482 
    483         // Make the rect (left, top, width, height) visible. If it can be fully
    484         // fit, center it on the screen. Otherwise make sure the point specified
    485         // by (left + xPercentInDoc * width, top + yPercentInDoc * height)
    486         // pinned at the screen position (xPercentInView, yPercentInView).
    487         void showRect(int left, int top, int width, int height, int contentWidth,
    488             int contentHeight, float xPercentInDoc, float xPercentInView,
    489             float yPercentInDoc, float yPercentInView);
    490 
    491         // Scale the rect (x, y, width, height) to make it just fit and centered
    492         // in the current view.
    493         void centerFitRect(int x, int y, int width, int height);
    494 
    495         // return a list of rects matching the touch point (x, y) with the slop
    496         WTF::Vector<WebCore::IntRect> getTouchHighlightRects(int x, int y, int slop,
    497                 WebCore::Node** node, WebCore::HitTestResult* hitTestResult);
    498         // This does a sloppy hit test
    499         AndroidHitTestResult hitTestAtPoint(int x, int y, int slop, bool doMoveMouse = false);
    500         static bool nodeIsClickableOrFocusable(WebCore::Node* node);
    501 
    502         // Open a file chooser for selecting a file to upload
    503         void openFileChooser(PassRefPtr<WebCore::FileChooser> );
    504 
    505         // reset the picture set to empty
    506         void clearContent();
    507 
    508         // record content in a new BaseLayerAndroid, copying the layer tree as well
    509         WebCore::BaseLayerAndroid* recordContent(SkIPoint* );
    510 
    511         // This creates a new BaseLayerAndroid by copying the current m_content
    512         // and doing a copy of the layers. The layers' content may be updated
    513         // as we are calling layersSync().
    514         WebCore::BaseLayerAndroid* createBaseLayer(GraphicsLayerAndroid* root);
    515         bool updateLayers(WebCore::LayerAndroid*);
    516         void notifyAnimationStarted();
    517 
    518         int textWrapWidth() const { return m_textWrapWidth; }
    519         float scale() const { return m_scale; }
    520         float textWrapScale() const { return m_screenWidth * m_scale / m_textWrapWidth; }
    521         WebCore::Frame* mainFrame() const { return m_mainFrame; }
    522         WebCore::Frame* focusedFrame() const;
    523 
    524         void deleteText(int startX, int startY, int endX, int endY);
    525         WTF::String getText(int startX, int startY, int endX, int endY);
    526         void insertText(const WTF::String &text);
    527 
    528         // find on page
    529         void resetFindOnPage();
    530         int findTextOnPage(const WTF::String &text);
    531         int findNextOnPage(bool forward);
    532         void updateMatchCount() const;
    533 
    534 #if ENABLE(VIDEO)
    535         void enterFullscreenForVideoLayer();
    536         void exitFullscreenVideo();
    537 #endif
    538 
    539         void setWebTextViewAutoFillable(int queryId, const string16& previewSummary);
    540 
    541         DeviceMotionAndOrientationManager* deviceMotionAndOrientationManager() { return &m_deviceMotionAndOrientationManager; }
    542         GeolocationManager* geolocationManager() { return &m_geolocationManager; }
    543 
    544         void listBoxRequest(WebCoreReply* reply, const uint16_t** labels,
    545                 size_t count, const int enabled[], size_t enabledCount,
    546                 bool multiple, const int selected[], size_t selectedCountOrSelection);
    547         bool drawIsPaused() const;
    548         // The actual content (without title bar) size in doc coordinate
    549         int  screenWidth() const { return m_screenWidth; }
    550         int  screenHeight() const { return m_screenHeight; }
    551         void setWebRequestContextUserAgent();
    552         void setWebRequestContextCacheMode(int mode);
    553         WebRequestContext* webRequestContext();
    554         // Attempts to scroll the layer to the x,y coordinates of rect. The
    555         // layer is the id of the LayerAndroid.
    556         void scrollRenderLayer(int layer, const SkRect& rect);
    557         // call only from webkit thread (like add/remove), return true if inst
    558         // is still alive
    559         static bool isInstance(WebViewCore*);
    560         // if there exists at least one WebViewCore instance then we return the
    561         // application context, otherwise NULL is returned.
    562         static jobject getApplicationContext();
    563         // Check whether a media mimeType is supported in Android media framework.
    564         static bool isSupportedMediaMimeType(const WTF::String& mimeType);
    565 
    566         /**
    567          * Returns all text ranges consumed by the cursor points referred
    568          * to by startX, startY, endX, and endY. The vector will be empty
    569          * if no text is in the given area or if the positions are invalid.
    570          */
    571         Vector<WebCore::VisibleSelection> getTextRanges(
    572                 int startX, int startY, int endX, int endY);
    573         static int platformLayerIdFromNode(WebCore::Node* node,
    574                                            WebCore::LayerAndroid** outLayer = 0);
    575         void selectText(SelectText::HandleId handleId, int x, int y);
    576         bool selectWordAt(int x, int y);
    577 
    578         // Converts from the global content coordinates that WebView sends
    579         // to frame-local content coordinates using the focused frame
    580         WebCore::IntPoint convertGlobalContentToFrameContent(const WebCore::IntPoint& point, WebCore::Frame* frame = 0);
    581         static void layerToAbsoluteOffset(const WebCore::LayerAndroid* layer,
    582                                           WebCore::IntPoint& offset);
    583 
    584         // Retrieves the current locale from system properties
    585         void getLocale(String& language, WTF::String& region);
    586 
    587         // Handles changes in system locale
    588         void updateLocale();
    589 
    590         // these members are shared with webview.cpp
    591         int m_touchGeneration; // copy of state in WebViewNative triggered by touch
    592         int m_lastGeneration; // last action using up to date cache
    593         // end of shared members
    594 
    595         void setPrerenderingEnabled(bool enable);
    596 
    597         // internal functions
    598     private:
    599         enum InputType {
    600             NONE = -1,
    601             NORMAL_TEXT_FIELD = 0,
    602             TEXT_AREA = 1,
    603             PASSWORD = 2,
    604             SEARCH = 3,
    605             EMAIL = 4,
    606             NUMBER = 5,
    607             TELEPHONE = 6,
    608             URL = 7,
    609         };
    610 
    611         WebCore::Node* currentFocus();
    612         void layout();
    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 recordPicturePile();
    616 
    617         virtual void paintContents(WebCore::GraphicsContext* gc, WebCore::IntRect& dirty);
    618         virtual SkCanvas* createPrerenderCanvas(WebCore::PrerenderedInval* prerendered);
    619 #ifdef CONTEXT_RECORDING
    620         WebCore::GraphicsOperationCollection* rebuildGraphicsOperationCollection(const SkIRect& inval);
    621 #endif
    622         void sendNotifyProgressFinished();
    623         /*
    624          * Handle a mouse click, either from a touch or trackball press.
    625          * @param frame Pointer to the Frame containing the node that was clicked on.
    626          * @param node Pointer to the Node that was clicked on.
    627          * @param fake This is a fake mouse click, used to put a textfield into focus. Do not
    628          *      open the IME.
    629          */
    630         WebCore::HTMLAnchorElement* retrieveAnchorElement(int x, int y);
    631         WebCore::HTMLElement* retrieveElement(int x, int y,
    632             const WebCore::QualifiedName& );
    633         WebCore::HTMLImageElement* retrieveImageElement(int x, int y);
    634         // below are members responsible for accessibility support
    635         WTF::String modifySelectionTextNavigationAxis(WebCore::DOMSelection* selection,
    636                                                  int direction, int granularity);
    637         WTF::String modifySelectionDomNavigationAxis(WebCore::DOMSelection* selection,
    638                                                 int direction, int granularity);
    639         WebCore::Text* traverseNextContentTextNode(WebCore::Node* fromNode,
    640                                                    WebCore::Node* toNode,
    641                                                    int direction);
    642         bool isVisible(WebCore::Node* node);
    643         bool isHeading(WebCore::Node* node);
    644         WTF::String formatMarkup(WebCore::DOMSelection* selection);
    645         void selectAt(int x, int y);
    646 
    647         void scrollNodeIntoView(WebCore::Frame* frame, WebCore::Node* node);
    648         bool isContentTextNode(WebCore::Node* node);
    649         WebCore::Node* getIntermediaryInputElement(WebCore::Node* fromNode,
    650                                                    WebCore::Node* toNode,
    651                                                    int direction);
    652         bool isContentInputElement(WebCore::Node* node);
    653         bool isDescendantOf(WebCore::Node* parent, WebCore::Node* node);
    654         void advanceAnchorNode(WebCore::DOMSelection* selection, int direction,
    655                                WTF::String& markup, bool ignoreFirstNode,
    656                                WebCore::ExceptionCode& ec);
    657         WebCore::Node* getNextAnchorNode(WebCore::Node* anchorNode,
    658                                          bool skipFirstHack, int direction);
    659         WebCore::Node* getImplicitBoundaryNode(WebCore::Node* node,
    660                                                unsigned offset, int direction);
    661         jobject createTextFieldInitData(WebCore::Node* node);
    662         /**
    663          * Calls into java to reset the text edit field with the
    664          * current contents and selection.
    665          */
    666         void initEditField(WebCore::Node* node);
    667 
    668         /**
    669          * If node is not a text input field or if it explicitly requests
    670          * not to have keyboard input, then the soft keyboard is closed. If
    671          * it is a text input field then initEditField is called and
    672          * auto-fill information is requested for HTML form input fields.
    673          */
    674         void initializeTextInput(WebCore::Node* node, bool fake);
    675 
    676         /**
    677          * Gets the input type a Node. NONE is returned if it isn't an
    678          * input field.
    679          */
    680         InputType getInputType(WebCore::Node* node);
    681 
    682         /**
    683          * If node is an input field, the spellcheck value for the
    684          * field is returned. Otherwise true is returned.
    685          */
    686         static bool isSpellCheckEnabled(WebCore::Node* node);
    687 
    688         /**
    689          * Returns the offsets of the selection area for both normal text
    690          * fields and content editable fields. start and end are modified
    691          * by this method.
    692          */
    693         static void getSelectionOffsets(WebCore::Node* node, int& start, int& end);
    694         /**
    695          * Gets the plain text of the specified editable text field. node
    696          * may be content-editable or a plain text fields.
    697          */
    698         static WTF::String getInputText(WebCore::Node* node);
    699         /**
    700          * Gets the RenderTextControl for the given node if it has one.
    701          * If its renderer isn't a RenderTextControl, then NULL is returned.
    702          */
    703         static WebCore::RenderTextControl* toRenderTextControl(WebCore::Node *node);
    704         /**
    705          * Sets the selection for node's editable field to the offsets
    706          * between start (inclusive) and end (exclusive).
    707          */
    708         static void setSelection(WebCore::Node* node, int start, int end);
    709         /**
    710          * Returns the Position for the given offset for an editable
    711          * field. The offset is relative to the node start.
    712          */
    713         static WebCore::Position getPositionForOffset(WebCore::Node* node, int offset);
    714 
    715         WebCore::VisiblePosition visiblePositionForContentPoint(int x, int y);
    716         WebCore::VisiblePosition visiblePositionForContentPoint(const WebCore::IntPoint& point);
    717         bool selectWordAroundPosition(WebCore::Frame* frame,
    718                                       WebCore::VisiblePosition pos);
    719         SelectText* createSelectText(const WebCore::VisibleSelection&);
    720         void setSelectionCaretInfo(SelectText* selectTextContainer,
    721                 const WebCore::Position& position,
    722                 const WebCore::IntPoint& frameOffset,
    723                 SelectText::HandleId handleId, SelectText::HandleType handleType,
    724                 int offset, EAffinity affinity);
    725         static int getMaxLength(WebCore::Node* node);
    726         static WTF::String getFieldName(WebCore::Node* node);
    727         static bool isAutoCompleteEnabled(WebCore::Node* node);
    728         WebCore::IntRect absoluteClientRect(WebCore::Node* node,
    729                 WebCore::LayerAndroid* layer);
    730         static WebCore::IntRect positionToTextRect(const WebCore::Position& position,
    731                 WebCore::EAffinity affinity, const WebCore::IntPoint& offset,
    732                 const WebCore::IntRect& caretRect);
    733         static bool isLtr(const WebCore::Position& position);
    734         static WebCore::VisiblePosition trimSelectionPosition(
    735                 const WebCore::VisiblePosition& start,
    736                 const WebCore::VisiblePosition& stop);
    737 
    738         // called from constructor, to add this to a global list
    739         static void addInstance(WebViewCore*);
    740         // called from destructor, to remove this from a global list
    741         static void removeInstance(WebViewCore*);
    742 
    743         bool prerenderingEnabled();
    744 
    745         friend class ListBoxReply;
    746         struct JavaGlue;
    747         struct JavaGlue*       m_javaGlue;
    748         struct TextFieldInitDataGlue;
    749         struct TextFieldInitDataGlue* m_textFieldInitDataGlue;
    750         WebCore::Frame*        m_mainFrame;
    751         WebCoreReply*          m_popupReply;
    752         WebCore::PicturePile m_content; // the set of pictures to draw
    753         // Used in passToJS to avoid updating the UI text field until after the
    754         // key event has been processed.
    755         bool m_blockTextfieldUpdates;
    756         bool m_skipContentDraw;
    757         // Passed in with key events to know when they were generated.  Store it
    758         // with the cache so that we can ignore stale text changes.
    759         int m_textGeneration;
    760         int m_maxXScroll;
    761         int m_maxYScroll;
    762         int m_scrollOffsetX; // webview.java's current scroll in X
    763         int m_scrollOffsetY; // webview.java's current scroll in Y
    764         double m_scrollSetTime; // when the scroll was last set
    765         WebCore::IntPoint m_mousePos;
    766         // This is the location at which we will click. This is tracked
    767         // separately from m_mousePos, because m_mousePos may be updated
    768         // in the interval between ACTION_UP and when the click fires since
    769         // that occurs after a delay. This also works around potential hardware
    770         // issues if we get onHoverEvents when using the touch screen, as that
    771         // will nullify the slop checking we do in hitTest (aka, ACTION_DOWN)
    772         WebCore::IntPoint m_mouseClickPos;
    773         int m_screenWidth; // width of the visible rect in document coordinates
    774         int m_screenHeight;// height of the visible rect in document coordinates
    775         int m_textWrapWidth;
    776         float m_scale;
    777         WebCore::PageGroup* m_groupForVisitedLinks;
    778         int m_cacheMode;
    779         bool m_fullscreenVideoMode;
    780 
    781         // find on page data
    782         WTF::String m_searchText;
    783         int m_matchCount;
    784         int m_activeMatchIndex;
    785         RefPtr<WebCore::Range> m_activeMatch;
    786 
    787         SkTDArray<PluginWidgetAndroid*> m_plugins;
    788         WebCore::Timer<WebViewCore> m_pluginInvalTimer;
    789         void pluginInvalTimerFired(WebCore::Timer<WebViewCore>*) {
    790             this->drawPlugins();
    791         }
    792 
    793         int m_screenOnCounter;
    794         WebCore::Node* m_currentNodeDomNavigationAxis;
    795         DeviceMotionAndOrientationManager m_deviceMotionAndOrientationManager;
    796         GeolocationManager m_geolocationManager;
    797 
    798 #if ENABLE(TOUCH_EVENTS)
    799         bool m_forwardingTouchEvents;
    800 #endif
    801 
    802         scoped_refptr<WebRequestContext> m_webRequestContext;
    803 
    804         WTF::Mutex m_prerenderLock;
    805         bool m_prerenderEnabled;
    806     };
    807 
    808 }   // namespace android
    809 
    810 #endif // WebViewCore_h
    811