diff options
| author | Derek Sollenberger <djsollen@google.com> | 2009-06-19 15:57:24 -0400 |
|---|---|---|
| committer | Derek Sollenberger <djsollen@google.com> | 2009-06-22 11:50:21 -0400 |
| commit | 3d709e1f628a1547fba1e4cab0c91a55f7ed7e7a (patch) | |
| tree | 96c3b83b80044b32efe3a8f92dbdb413f89ebb6f /WebKit | |
| parent | 263a3894c3719057dcbd85b9094eba072da13511 (diff) | |
| download | external_webkit-3d709e1f628a1547fba1e4cab0c91a55f7ed7e7a.zip external_webkit-3d709e1f628a1547fba1e4cab0c91a55f7ed7e7a.tar.gz external_webkit-3d709e1f628a1547fba1e4cab0c91a55f7ed7e7a.tar.bz2 | |
Providing plugins with scrolling ability as well as an event informing the plugin of the document's visibleRect.
Diffstat (limited to 'WebKit')
| -rw-r--r-- | WebKit/android/jni/WebViewCore.cpp | 33 | ||||
| -rw-r--r-- | WebKit/android/jni/WebViewCore.h | 9 | ||||
| -rw-r--r-- | WebKit/android/plugins/ANPWindowInterface.cpp | 18 | ||||
| -rw-r--r-- | WebKit/android/plugins/android_npapi.h | 27 |
4 files changed, 77 insertions, 10 deletions
diff --git a/WebKit/android/jni/WebViewCore.cpp b/WebKit/android/jni/WebViewCore.cpp index 8b8d315..73430ce 100644 --- a/WebKit/android/jni/WebViewCore.cpp +++ b/WebKit/android/jni/WebViewCore.cpp @@ -294,6 +294,11 @@ void WebViewCore::reset(bool fromConstructor) m_check_domtree_version = true; m_progressDone = false; m_hasCursorBounds = false; + + m_scrollOffsetX = 0; + m_scrollOffsetY = 0; + m_screenWidth = 0; + m_screenHeight = 0; } static bool layoutIfNeededRecursive(WebCore::Frame* f) @@ -874,6 +879,9 @@ void WebViewCore::setScrollOffset(int moveGeneration, int dx, int dy) m_mainFrame->view()->platformWidget()->setLocation(m_scrollOffsetX, m_scrollOffsetY); m_mainFrame->eventHandler()->sendScrollEvent(); + + // update the currently visible window + sendVisibleRectBounds(); } gCursorBoundsMutex.lock(); bool hasCursorBounds = m_hasCursorBounds; @@ -902,6 +910,7 @@ void WebViewCore::setSizeScreenWidthAndScale(int width, int height, DBG_NAV_LOGD("old:(w=%d,h=%d,sw=%d,scale=%d) new:(w=%d,h=%d,sw=%d,scale=%d)", ow, oh, osw, m_scale, width, height, screenWidth, scale); m_screenWidth = screenWidth; + m_screenHeight = screenHeight; m_scale = scale; m_maxXScroll = screenWidth >> 2; m_maxYScroll = (screenWidth * height / width) >> 2; @@ -946,6 +955,20 @@ void WebViewCore::setSizeScreenWidthAndScale(int width, int height, false); } } + + // update the currently visible window + sendVisibleRectBounds(); +} + +void WebViewCore::sendVisibleRectBounds() +{ + ANPEvent event; + SkANP::InitEvent(&event, kVisibleRect_ANPEventType); + event.data.visibleRect.x = m_scrollOffsetX; + event.data.visibleRect.y = m_scrollOffsetY; + event.data.visibleRect.width = m_screenWidth; + event.data.visibleRect.height = m_screenHeight; + sendPluginEvent(event, kVisibleRect_ANPEventFlag); } void WebViewCore::dumpDomTree(bool useFile) @@ -1109,6 +1132,16 @@ void WebViewCore::drawPlugins() } } +void WebViewCore::sendPluginEvent(const ANPEvent& evt, ANPEventFlag flag) +{ + PluginWidgetAndroid** iter = m_plugins.begin(); + PluginWidgetAndroid** stop = m_plugins.end(); + for (; iter < stop; ++iter) { + if((*iter)->isAcceptingEvent(flag)) + (*iter)->sendEvent(evt); + } +} + void WebViewCore::sendPluginEvent(const ANPEvent& evt) { PluginWidgetAndroid** iter = m_plugins.begin(); diff --git a/WebKit/android/jni/WebViewCore.h b/WebKit/android/jni/WebViewCore.h index 4ba0074..4e737b6 100644 --- a/WebKit/android/jni/WebViewCore.h +++ b/WebKit/android/jni/WebViewCore.h @@ -26,6 +26,7 @@ #ifndef WEBVIEWCORE_H #define WEBVIEWCORE_H +#include "android_npapi.h" #include "CacheBuilder.h" #include "CachedHistory.h" #include "PictureSet.h" @@ -55,7 +56,6 @@ namespace WebCore { struct PluginWidgetAndroid; class SkPicture; class SkIRect; -struct ANPEvent; namespace android { @@ -291,6 +291,9 @@ namespace android { // send this event to all of the plugins in our list void sendPluginEvent(const ANPEvent&); + // send this event to all of the plugins who have the given flag set + void sendPluginEvent(const ANPEvent& evt, ANPEventFlag flag); + // Notify the Java side whether it needs to pass down the touch events void needTouchEvents(bool); @@ -384,7 +387,8 @@ namespace android { int m_lastVelocity; CachedHistory m_history; WebCore::Node* m_snapAnchorNode; - int m_screenWidth; + int m_screenWidth; // width of the visible rect in document coordinates + int m_screenHeight;// height of the visible rect in document coordinates int m_scale; unsigned m_domtree_version; bool m_check_domtree_version; @@ -399,6 +403,7 @@ namespace android { SkPicture* rebuildPicture(const SkIRect& inval); void rebuildPictureSet(PictureSet* ); void sendNotifyProgressFinished(); + void sendVisibleRectBounds(); bool handleMouseClick(WebCore::Frame* framePtr, WebCore::Node* nodePtr); #if DEBUG_NAV_UI uint32_t m_now; diff --git a/WebKit/android/plugins/ANPWindowInterface.cpp b/WebKit/android/plugins/ANPWindowInterface.cpp index 4aa862b..8258936 100644 --- a/WebKit/android/plugins/ANPWindowInterface.cpp +++ b/WebKit/android/plugins/ANPWindowInterface.cpp @@ -26,6 +26,9 @@ // must include config.h first for webkit to fiddle with new/delete #include "config.h" #include "SkANP.h" +#include "ScrollView.h" +#include "WebViewCore.h" +#include "PluginView.h" static bool anp_lockRect(void* window, const ANPRectI* inval, ANPBitmap* bitmap) { @@ -48,15 +51,28 @@ static bool anp_lockRegion(void* window, const ANPRegion* inval, static void anp_unlock(void* window) { } +static PluginView* pluginViewForInstance(NPP instance) { + if (instance && instance->ndata) + return static_cast<PluginView*>(instance->ndata); + return PluginView::currentPluginView(); +} + +static void anp_scrollTo(NPP instance, int32_t x, int32_t y) { + ScrollView* scrollView = pluginViewForInstance(instance)->parent(); + android::WebViewCore* core = android::WebViewCore::getWebViewCore(scrollView); + core->scrollTo(x,y,true); +} + /////////////////////////////////////////////////////////////////////////////// #define ASSIGN(obj, name) (obj)->name = anp_##name void ANPWindowInterfaceV0_Init(ANPInterface* value) { ANPWindowInterfaceV0* i = reinterpret_cast<ANPWindowInterfaceV0*>(value); - + ASSIGN(i, lockRect); ASSIGN(i, lockRegion); + ASSIGN(i, scrollTo); ASSIGN(i, unlock); } diff --git a/WebKit/android/plugins/android_npapi.h b/WebKit/android/plugins/android_npapi.h index 32fa1c0..7b703c0 100644 --- a/WebKit/android/plugins/android_npapi.h +++ b/WebKit/android/plugins/android_npapi.h @@ -160,8 +160,9 @@ typedef int32_t ANPDrawingModel; and touch events will be provided to the plugin. */ enum ANPEventFlag { - kKey_ANPEventFlag = 0x01, - kTouch_ANPEventFlag = 0x02, + kKey_ANPEventFlag = 0x01, + kTouch_ANPEventFlag = 0x02, + kVisibleRect_ANPEventFlag = 0x04, }; typedef uint32_t ANPEventFlags; @@ -608,6 +609,11 @@ struct ANPWindowInterfaceV0 : ANPInterface { results. If lock returned false, unlock should not be called. */ void (*unlock)(void* window); + /** Given (x,y) coordinates in the document space the currently visible + window will be shifted so that window's upper left corner will be as + closely aligned to the coordinates as possible. + */ + void (*scrollTo)(NPP instance, int32_t x, int32_t y); }; /////////////////////////////////////////////////////////////////////////////// @@ -692,11 +698,12 @@ struct ANPAudioTrackInterfaceV0 : ANPInterface { // HandleEvent enum ANPEventTypes { - kNull_ANPEventType = 0, - kKey_ANPEventType = 1, - kTouch_ANPEventType = 2, - kDraw_ANPEventType = 3, - kLifecycle_ANPEventType = 4 + kNull_ANPEventType = 0, + kKey_ANPEventType = 1, + kTouch_ANPEventType = 2, + kDraw_ANPEventType = 3, + kLifecycle_ANPEventType = 4, + kVisibleRect_ANPEventType = 5, }; typedef int32_t ANPEventType; @@ -765,6 +772,12 @@ struct ANPEvent { ANPBitmap bitmap; } data; } draw; + struct { + int32_t x; // relative to the document + int32_t y; // relative to the document + int32_t width; + int32_t height; + } visibleRect; int32_t other[8]; } data; }; |
