webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp
branchRCL_3
changeset 94 919f36ff910f
parent 93 79859ed3eea9
child 99 ca6d8a014f4b
--- a/webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp	Tue Aug 31 16:17:46 2010 +0300
+++ b/webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp	Wed Sep 01 12:28:30 2010 +0100
@@ -16,7 +16,7 @@
 */
 
 // INCLUDE FILES
-#include <Browser_platform_variant.hrh>
+#include <browser_platform_variant.hrh>
 #include <../bidi.h>
 #include <avkon.hrh>
 #include <apmrec.h>
@@ -30,11 +30,11 @@
 #else
 #include <Webkit.rsg>
 #endif
-#include <gulicon.h>
+#include <GULICON.h>
 #include <e32uid.h>
-#include <BrowserDialogsProvider.h>
+#include <browserdialogsprovider.h>
 //tot:fixme
-//#include <oom.h>
+//#include "oom.h"
 
 #include "config.h"
 #include "BrCtl.h"
@@ -44,7 +44,8 @@
 #include "WebDataLoadConsumer.h"
 #include "WebFormFillPopup.h"
 #include "WebPageFullScreenHandler.h"
-#include "pagescaler.h"
+#include "PageScaler.h"
+#include "ThumbnailGenerator.h"
 #include "HistoryController.h"
 #include "HistoryEntry.h"
 #include "HistoryInterface.h"
@@ -71,24 +72,28 @@
 #include "httpcachemanager.h"
 #include "ResourceLoaderDelegate.h"
 #include "EventHandler.h"
-#include "Timer.h"
-#include "Page.h"
-#include "Range.h"
-#include "FocusController.h"
+#include "timer.h"
+#include "page.h"
+#include "range.h"
+#include "focusController.h"
 #include "IconDatabase.h"
-#include "HttpDownload.h"
+#include "httpDownload.h"
 #include "BrCtlSoftkeysObserverImpl.h"
 #include "BrCtlSpecialLoadObserverImpl.h"
+#include "WebFrameBridge.h"
 #include "BrCtlLayoutObserverImpl.h"
 #include "BrCtlWindowObserverImpl.h"
 #include "WidgetExtension.h"
 #include "PluginSkin.h"
 #include "HttpUiCallbacks.h"
 #include "PluginWin.h"
-#include <CUserAgent.h>
+#include "GCController.h"
+#include <BrowserVersion.h>
+#include <cuseragent.h>
+#include "kjs_window.h" 
 
 #ifndef BRDO_WML_DISABLED_FF
-#include "WmlInterface.h"
+#include "wmlinterface.h"
 #include "WmlInterfaceImpl.h"
 #include "WmlEngineInterface.h"
 #endif
@@ -413,9 +418,12 @@
    , m_commandIdBase(aCommandIdBase)
    , m_capabilities(aBrCtlCapabilities)
    , m_suspendTimers(false)
+   , m_pageLoadFinished(false)
    , m_wmlEngineInterface(NULL)
    , m_brCtlDownloadObserver(aBrCtlDownloadObserver)
    , m_windoCloseTimer(NULL)
+   , m_didFirstLayout(false)
+   , m_NotifyPluginFocusChangeEvent(false)
 {
     m_documentHeight = 0;
     m_displayHeight = 0;
@@ -476,7 +484,7 @@
     // Create and initialize the Layout Observer
     if (m_brCtlLayoutObserver == NULL)
         {
-        m_brCtlLayoutObserver = new (ELeave) CBrCtlLayoutObserver();
+        m_brCtlLayoutObserver = new (ELeave) CBrCtlLayoutObserver(m_webView);
         m_ownsLayoutObserver = true;
         }
     // Create and initialize the Dialog Provider
@@ -494,11 +502,12 @@
         }
     
     LoadResourceFileL();
+
+    MemoryManager::InitOOMDialog();
+    
     // Set the rect for BrowserControl (a CCoeControl).
     SetRect(aRect);
     CCoeEnv::Static()->DisableExitChecks(true);
-    Window().AllocPointerMoveBuffer(256, 0);
-    Window().DisablePointerMoveBuffer();
     Window().PointerFilter(EPointerFilterMove | EPointerFilterDrag | EPointerFilterEnterExit, 0);
     ActivateL();
 }
@@ -582,16 +591,25 @@
 
     switch (aLoadEvent) {
         case TBrCtlDefs::EEventNewContentStart:
+            m_pageLoadFinished = false;
             if (m_webView->pageScalerEnabled())
                 m_webView->pageScaler()->DocumentStarted();
             if (m_webView->formFillPopup() && m_webView->formFillPopup()->IsVisible()) 
                 m_webView->formFillPopup()->handleCommandL(TBrCtlDefs::ECommandCancel);            
             break;
+        case TBrCtlDefs::EEventNewContentDisplayed:
+            if(m_brCtlLayoutObserver && m_webView && !m_didFirstLayout)  {
+                m_brCtlLayoutObserver->NotifyLayoutChange( (webView()->mainFrame()->bridge()->m_rtl ? EOriginTopRight : EOriginTopLeft));
+                m_didFirstLayout = true;
+            }
+            break;
         case TBrCtlDefs::EEventContentFinished:
         case TBrCtlDefs::EEventUploadFinished:
+            m_pageLoadFinished = true;
+            m_didFirstLayout= false;
             if (m_suspendTimers) {
-                m_suspendTimers = false;
-                HandleCommandL(TBrCtlDefs::ECommandAppBackground);
+                m_suspendTimers = false;                
+                m_webView->pauseJsTimers();
             }
 #ifndef BRDO_WML_DISABLED_FF
             if (m_wmlUnloadPending)
@@ -653,11 +671,19 @@
                     if (coreFrame)
                         coreFrame->eventHandler()->deactivatedEvent();
                 }
+                m_webView->setEditable(EFalse);
                 break;
             }
         case TBrCtlDefs::ECommandCancelFetch:
             {
-                m_webView->mainFrame()->stopLoading();
+                m_webView->Stop();
+                break;
+            }
+
+        case TBrCtlDefs::ECommandOOMExit:
+            {
+                WebCore::gcController().startedExit(true); 
+                KJS::setDeferringJSTimers(true); 
                 break;
             }
 
@@ -692,6 +718,9 @@
             {
                 if (m_webView->pageView()) {
                     m_webView->closePageView();
+                    PluginSkin* plugin = m_webView->mainFrame()->focusedPlugin();
+					if(plugin)
+						plugin->setPluginWinClipedRect();
                 } else {
                     if (m_historyHandler->historyController()->historyView()) {
                         // this is a weird way of managing history view. needs fixing
@@ -763,20 +792,34 @@
                     setDeferringTimers(false);
                 m_suspendTimers = false;
 #endif
-
+                m_webView->resumeJsTimers();
                 break;
             }
         case TBrCtlDefs::ECommandAppBackground:
             {
 #ifndef PERF_REGRESSION_LOG
-                if (m_webView->isLoading())
-                    m_suspendTimers = true;
-                else if (!isDeferringTimers())
-                    setDeferringTimers(true);
+                if(m_webView->widgetExtension())
+                    {
+                    if(m_pageLoadFinished)
+                        m_webView->pauseJsTimers();                        
+                    else 
+                        m_suspendTimers = true;
+                    }
+                else
+                    {
+                    if (m_webView->isLoading())
+                        m_suspendTimers = true;
+                    else 
+                        m_webView->pauseJsTimers();                        
+                        
+                    }
 #endif
 
                 //Disable the zooming bar when it goes to background
                 m_webView->hideZoomSliderL();
+                m_webView->scrollStatus(false); 
+                // Instruct JS to garbage collect
+                WebCore::gcController().garbageCollectSoon();                
                 break;
             }
         case TBrCtlDefs::ECommandClearAutoFormFillData:
@@ -932,6 +975,7 @@
 
        case TBrCtlDefs::ECommandEnterFullscreenBrowsing:
             {
+             m_webView->resumeJsTimers();
              m_webView->EnterFullscreenBrowsingL();
              break;
             }
@@ -942,6 +986,81 @@
              break;
             }
 
+       case TBrCtlDefs::ECommandSetRetryConnectivityFlag:
+            {
+            StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->setRetryConnectivityFlag();
+            break;
+            }
+       case TBrCtlDefs::ECommandUnSetRetryConnectivityFlag:
+            {
+            StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->unSetRetryConnectivityFlag();
+            break;
+            }
+       case TBrCtlDefs::ECommandRetryTransactions:
+            {
+             StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->retryTransactions();
+             m_webView->mainFrame()->reCreatePlugins(); 
+             break;
+            }
+       case TBrCtlDefs::ECommandClearQuedTransactions:
+           {
+           StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->handleError(KErrCancel);
+           break;
+           }
+       case TBrCtlDefs::ECommandConnToDownloadManager:
+           {
+           TInt connectionPtr = 0;
+           TInt sockSvrHandle = 0;
+           TBool newConn = ETrue;
+           TApBearerType bearerType;
+           TInt error = KErrNone;
+           
+           TRAP(error, m_brCtlSpecialLoadObserver->NetworkConnectionNeededL(&connectionPtr, &sockSvrHandle, &newConn, &bearerType));
+           if( error == KErrNone && connectionPtr ) 
+               {
+               RConnection* connPtr = REINTERPRET_CAST( RConnection*, connectionPtr );
+               TName name;
+               connPtr->Name( name );
+               StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->httpDownload()->connect(name);
+               }
+           break;
+           }
+       case TBrCtlDefs::ECommandLoseFocus:
+       case TBrCtlDefs::ECommandPauseScriptTimers:
+           {
+           m_webView->pauseJsTimers();
+           break;
+           }
+           
+       case TBrCtlDefs::ECommandGainFocus:
+       case TBrCtlDefs::ECommandResumeScriptTimers:
+           {
+           m_webView->resumeJsTimers();
+           break;
+           }
+       case TBrCtlDefs::ECommandCancelQueuedTransactions:
+           {
+           StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->cancelQueuedTransactions();
+		   break;
+           }
+
+	   // Messages sent by OOM monitor
+       case TBrCtlDefs::ECommandFreeMemory:
+           {
+           MemoryManager::FreeRam(); // invoke memory collect operation
+           break;
+           }
+       case TBrCtlDefs::ECommandMemoryGood:
+           {
+           MemoryManager::RestoreCollectors(); // restore collectors
+           break;
+           }
+       case TBrCtlDefs::ECommandNotifyPluginFocusChangeEvent:
+           {
+           m_NotifyPluginFocusChangeEvent = true;
+           break;
+           }
+                  
       default:
             {
             if ( m_wmlEngineInterface &&
@@ -974,6 +1093,13 @@
         }
 }
 
+
+EXPORT_C TBool CBrCtl::IsSynchRequestPending()
+    {
+    return m_webView->isSynchRequestPending();
+    }
+
+
 // -----------------------------------------------------------------------------
 // CBrCtl::HandleDownloadCommandL
 // This method calls to download manager in order to send commands to the DlMgr
@@ -1149,7 +1275,9 @@
     }
 
     int after = aAfter == -1 ? aAfter :0;
-    TBrCtlDefs::TBrCtlElementType focusedElementType = FocusedElementType();
+    TBrCtlDefs::TBrCtlElementType focusedElementType = TBrCtlDefs::EElementNone;
+    if(m_webView)
+       focusedElementType = FocusedElementType();
 
     int count = sizeof(commandsArray) / sizeof(TCommandsArray);
     bool found = false;
@@ -1175,9 +1303,11 @@
     // tot fixme
     //TPluginControl pluginControl(*iWebKitControl);
     //pluginControl.AddPluginOptionMenuItemsL(aMenuPane, TBrCtlDefs::ECommandIdPluginBase, aAfter);
-    PluginSkin* plugin = m_webView->mainFrame()->focusedPlugin();
-    if(plugin && plugin->pluginWin())
-        plugin->pluginWin()->addPluginOptionsL(aMenuPane, TBrCtlDefs::ECommandIdPluginBase, aAfter );
+    if(m_webView) {
+        PluginSkin* plugin = m_webView->mainFrame()->focusedPlugin();
+        if(plugin && plugin->pluginWin())
+            plugin->pluginWin()->addPluginOptionsL(aMenuPane, TBrCtlDefs::ECommandIdPluginBase, aAfter );
+    }
 
 }
 
@@ -1502,10 +1632,10 @@
           return versionInfo;
           }
 
-      /*case TBrCtlDefs::EVersionInfoBuild:
+      case TBrCtlDefs::EVersionInfoBuild:
           {
           return MobileBrowserBuild.AllocLC();
-          }*/
+          }
 
         case TBrCtlDefs::EBrowserVersion:
           {
@@ -1651,6 +1781,9 @@
         User::Leave(KErrArgument);
     // convert to 8
 
+    // reset timers ptr, if paused from last page
+    m_webView->resetJsTimers();
+        
     _LIT(KJs, "javascript:");
     if (url.Length() > KJs().Length()) {
         if (url.Left(KJs().Length()).FindF(KJs) == 0) {
@@ -1776,6 +1909,11 @@
         }
         else if(m_webView->mainFrame()->frameLoader()->checkScheduledRedirection())
           m_webView->mainFrame()->frameLoader()->startRedirectionTimerNow();
+        
+        if( m_NotifyPluginFocusChangeEvent ) {
+           m_NotifyPluginFocusChangeEvent = false; 
+           webView()->mainFrame()->notifyPluginFocusChangeEvent(visible);
+          }
         m_webView->MakeVisible(visible);
     }
 
@@ -1783,7 +1921,7 @@
         m_webView->checkForZoomChange();
     }
 
-    if( m_webView->pageFullScreenHandler() && m_webView->pageFullScreenHandler()->isFullScreenMode() ) {
+    if(m_webView && m_webView->pageFullScreenHandler() && m_webView->pageFullScreenHandler()->isFullScreenMode() ) {
         if (visible)
             m_webView->pageFullScreenHandler()->showEscBtnL();
         else
@@ -2007,7 +2145,12 @@
 
 EXPORT_C TBool CBrCtl::OkToExit()
 {
-    return WebCore::StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->httpDownload()->okToExit();
+    HttpDownload* httpDownload = WebCore::StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->httpDownload();
+    if ( httpDownload )
+        {
+        return httpDownload->okToExit();
+        }
+    return ETrue;
 }
 
 EXPORT_C CGulIcon* CBrCtl::GetBitmapData(const TDesC& aUrl, TBrCtlDefs::TBrCtlBitmapInfo aBitmapInfo)
@@ -2021,8 +2164,14 @@
                 if ( entry ) {
                     CFbsBitmap* bitmap = entry->thumbnail();
                     if(!bitmap) {
-                        // get scaled page from PageScaler;
-                        bitmap = m_webView->pageScaler()->ScaledPage();
+                        if(m_webView->pageThumbnailGenerator()) {
+                            //get the page thumbnail  
+                            bitmap = m_webView->pageThumbnailGenerator()->PageThumbnail();
+                        }
+                        else {
+                           // get scaled page from PageScaler;
+                           bitmap = m_webView->pageScaler()->ScaledPage();
+                        }
                     }
                     if(bitmap) {
                         // update the history with new bitmap
@@ -2075,6 +2224,7 @@
          if(StaticObjectsContainer::instance()->isPluginFullscreen())
          {
             PluginSkin* plugin=m_webView->mainFrame()->focusedPlugin();
+            if(plugin)
             plugin->deActivate();
          }
          newBrctl = m_brCtlWindowObserver->OpenWindowL(emptyUrl, &windowName, userGesture, 0);            
@@ -2106,7 +2256,15 @@
 {
     m_windoCloseTimer->Cancel();
     if (brCtlWindowObserver())
-        TRAP_IGNORE(brCtlWindowObserver()->HandleWindowCommandL(KNullDesC(), ECloseWindow));
+        {
+        TRAPD(err,brCtlWindowObserver()->HandleWindowCommandL(KNullDesC(), ECloseWindow));
+		if ( err == KLeaveExit )
+		    { // while we exit the browser it actually leaves with KLeaveExit from the system.
+		      // If we block this here then the exit would not happen so propogate the leave 
+		      // condition to the system for handling
+		    User::Leave(KLeaveExit);
+		    }        
+        }
 }
 
 TBool CBrCtl::sendCommandsToClient(
@@ -2434,6 +2592,13 @@
     }
 }
 
+CWidgetExtension* CBrCtl::getWidgetExt()
+{
+    if ( m_webView) {
+        return m_webView->widgetExtension();
+    }
+    return NULL;
+}
 
 int CBrCtl::getMainScrollbarWidth() const
 {
@@ -2450,9 +2615,7 @@
 
 
 
-void CBrCtl::HandlePointerBufferReadyL()
-{
-    m_webView->HandlePointerBufferReadyL();
-}
 
 
+
+