webengine/osswebengine/WebKit/s60/webview/WebView.cpp
changeset 5 10e98eab6f85
parent 1 7c90e6132015
child 10 a359256acfc6
--- a/webengine/osswebengine/WebKit/s60/webview/WebView.cpp	Fri May 08 08:25:06 2009 +0300
+++ b/webengine/osswebengine/WebKit/s60/webview/WebView.cpp	Fri Jul 03 15:54:40 2009 +0100
@@ -59,6 +59,7 @@
 #include "PluginSkin.h"
 #include "PluginWin.h"
 #include "PluginPlayer.h"
+#include "WebKitLogger.h"
 
 
 #include "Page.h"
@@ -83,6 +84,10 @@
 #include "WidgetExtension.h"
 #include "Cache.h"
 #include "RenderWidget.h"
+#include "HTMLNames.h"
+#include "HTMLInputElement.h"
+
+using namespace HTMLNames;
 
 #include <AknUtils.h>
 #include <CUserAgent.h>
@@ -98,6 +103,7 @@
 
 const int KRepaintDelayLoading = 500*1000; // dont do repaints more often than this during loading (0.5s)
 const int KRepaintDelayComplete = 100*1000; // faster updates after load so dynamic scripts etc have better frame rate (0.1s)
+const int KRepaintDelayNavNone = 70*1000;
 const int KNormalScrollRange = 60;
 
 const int KPanningStartSpeed = 30;
@@ -185,7 +191,6 @@
 , m_pageFullScreenHandler(NULL)
 , m_viewIsScrolling(false)
 , m_ptrbuffer(0)
-, m_pluginActivated(false)
 , m_showCursor(false)
 , m_allowRepaints(true)
 {
@@ -200,6 +205,8 @@
     delete m_pageZoomHandler;
     m_pageZoomHandler = NULL;
 
+    m_zoomLevelArray.Close();
+
     // prevent frameViews to access members when topView is
     // closing down.
     m_isClosing = true;
@@ -229,6 +236,8 @@
     delete m_tabbedNavigation;
     delete m_userAgent;
     delete m_pageFullScreenHandler;
+    delete m_bridge;
+    delete m_frameView;
 }
 
 // -----------------------------------------------------------------------------
@@ -242,7 +251,7 @@
 
     CCoeControl::MakeVisible(ETrue);
 
-    WebFrameView *frameView = new WebFrameView();
+    m_frameView = new WebFrameView();
     m_page = new Page(new WebChromeClient(this), new WebContextMenuClient(), new WebEditorClient(this), new WebDragClient(), new WebInspectorClient());
     m_page->backForwardList()->setCapacity(0);
     m_page->setGroupName("com.s60.browser");
@@ -261,8 +270,8 @@
 
     m_tabbedNavigation = new WebTabbedNavigation(this);
 
-    WebFrameBridge* bridge = new WebFrameBridge();
-    bridge->initMainFrameWithPage(m_page, "", frameView);
+    m_bridge = new WebFrameBridge();
+    m_bridge->initMainFrameWithPage(m_page, "", m_frameView);
 
     // Create and offscreen device and context
     m_bitmapdevice = CFbsBitmapDevice::NewL( StaticObjectsContainer::instance()->webSurface()->offscreenBitmap() );
@@ -364,7 +373,7 @@
 //-------------------------------------------------------------------------------
 void WebView::Draw( const TRect& rect ) const
 {
-    if (m_pluginFullscreen) return;
+    if (StaticObjectsContainer::instance()->isPluginFullscreen()) return;
 
     CWindowGc& gc = SystemGc();
     CEikBorderedControl::Draw( rect );
@@ -549,7 +558,7 @@
       return;
     }
 
-    if (isPluginFullscreen()) return;
+    if (StaticObjectsContainer::instance()->isPluginFullscreen()) return;
     CFbsBitGc& gc = m_webcorecontext->gc();
     gc.Reset();
 
@@ -561,6 +570,15 @@
         layoutPending = f->view()->layoutPending();
         f = f->tree()->traverseNext();
     }
+
+    if (layoutPending && m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) {
+        Frame* f = m_page->mainFrame();
+        while ( f ) {
+            f->view()->layout();
+            f = f->tree()->traverseNext();
+        }
+        layoutPending = false;
+    }
     if (!layoutPending) {
         bool needsDraw = false;
         m_repaints.Tidy();
@@ -588,8 +606,11 @@
     // tot:fixme TBool complete = iWebkitControl->IsProgressComplete(); && CImageRendererFactory::Instance()->DecodeCount()==0;
 
     TBool complete = ETrue;
+    int timeout = complete ? KRepaintDelayComplete : KRepaintDelayLoading;
+    if (complete && m_brctl->settings() && m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone)
+        timeout = KRepaintDelayNavNone;
     if ( !m_pageZoomHandler->isActive() && m_allowRepaints){
-        m_repainttimer->Start(complete ? KRepaintDelayComplete : KRepaintDelayLoading,
+        m_repainttimer->Start(timeout,
         0, TCallBack( &doRepaintCb, this ) );
     }
     // need to draw formfill popup here.
@@ -633,15 +654,23 @@
 //-------------------------------------------------------------------------------
 void WebView::collectOffscreenbitmapL(CFbsBitmap& snapshot)
 {
-
-    (snapshot).Create(m_brctl->Size(), StaticObjectsContainer::instance()->webSurface()->displayMode());
-
+    if ( snapshot.Handle() == 0) {
+        // Create bitmap only once
+        (snapshot).Create(m_brctl->Size(), StaticObjectsContainer::instance()->webSurface()->displayMode());
+    }
     CFbsBitmapDevice* device = CFbsBitmapDevice::NewL( &snapshot);
     CleanupStack::PushL(device);
 
     WebCoreGraphicsContext* gc = WebCoreGraphicsContext::NewL( device, &snapshot, mainFrame()->frameView());
     CleanupStack::PushL(gc);
-
+    
+    if( snapshot.Handle() != 0 ){
+        // Clear previous offscreen bitmap
+        // frameView->draw might clear the bitmap.
+        gc->gc().Clear();
+    } else if (snapshot.SizeInPixels()!=m_brctl->Size()){
+          snapshot.Resize(m_brctl->Size());
+    }
     mainFrame()->frameView()->draw( *gc, mainFrame()->frameView()->visibleRect() );
 
     CleanupStack::PopAndDestroy(2);
@@ -673,34 +702,40 @@
 
 void WebView::pageLoadFinished()
 {
+    if (m_brctl->settings()) {
+        switch (m_brctl->settings()->getNavigationType()) {
+            case SettingsContainer::NavigationTypeTabbed:
+                m_tabbedNavigation->initializeForPage();
+                break;
+            case SettingsContainer::NavigationTypeNone:
+                break;
+            case SettingsContainer::NavigationTypeCursor:
+            {
 
-    if (m_brctl->settings() && m_brctl->settings()->getTabbedNavigation()) {
-        m_tabbedNavigation->initializeForPage();
-    }
-    else {
+                // Temp solution to fix a problem with scrolling large pages:
+                // if user starts scrolling while loading a page - at the end of the load we should not restore
+                // the content position from the history controller
+                // As of now scroll events are not passed to WebCore and this will be changed in future
+                // then this code should be replaces with the commented one below
 
-        // Temp solution to fix a problem with scrolling large pages:
-        // if user starts scrolling while loading a page - at the end of the load we should not restore
-        // the content position from the history controller
-        // As of now scroll events are not passed to WebCore and this will be changed in future
-        // then this code should be replaces with the commented one below
+                TPoint ptInit(0,0);
+                TPoint ptFromHistory = m_brctl->historyHandler()->historyController()->currentEntryPosition();
+                TPoint ptCurr = mainFrame()->frameView()->contentPos();
 
-        TPoint ptInit(0,0);
-        TPoint ptFromHistory = m_brctl->historyHandler()->historyController()->currentEntryPosition();
-        TPoint ptCurr = mainFrame()->frameView()->contentPos();
-
-        if ( ptCurr != ptFromHistory ) {
-            if ( ptInit == ptCurr ) {
-                mainFrame()->frameView()->scrollTo(ptFromHistory);
-            }
-            else {
-                m_brctl->historyHandler()->historyController()->updateCurrentEntryPositionIfNeeded();
+                if ( ptCurr != ptFromHistory ) {
+                    if ( ptInit == ptCurr ) {
+                        mainFrame()->frameView()->scrollTo(ptFromHistory);
+                    }
+                    else {
+                        m_brctl->historyHandler()->historyController()->updateCurrentEntryPositionIfNeeded();
+                    }
+                }
+                /*
+                if ( !core(mainFrame())->view()->wasScrolledByUser())
+                    mainFrame()->frameView()->scrollTo(m_brctl->historyHandler()->historyController()->currentEntryPosition());*/
+                break;
             }
         }
-        /*
-        if ( !core(mainFrame())->view()->wasScrolledByUser())
-            mainFrame()->frameView()->scrollTo(m_brctl->historyHandler()->historyController()->currentEntryPosition());*/
-
     }
 
     if (FrameLoadTypeStandard == core( mainFrame())->loader()->loadType()){
@@ -787,6 +822,8 @@
     return rv;
 }
 
+
+
 bool WebView::isNaviKey(const TKeyEvent& keyevent)
 {
     return (    keyevent.iCode == EKeyUpArrow         // North
@@ -800,24 +837,26 @@
              || keyevent.iCode == EStdKeyDevice13     //   : Extra KeyEvent supports diagonal event simulator wedge
              || keyevent.iCode == EKeyLeftArrow       // West
              || keyevent.iCode == EKeyLeftUpArrow     // Northwest
-             || keyevent.iCode == EStdKeyDevice10);
+             || keyevent.iCode == EStdKeyDevice10); 
 }
 
 bool WebView::handleEditable(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame )
 {
     bool consumed = false;
+    if (eventcode == EEventKeyDown)
+        return false;
     consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
     // exit input on up/down key
     // EXCEPT on touch-enabled devices. We'll just consume in that case
     if ( !consumed && isNaviKey(keyevent) ) {
         if (m_webfeptexteditor->validateTextFormat() ) {
             setFocusNone();
-        }
+        } 
         else {
             consumed = true;
         }
     }
-
+    
     return consumed;
 }
 
@@ -836,23 +875,23 @@
     event.iPosition = pos;
     event.iModifiers = 0;
     event.iType = eventType;
-
+    
     switch (eventType) {
         case TPointerEvent::EButton1Down:
         {
             frame->eventHandler()->handleMousePressEvent(PlatformMouseEvent(event));
             break;
         }
-
-        case TPointerEvent::EButton1Up:
+    
+        case TPointerEvent::EButton1Up: 
         {
             frame->eventHandler()->handleMouseReleaseEvent(PlatformMouseEvent(event));
             break;
         }
-
+        
         case TPointerEvent::EMove:
         {
-            frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));
+            frame->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event)); 
             break;
         }
     };
@@ -875,49 +914,62 @@
     bool consumed = false;
 
     TKeyEvent oldKeyEvent(m_currentEventKey);
+    oldKeyEvent.iCode = keyevent.iCode; 
+    TEventCode oldKeyCode = m_currentEventCode;
     bool downEventConsumed = false;
-    if (m_currentEventCode == EEventKeyDown &&
-	keyevent.iCode != EKeyDevice3 ){
-        sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame);
-    }
     m_currentEventKey = keyevent;
     m_currentEventCode = eventcode;
-    if (keyevent.iCode == EKeyDevice3) {
-        // pass it to webcore
-        sendMouseEventToEngine(TPointerEvent::EButton1Down,
-	                        cursor->position(), frame);
 
-        // mimic ccb's behavior of onFocus
-        setFocusedNode(frame);
+    if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) {
+        consumed = handleInputElement(keyevent, eventcode, frame);
+        if (!consumed)
+            consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
+    }
+    else {
+        if (keyevent.iCode == EKeyDevice3) {
+                // pass it to webcore
+            sendMouseEventToEngine(TPointerEvent::EButton1Down, 
+	                            cursor->position(), frame);
+
+            // mimic ccb's behavior of onFocus
+            setFocusedNode(frame);
 
-       // Toolbar is activated on long key press only if the element
-       // type is EElementNone during EEventKeyDown and EEventKey.
-       // This prevents toolbar from popping up in DHTML pages. Also,
-       // toolbar is activated when the user is not in fast scroll
-       // mode, or in page overview mode, or on wml page.
-       if ( ( m_focusedElementType == TBrCtlDefs::EElementNone ||
-              m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) &&
-              keyevent.iRepeats && !m_brctl->wmlMode() ) {
-           launchToolBarL();
-       }
-       consumed = true;
+           // Toolbar is activated on long key press only if the element
+           // type is EElementNone during EEventKeyDown and EEventKey.
+           // This prevents toolbar from popping up in DHTML pages. Also,
+           // toolbar is activated when the user is not in fast scroll
+           // mode, or in page overview mode, or on wml page.
+           if ( ( m_focusedElementType == TBrCtlDefs::EElementNone ||
+                  m_focusedElementType == TBrCtlDefs::EElementBrokenImage ) &&
+                  keyevent.iRepeats && !m_brctl->wmlMode() ) {
+               launchToolBarL();
+           }
+           consumed = true;
+        } 
+        else if (isNaviKey(keyevent)) {
+
+            if (oldKeyCode == EEventKeyDown){
+                // Keydown event is automatically generated before each keypress event, but in this case
+                // we don't send a keypress event, so send a keydown event explicitly.
+                downEventConsumed = sendKeyEventToEngine(oldKeyEvent, EEventKeyDown, frame);
+            }
+          
+          
+            if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) {
+                consumed = downEventConsumed || handleTabbedNavigation(keyevent, eventcode);
+            }
+            else {
+                consumed = handleKeyNavigation(keyevent, eventcode, frame);
+            } 
+        } // if (m_brctl->settings()->getNavigationType()
+        else { // Not an arrow key..
+                 // activate hovered input element by just start typing
+              consumed = handleInputElement(keyevent, eventcode, frame);
+        }
+        if (!consumed && !(m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed && isNaviKey(keyevent))) {
+            consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
+        }
     }
-    else if (isNaviKey(keyevent)) {
-        if (m_brctl->settings()->getTabbedNavigation()) {
-            consumed = downEventConsumed || handleTabbedNavigation(keyevent, eventcode);
-        }
-        else {
-            consumed = handleKeyNavigation(keyevent, eventcode, frame);
-        }
-      } // if (m_brctl->settings()->getTabbedNavigation()
-      else { // Not an arrow key..
-             // activate hovered input element by just start typing
-          consumed = handleInputElement(keyevent, eventcode, frame);
-      }
-
-      if (!consumed) {
-          consumed = sendKeyEventToEngine(keyevent, eventcode, frame);
-      }
     return consumed;
 }
 
@@ -925,15 +977,22 @@
 bool WebView::handleInputElement(const TKeyEvent& keyevent, TEventCode eventcode, Frame* frame)
 {
     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
-    if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
-        m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
-        m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox ||
+    bool sendMousedEvent = false;
+    if (m_focusedElementType == TBrCtlDefs::EElementInputBox || 
         m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
-
+        sendMousedEvent = true;
+    }
+    else if (m_focusedElementType == TBrCtlDefs::EElementSelectBox ||
+        m_focusedElementType == TBrCtlDefs::EElementSelectMultiBox) {
+        if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone || keyevent.iCode == EKeyDevice3) {
+            sendMousedEvent = true;
+        }
+    }
+    if (sendMousedEvent) {
         sendMouseEventToEngine(TPointerEvent::EButton1Down, cursor->position(), frame);
         sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
-
-        if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
+    
+        if (m_focusedElementType == TBrCtlDefs::EElementInputBox || 
             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
             if (!m_fepTimer) {
                 m_fepTimer = new WebCore::Timer<WebView>(this, &WebView::fepTimerFired);
@@ -944,8 +1003,9 @@
         }
         m_keyevent = keyevent;
         m_eventcode = eventcode;
+        return true;
     }
-    return true;
+    return false; // not input element
 }
 
 
@@ -960,7 +1020,7 @@
     if (!cursor->isVisible()) {
         cursor->cursorUpdate(true);
     }
-
+    
     m_savedPosition = mainFrame()->frameView()->contentPos();
     cursor->scrollAndMoveCursor(keyevent.iCode, m_scrollingSpeed, fastscroll);
     updateScrollbars();
@@ -975,7 +1035,7 @@
     if (!fastscroll) {
         sendMouseEventToEngine(TPointerEvent::EMove, cursor->position(), frame);
     }
-
+    
     consumed = true;
     return consumed;
 }
@@ -984,7 +1044,7 @@
 bool WebView::handleMinimapNavigation()
 {
     int scrollingTime = millisecondsScrolled();
-    if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled &&
+    if (!AknLayoutUtils::PenEnabled() && m_pageScalerEnabled && 
           m_pageScaler && !isSmallPage() &&
           m_brctl->settings()->brctlSetting(TBrCtlDefs::ESettingsPageOverview) &&
          (scrollingTime > KPanningPageScalerStart || m_pageScaler->Visible())) {
@@ -1051,6 +1111,7 @@
     bool consumed = false;
     TInt delay = 2 * KCursorInitialDelay;
     WebCursor* cursor = StaticObjectsContainer::instance()->webCursor();
+    
     m_fastScrollTimer->Cancel();
     m_scrollingSpeed = KNormalScrollRange*100/scalingFactor();
 
@@ -1064,38 +1125,42 @@
     }
     m_pageScrollHandler->scrollbarDrawer()->fadeScrollbar(delay);
 
-    if ( (keyevent.iScanCode == EStdKeyDevice3) ||
-         (keyevent.iScanCode == EStdKeyEnter) ) {
-        // pass it to webcore
-
-        if (m_focusedElementType == TBrCtlDefs::EElementInputBox ||
+    if ( (keyevent.iScanCode == EStdKeyDevice3) || 
+       (keyevent.iScanCode == EStdKeyEnter) ) {
+    // pass it to webcore
+    
+        if (m_focusedElementType == TBrCtlDefs::EElementInputBox || 
             m_focusedElementType == TBrCtlDefs::EElementTextAreaBox) {
             setEditable(true);
         }
-        sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
-        consumed = true;
+        if (m_brctl->settings()->getNavigationType() != SettingsContainer::NavigationTypeNone) {
+            sendMouseEventToEngine(TPointerEvent::EButton1Up, cursor->position(), frame);
+            consumed = true;
+        }
     }
-      if (!consumed) {
-          sendKeyEventToEngine(keyevent, eventcode, frame);
-      }
-      m_currentEventKey = KNullKeyEvent;
-      m_currentEventCode = EEventNull;
+
+    if (!consumed) {
+
+        TKeyEvent correctedKeyEvent(keyevent);
+        correctedKeyEvent.iCode = m_currentEventKey.iCode; 
+        sendKeyEventToEngine(correctedKeyEvent, eventcode, frame);
+    }
+    m_currentEventKey = KNullKeyEvent;
+    m_currentEventCode = EEventNull;
     return consumed;
 }
 
 
-bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent,
+bool WebView::sendKeyEventToEngine(const TKeyEvent& keyevent, 
                                    TEventCode eventcode, Frame* frame)
 {
     bool consumed = frame->eventHandler()->keyEvent(PlatformKeyboardEvent(keyevent,eventcode));
-
-    if (!consumed && eventcode == EEventKey &&
+    if (!consumed && eventcode == EEventKey && 
         (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAccessKeys)) {
-
         TKeyEvent ke = keyevent;
         TChar c(ke.iCode);
         // Not consumed by WebCore, is alphanumeric and does not have any modifier
-        if (c.IsAlphaDigit() &&
+        if (c.IsAlphaDigit() && 
             !(ke.iModifiers & (EModifierCtrl | EModifierAlt | EModifierShift))) {
             ke.iModifiers = EModifierCtrl;
             frame->eventHandler()->keyEvent(PlatformKeyboardEvent(ke,EEventKeyDown));
@@ -1130,12 +1195,12 @@
     if (!coreFrame)
         return EKeyWasNotConsumed;
     coreFrame = page()->focusController()->focusedOrMainFrame();
-
+   
     // edit events
     if (m_isEditable) {
         consumed = handleEditable(keyevent, eventcode, coreFrame);
     }
-
+    
     // scroll events
     if (!consumed) {
         switch( eventcode ) {
@@ -1162,6 +1227,8 @@
         (displayPosY * scalingFactor()) / 100, (documentWidth * scalingFactor()) / 100, Rect().Width(),
         (displayPosX * scalingFactor()) / 100);
 }
+
+
 void WebView::updateScrollbars()
 {
     TPoint scrollDelta = mainFrame()->frameView()->contentPos() - m_savedPosition;
@@ -1177,6 +1244,7 @@
     }
 }
 
+
 void WebView::openPageViewL()
 {
     // don't show pageview if we are in lite mode
@@ -1404,28 +1472,6 @@
 
 void WebView::FocusChanged(TDrawNow aDrawNow)
 {
-if (m_isPluginsVisible && !m_pluginActivated) {
-        Frame* coreFrame =core(mainFrame());
-        MWebCoreObjectWidget* view = NULL;
-        TBool focus(IsFocused());
-        for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) {
-            PassRefPtr<HTMLCollection> objects = frame->document()->objects();
-            for (Node* n = objects->firstItem(); n; n = objects->nextItem()) {
-                view = widget(n);
-                if (view) {
-                    static_cast<PluginSkin*>(view)->viewFocusChanged(focus);
-                }
-            }
-
-            PassRefPtr<HTMLCollection> embeds = frame->document()->embeds();
-            for (Node* n = embeds->firstItem(); n; n = embeds->nextItem()) {
-                view = widget(n);
-                if (view) {
-                    static_cast<PluginSkin*>(view)->viewFocusChanged(focus);
-                }
-            }
-        }
-    }
     if (m_pageFullScreenHandler && m_pageFullScreenHandler->isFullScreenMode()) {
         if (IsFocused()) m_pageFullScreenHandler->showEscBtnL();
         else m_pageFullScreenHandler->hideEscBtnL();
@@ -1447,9 +1493,11 @@
     if (m_pageFullScreenHandler) {
         m_pageFullScreenHandler->SizeChanged();
     }
-    if (m_viewIsScrolling) {
+    
+    if (m_pageScrollHandler) {
         m_pageScrollHandler->scrollbarDrawer()->redrawScrollbar();
     }
+    
 }
 
 TSize WebView::maxBidiSize() const
@@ -1582,9 +1630,9 @@
 {
     if (!m_findKeyword) {
         WebFrame* frame = mainFrame()->findFrameWithSelection();
-        if (frame) {
-            frame->clearSelection();
-            }
+        if(frame) {
+			frame->clearSelection();
+        }
         return TBrCtlDefs::EFindNoMatches;
     }
     return search(*m_findKeyword, forward, true);
@@ -1681,8 +1729,12 @@
     TPtr8 ptr((TUint8 *)m_ptrbuffer,256*sizeof(TPoint));
 
     TInt numPnts = Window().RetrievePointerMoveBuffer(ptr);
-
-    for (int i = 0; i < numPnts; i++) {
+    int i = 0;
+    if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) {
+        if (numPnts > 20)
+            i = numPnts - 20;
+    }
+    for (; i < numPnts; i++) {
         TPointerEvent pe;
         pe.iType = TPointerEvent::EDrag;
         pe.iPosition = m_ptrbuffer[i];
@@ -1703,9 +1755,12 @@
 {
     if (name == "navigation") {
         if (value == "tabbed") {
-            m_brctl->settings()->setTabbedNavigation(true);
+            m_brctl->settings()->setNavigationType(SettingsContainer::NavigationTypeTabbed);
             StaticObjectsContainer::instance()->webCursor()->cursorUpdate(true);
         }
+        else if (value == "none") {
+            m_brctl->settings()->setNavigationType(SettingsContainer::NavigationTypeNone);
+        }
     }
 }
 
@@ -1884,7 +1939,7 @@
 //-------------------------------------------------------------------------------
 void WebView::resetZoomLevel(void)
 {
-    if(   m_widgetextension && m_widgetextension->IsWidgetPublising()) {
+    if( m_widgetextension ) {
         return ;
         }
     if (m_historyLoad) {
@@ -1962,8 +2017,10 @@
     {
        m_minZoomLevel = newMinZoomLevel;
       if (m_pageZoomHandler->isActive()) {
+          TRAP_IGNORE(
           m_pageZoomHandler->hideZoomSliderL();
           m_pageZoomHandler->showZoomSliderL();
+          );
       }
       else {
         UpdateZoomArray(); //for non-touch
@@ -2097,25 +2154,25 @@
 
   // Double Tap Zooming: it toggles between default, maxiZoomLevel.
   // Depending on the current zoom level:
-  //   A. If the current is already the max, it zooms to the max
+  //   A. If the current is already the max, it zooms to the max 
   //   B. If the current is bigger than/equal to the default zoom level zooms to the default, it zooms to the max
-  //   C. Otherwise it zooms to the default level first.
+  //   C. Otherwise it zooms to the default level first. 
   // For the mobile pages, such as google.com and cnn.com, minimum zoom level equals
   // to the default zoom level. Zooming is only possible between default and maximum
   // zoom level, double tap only won't reach logic C
   //
-  // For both mobile and non-mobile pages, it creates the same end user double tap
-  // experiences
-
+  // For both mobile and non-mobile pages, it creates the same end user double tap 
+  // experiences 
+  
     if (m_currentZoomLevel == m_maxZoomLevel ) {
-        zoomLevel = KZoomLevelDefaultValue;
+        zoomLevel = KZoomLevelDefaultValue;    	
     }
     else if (m_currentZoomLevel >= KZoomLevelDefaultValue ) {
         zoomLevel = m_maxZoomLevel;
-    }
+    }	
     else {
-        zoomLevel = KZoomLevelDefaultValue;
-    }
+        zoomLevel = KZoomLevelDefaultValue;    	
+    } 
 
     // move the content
     WebFrameView* view = mainFrame()->frameView();
@@ -2139,11 +2196,11 @@
 }
 
 //-------------------------------------------------------------------------------
-// WebView::openPluginPlayer
+// WebView::openPluginPlayerL
 // Called when user clicks a plugin which is able to accept user input,
 // this feature is only used in US build
 //-------------------------------------------------------------------------------
-void WebView::openPluginPlayer(PluginWin* plugin)
+void WebView::openPluginPlayerL(PluginWin* plugin)
 {
     if (!m_pluginplayer) {
         PluginSkin* pluginskin = mainFrame()->focusedPlugin();
@@ -2194,6 +2251,8 @@
 #endif
     }
 
+    //Widgets dont need memory cache for dead objects. hence set it to 0
+    cache()->setCapacities(0, 0, 0);
     return m_widgetextension;
 }
 
@@ -2327,7 +2386,7 @@
 }
 
 //-------------------------------------------------------------------------------
-// WebView::notifyFullscreenModeChangeL
+// WebView::nootifyFullscreenModeChangeL
 //-------------------------------------------------------------------------------
 void WebView::notifyFullscreenModeChangeL(bool mode)
 {
@@ -2389,32 +2448,6 @@
 void WebView::setRedirectWithLockedHistory(bool value) {
      m_redirectWithLockedHistory = value;
 }
-//-------------------------------------------------------------------------------
-// WebView::notifyPlugins
-// Webview notifies plugins to handle play/pause of .swf files when user switches to menu/another application
-//-------------------------------------------------------------------------------
-void WebView::notifyPlugins(TBool focus)
-{
-    Frame* coreFrame =core(mainFrame());
-    MWebCoreObjectWidget* view = NULL;
-    for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) {
-        PassRefPtr<HTMLCollection> objects = frame->document()->objects();
-        for (Node* n = objects->firstItem(); n; n = objects->nextItem()) {
-            view = widget(n);
-            if (view) {
-                static_cast<PluginSkin*>(view)->handlePluginForeground(focus);
-            }
-        }
-
-        PassRefPtr<HTMLCollection> embeds = frame->document()->embeds();
-        for (Node* n = embeds->firstItem(); n; n = embeds->nextItem()) {
-            view = widget(n);
-            if (view) {
-                static_cast<PluginSkin*>(view)->handlePluginForeground(focus);
-            }
-        }
-    }
-}
 
 
 void WebView::setFastScrollingMode(bool fastScrolling)
@@ -2519,4 +2552,56 @@
     StaticObjectsContainer::instance()->webCursor()->setCursorVisible(showCursor);
 }
 
+void WebView::focusedElementChanged(Element* element)
+{
+    Frame* frame = element->document()->frame();
+    WebFrameView* fv = kit(frame)->frameView();
+    if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed || m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeNone) {
+        if (!element || !element->document() ||!element->renderer()) return;
+        if (element->hasTagName(textareaTag) || (element->hasTagName(inputTag) && (reinterpret_cast<HTMLInputElement*>(element))->isTextField())) {
+            TPoint point = TRect(element->getRect()).iTl;
+            point = fv->frameCoordsInViewCoords(point);
+            StaticObjectsContainer::instance()->webCursor()->setPosition(point);
+            TPointerEvent event;
+            event.iPosition = StaticObjectsContainer::instance()->webCursor()->position();
+            event.iModifiers = 0;
+            event.iType = TPointerEvent::EMove;
+            core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));            
+            
+        }
+        else {
+            int x, y;
+            element->renderer()->absolutePosition(x, y);
+            Vector<IntRect> rects;
+            element->renderer()->absoluteRects(rects, x, y);
+            TPoint point;
+            if (rects.size() > 0) {
+                point = TPoint(rects[0].x(), rects[0].y());
+                point = fv->frameCoordsInViewCoords(point);
+                StaticObjectsContainer::instance()->webCursor()->setPosition(point);
+                TPointerEvent event;
+                event.iPosition = StaticObjectsContainer::instance()->webCursor()->position();
+                event.iModifiers = 0;
+                event.iType = TPointerEvent::EMove;
+                core(mainFrame())->eventHandler()->handleMouseMoveEvent(PlatformMouseEvent(event));            
+            }
+        }
+
+        if (m_brctl->settings()->getNavigationType() == SettingsContainer::NavigationTypeTabbed) { 
+            m_tabbedNavigation->focusedElementChanged(element);
+        }
+        // onload event on the first page could happen before the view becomes visible
+        m_savedCursorPosition = StaticObjectsContainer::instance()->webCursor()->position();
+        m_focusedElementType = nodeTypeB(element, frame);
+    }
+}
+
+void WebView::windowObjectCleared() const
+{
+    if (m_widgetextension) {
+        WebView* that = const_cast<WebView*>(this);
+        that->m_widgetextension->windowObjectCleared();
+    }
+}
+
 // END OF FILE