webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp
branchRCL_3
changeset 94 919f36ff910f
parent 93 79859ed3eea9
--- a/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp	Tue Aug 31 16:17:46 2010 +0300
+++ b/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp	Wed Sep 01 12:28:30 2010 +0100
@@ -17,7 +17,7 @@
 
 
 // INCLUDE FILES
-#include <Browser_platform_variant.hrh>
+#include <browser_platform_variant.hrh>
 #include <../bidi.h>
 #include "WebPageScrollHandler.h"
 #include "BrCtl.h"
@@ -34,17 +34,21 @@
 #include "WebScrollbarDrawer.h"
 #include "RenderObject.h"
 #include "WebScrollingDeceleratorGH.h"
-
+#include "pluginskin.h"
 #include "WebKitLogger.h"
 using namespace WebCore;
-using namespace RT_GestureHelper;
 // constants
 const int KPageOverviewScrollPeriodic = 20 * 1000; // Update frequently for faster, smoother scrolling
 const int KMicroInterval = 300000;
 const int KPageOverviewScrollStart = 1000;
 const int KCancelDecelerationTimeout = 200000; //Decelerate only if flicked KCancelDecelerationTimeout microsec after last drag event.
 
+#ifdef BRDO_PERF_IMPROVEMENTS_ENABLED_FF
+const int KScrollIntervalTimeout = 30000; // scroll timer interval in microseconds
+#else
 const int KScrollIntervalTimeout = 40000; // scroll timer interval in microseconds
+#endif
+
 const int KAngularDeviationThreshold = 160; // % deviation ignored from minor axis of motion(120 means 20 %)
 const int KScrollThresholdPixels = 10; // scrolls only if delta is above this threshold
 const int KScrollDirectionBoundary = 30; // Bound around focal point within which scrolling locks in X or Y states
@@ -87,7 +91,13 @@
 WebFrameView* ScrollableView::activeFrameView()
 {
     if (m_scrollingElement) {
-        return kit(m_scrollingElement->document()->frame())->frameView();
+        Frame* frame = m_scrollingElement->document()->frame();
+        if(frame) {
+            return kit(frame)->frameView();
+        }
+        else {
+            return NULL;
+        }
     }
     else {
         return m_frameView;
@@ -127,8 +137,8 @@
 //
 void WebPageScrollHandler::constructL()
     {
-        m_scrollTimer = CPeriodic::NewL(CActive::EPriorityUserInput - 1);
-        m_pageOverviewScrollPeriodic = CPeriodic::NewL(CActive::EPriorityUserInput - 1);
+        m_scrollTimer = CPeriodic::NewL(CActive::EPriorityUserInput);
+        m_pageOverviewScrollPeriodic = CPeriodic::NewL(CActive::EPriorityUserInput);
         m_lastPosition = TPoint(0, 0);
         m_scrollbarDrawer = WebScrollbarDrawer::NewL();
         if(AknLayoutUtils::PenEnabled()) {
@@ -372,12 +382,14 @@
             bool shouldScrollHorizontally = false;
             WebFrame* frame = kit(m_scrollableView.m_scrollingElement->document()->frame());
             RenderObject* render = m_scrollableView.m_scrollingElement->renderer();
-            __ASSERT_DEBUG(render->isScrollable(), User::Panic(_L(""), KErrGeneral));
-            if (aScrollDelta.iY)
-                shouldScrollVertically = !render->scroll(ScrollDown, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iY / 100);
-            if (aScrollDelta.iX)
-                shouldScrollHorizontally = !render->scroll(ScrollRight, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iX / 100);
-
+            if(render) //check if render exits before using it
+                {
+                __ASSERT_DEBUG(render->isScrollable(), User::Panic(_L(""), KErrGeneral));
+                if (aScrollDelta.iY)
+                  shouldScrollVertically = !render->scroll(ScrollDown, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iY / 100);
+                if (aScrollDelta.iX)
+                  shouldScrollHorizontally = !render->scroll(ScrollRight, ScrollByPixel, frame->frameView()->toDocCoords(aScrollDelta).iX / 100);
+                }
             TPoint scrollPos = frame->frameView()->contentPos();
             TPoint newscrollDelta = frame->frameView()->toDocCoords(aScrollDelta);
             m_currentNormalizedPosition +=  newscrollDelta;     
@@ -392,7 +404,7 @@
             
             if (shouldScrollVertically || shouldScrollHorizontally){
                 if (m_scrollableView.m_frameView->needScroll(scrollPos)) {
-                    frame->frameView()->scrollTo(scrollPos);
+                    frame->frameView()->scrollTo(scrollPos, ETrue);
                     updateScrollbars(scrollPos, newscrollDelta);
                     core(frame)->sendScrollEvent();
                 }
@@ -419,8 +431,8 @@
                 m_currentNormalizedPosition.iY = m_scrollableView.contentPos().iY * 100;
             }
             else {
-          
-                m_scrollableView.m_frameView->scrollTo(scrollPos);
+
+                m_scrollableView.m_frameView->scrollTo(scrollPos, ETrue);
                 m_lastPosition = m_currentPosition;
 #ifndef BRDO_USE_GESTURE_HELPER                
                 m_decel->updatePos();
@@ -559,25 +571,32 @@
     Element* currElement = NULL;
     if(!e) return NULL;
     RenderObject* render = e->renderer();
-    if (render && render->isScrollable()) {
+    if(render) {
         RenderLayer* layer = render->enclosingLayer();
         Element* parent = e;
-        currElement = e;
-        while (!currElement->isControl() && parent && parent->renderer() && parent->renderer()->enclosingLayer() == layer) {
-            currElement = parent;
-            Node* pn = parent;
-            do {
-                pn = pn->parent();
-            } while (pn && !pn->isElementNode());
-            parent = static_cast<Element*>(pn);
+
+        if (e->isControl()) {
+            if (render->isScrollable()) {
+            currElement = e;
+            }
+        }
+        else {
+            while (parent && parent->renderer()) {
+                if (parent->renderer()->isScrollable()) {
+                    currElement = parent;
+                    break;
+                    }
+                parent = static_cast<Element*>(parent->parent());
+                }
         }
         if (currElement) {
+            //check for current element which is scrollable
             currElement->ref();
-            m_scrollableView.m_scrollingElement = currElement; 
+            m_scrollableView.m_scrollingElement = currElement;
             m_scrollableView.m_frameView = NULL;
             return true;
+            }
         }
-    }
     return false;
 }
 
@@ -596,9 +615,9 @@
 }
 
 
-void WebPageScrollHandler::handleScrollingGH(const TGestureEvent& aEvent)
+void WebPageScrollHandler::handleScrollingGH(const TStmGestureEvent& aGesture)
 {   
-    TPoint newPos = aEvent.CurrentPos();
+    TPoint newPos = aGesture.CurrentPos();
     m_currentPosition = newPos;
     if (m_webView->inPageViewMode()) {
         if (!m_pageOverviewScrollPeriodic->IsActive()){
@@ -614,9 +633,9 @@
 }
 
 
-void WebPageScrollHandler::handleTouchDownGH(const TGestureEvent& aEvent)
+void WebPageScrollHandler::handleTouchDownGH(const TStmGestureEvent& aGesture)
 {
-    TPoint newPos = aEvent.CurrentPos();
+    TPoint newPos = aGesture.CurrentPos();
     m_lastMoveEventTime = 0; 
     m_lastPosition = newPos;
     m_currentPosition = newPos;
@@ -631,16 +650,19 @@
 }
 
 
-void WebPageScrollHandler::handleTouchUpGH(const TGestureEvent& aEvent)
+void WebPageScrollHandler::handleTouchUpGH(const TStmGestureEvent& aGesture)
 {
     bool decelDoesScrollbars = false;
-    TPoint newPos = aEvent.CurrentPos();
+    TPoint newPos = aGesture.CurrentPos();
 
     if (m_webView->inPageViewMode()) {
         if (m_pageOverviewScrollPeriodic->IsActive()){ 
             m_pageOverviewScrollPeriodic->Cancel();
         }
         m_webView->closePageView();
+        PluginSkin* plugin = m_webView->mainFrame()->focusedPlugin();
+        if(plugin)
+            plugin->setPluginWinClipedRect();
         scrollPageOverviewGH();
         m_webView->setViewIsScrolling(false);
         m_webView->toggleRepaintTimer(true);
@@ -648,7 +670,7 @@
     else {
         m_scrollTimer->Cancel();
         m_lastPosition = TPoint(0, 0);
-        decelDoesScrollbars = startDeceleration(aEvent);
+        decelDoesScrollbars = startDeceleration(aGesture);
                     
         if (m_webView->viewIsScrolling()) {
             Frame* frame = m_webView->page()->focusController()->focusedOrMainFrame();
@@ -666,10 +688,10 @@
 }
 
 
-bool WebPageScrollHandler::startDeceleration(const TGestureEvent& aEvent)
+bool WebPageScrollHandler::startDeceleration(const TStmGestureEvent& aGesture)
 {
     bool started = false;
-    TRealPoint gstSpeed = aEvent.Speed();
+    TRealPoint gstSpeed = aGesture.Speed();
     if (Abs(gstSpeed.iX / gstSpeed.iY) <= KTanOfThresholdAngle) {
        gstSpeed.iX = 0;
     }
@@ -679,12 +701,19 @@
     }
     
     if ((Abs(gstSpeed.iX) > 0) || (Abs(gstSpeed.iY) > 0)) {
-       m_decelGH->startDecel(gstSpeed, m_scrollbarDrawer); 
-       started = true;
+        started = m_decelGH->startDecel(gstSpeed, m_scrollbarDrawer); 
     }
-    
-    
     return started;
 }
 
+void WebPageScrollHandler::stopScrolling()
+{
+    if (m_scrollTimer && m_scrollTimer->IsActive()) {
+        m_scrollTimer->Cancel();
+   }
+   if (m_scrollbarDrawer) { 
+       m_scrollbarDrawer->fadeScrollbar();
+   }
+   m_webView->setViewIsScrolling(false);
+}
 //  End of File