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: ~WebCoreReply()105 virtual ~WebCoreReply() {} 106 replyInt(int value)107 virtual void replyInt(int value) { 108 SkDEBUGF(("WebCoreReply::replyInt(%d) not handled\n", value)); 109 } 110 replyIntArray(const int * array,int count)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 textWrapWidth()533 int textWrapWidth() const { return m_textWrapWidth; } scale()534 float scale() const { return m_scale; } textWrapScale()535 float textWrapScale() const { return m_screenWidth * m_scale / m_textWrapWidth; } mainFrame()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 deviceMotionAndOrientationManager()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); shouldPaintCaret()557 bool shouldPaintCaret() { return m_shouldPaintCaret; } setShouldPaintCaret(bool should)558 void setShouldPaintCaret(bool should) { m_shouldPaintCaret = should; } isPaused()559 bool isPaused() const { return m_isPaused; } setIsPaused(bool isPaused)560 void setIsPaused(bool isPaused) { m_isPaused = isPaused; } 561 bool drawIsPaused() const; 562 // The actual content (without title bar) size in doc coordinate screenWidth()563 int screenWidth() const { return m_screenWidth; } screenHeight()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; pluginInvalTimerFired(WebCore::Timer<WebViewCore> *)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