# HG changeset patch # User Dremov Kirill (Nokia-D-MSW/Tampere) # Date 1273587224 -10800 # Node ID 8bfb9186a8b80c154af9c9dd1c2f563efc3ff2dc # Parent 4917f9bf7995588333e881ec834c0fdc1bcdeebb Revision: 201018 Kit: 201019 diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/connectionmanager/Src/ConnManActiveConnector.cpp --- a/browserutilities/connectionmanager/Src/ConnManActiveConnector.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/connectionmanager/Src/ConnManActiveConnector.cpp Tue May 11 17:13:44 2010 +0300 @@ -195,7 +195,6 @@ { CLOG_WRITE( "CConnManActiveConnector: DoCancel called"); - iConnection.Close(); User::RequestComplete( iExternalRequestStatus, KErrCancel );//completing user req CLOG_WRITE( "CConnManActiveConnector: DoCancel returned"); diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/connectionmanager/Src/InternetConnectionManager.cpp --- a/browserutilities/connectionmanager/Src/InternetConnectionManager.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/connectionmanager/Src/InternetConnectionManager.cpp Tue May 11 17:13:44 2010 +0300 @@ -457,18 +457,17 @@ } else { + if(iConnection.SubSessionHandle() <= 0) + { + // RConnection handle is invalid, we haven't opened the RConnection yet. connErr = iConnection.Open( iServ, KAfInet ); + } CLOG_WRITE_1( "RConnection: %d", connErr ); if( connErr == KErrNone ) { // Always pass the IAP Id to RConnection even in silent mode connErr = iSyncConnector->Connect( overrides ); } - if( connErr != KErrNone ) - { - CLOG_WRITE( "Closing all" ); - iConnection.Close(); - } } } if ( iWaitDialog ) @@ -518,11 +517,6 @@ delete iCommsDb; } - if( iConnected ) - { - iConnection.Close(); - } - if( !iSilentMode ) // Temp fix for CDMA { @@ -537,8 +531,8 @@ delete iNoteDialog; delete iSyncConnector; iRFs.Close(); - - iServ.Close(); + iConnection.Close(); + iServ.Close(); CLOG_CLOSE; } @@ -652,11 +646,13 @@ CLOG_ENTERFN( "StopConnectionL()" ); StopConnectionObserving(); + if( iConnected ) { - CLOG_WRITE( "StopConnectionL() Stop the Connection" ); + CLOG_WRITE( "StopConnectionL() Stop the Connection" ); iConnection.Close(); - } + TInt err = iConnection.Open( iServ, KAfInet ); + } // iServ.Close(); iConnected = EFalse; @@ -1379,7 +1375,6 @@ { // this is a connection closed event CLOG_WRITE( "ConnectionStageAchievedL() Stoping the connection instead of closing" ); - iConnection.Close(); iConnected = EFalse; if( !iSilentMode ) @@ -2150,18 +2145,17 @@ if ( !connErr ) { + if(iConnection.SubSessionHandle() <= 0) + { + // RConnection handle is invalid, we haven't opened the RConnection yet. connErr = iConnection.Open( iServ, KAfInet ); + } CLOG_WRITE_1( "RConnection: %d", connErr ); if( connErr == KErrNone ) { //connect with snap id connErr = iSyncConnector->ConnectSnap( overrides ); } - if( connErr != KErrNone ) - { - CLOG_WRITE( "Closing all" ); - iConnection.Close(); - } } CleanupStack::PopAndDestroy();//overrides diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpDownload.cpp --- a/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpDownload.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/downloadmgr/DownloadMgrServEng/Src/HttpDownload.cpp Tue May 11 17:13:44 2010 +0300 @@ -6844,7 +6844,6 @@ if( downloadPathPlugin ) { GetUpdatedPathFromPluginL(downloadPathPlugin,rootPath,fileNamePtr); - CleanupStack::PopAndDestroy( downloadPathPlugin ); } else { @@ -6874,6 +6873,13 @@ #ifdef RD_MULTIPLE_DRIVE CleanupStack::PopAndDestroy( drivesDynList ); #endif + +#ifdef DOWNLOADMGR_PATH_PLUGIN_ENABLED_FF + if(downloadPathPlugin) + { + CleanupStack::PopAndDestroy( downloadPathPlugin ); + } +#endif CleanupStack::PopAndDestroy( &fs ); } diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadUtils.cpp --- a/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadUtils.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/downloadmgr/DownloadMgrUiLib/Src/CDownloadUtils.cpp Tue May 11 17:13:44 2010 +0300 @@ -46,6 +46,7 @@ _LIT8(Krng, "application/vnd.nokia.ringing-tone"); _LIT8(Krn, "application/vnd.rn-realmedia"); _LIT8(Kpn, "application/x-pn-realmedia"); +_LIT8(KWmdrmLicenseResponseContentType,"application/vnd.ms-wmdrm.lic-resp" ); // ============================ MEMBER FUNCTIONS =============================== @@ -236,7 +237,7 @@ CleanupStack::PopAndDestroy( docHandler ); // docHandler if ( !(aContentType.Compare(KOma2RoContentType)) || !(aContentType.Compare(KOma2ProtectedRoType)) - || !(aContentType.Compare(KOma2TriggerContentType)) ) + || !(aContentType.Compare(KOma2TriggerContentType)) || !(aContentType.Compare(KWmdrmLicenseResponseContentType)) ) { canOpen = EFalse; } @@ -273,6 +274,11 @@ return EFalse; } #endif + else if ( !(aContentType.Compare(KOma2RoContentType)) || !(aContentType.Compare(KOma2ProtectedRoType)) + || !(aContentType.Compare(KOma2TriggerContentType)) || !(aContentType.Compare(KWmdrmLicenseResponseContentType)) ) + { + return EFalse; + } else { TBool canOpen( EFalse ); diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/feedsengine/FeedsServer/Client/src/Feed.cpp --- a/browserutilities/feedsengine/FeedsServer/Client/src/Feed.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/feedsengine/FeedsServer/Client/src/Feed.cpp Tue May 11 17:13:44 2010 +0300 @@ -207,6 +207,8 @@ { aItemIds.Reset(); aItemStatus.Reset(); + CleanupClosePushL(aItemIds); + CleanupClosePushL(aItemStatus); // Add the item attributes. for (TInt i = 0; i < iItems.Count(); i++) @@ -214,6 +216,8 @@ User::LeaveIfError(aItemIds.Append(iItems[i]->Id())); User::LeaveIfError(aItemStatus.Append(iItems[i]->ItemStatus())); } + + CleanupStack::Pop(2); // aItemIds, aItemStatus } // ----------------------------------------------------------------------------- diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/feedsengine/FeedsServer/FeedHandler/src/FeedParser.cpp --- a/browserutilities/feedsengine/FeedsServer/FeedHandler/src/FeedParser.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/feedsengine/FeedsServer/FeedHandler/src/FeedParser.cpp Tue May 11 17:13:44 2010 +0300 @@ -295,6 +295,7 @@ const TDesC8& aNamespace, const TDesC8& aElementName, TInt aValueId, ElementHandlerFunctionL aHandler) { + CleanupClosePushL(aMappings); ElementHandlerMapEntry entry; // Init the entry. @@ -305,6 +306,7 @@ // Append the entry. User::LeaveIfError(aMappings.Append(entry)); + CleanupStack::Pop(); } diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/feedsengine/FeedsServer/Server/src/FeedsServer.cpp --- a/browserutilities/feedsengine/FeedsServer/Server/src/FeedsServer.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/browserutilities/feedsengine/FeedsServer/Server/src/FeedsServer.cpp Tue May 11 17:13:44 2010 +0300 @@ -31,7 +31,10 @@ // CONSTANTS _LIT(KFeedsServerPanic, "FeedsServer"); - +// opml files are generally smaller in size.But if a malformed opml +// greater than 400kB would cause the system to be irresponsive. +// So limit the max size to 400 kB +const TInt KMaxOPMLFileSize = 409600; //_LIT(KFileSchema, "file://c:"); _LIT(KDefaultFeed, "default_feeds.xml"); @@ -385,7 +388,10 @@ // Read file User::LeaveIfError(aFile.Size(size)); - + if ( size > KMaxOPMLFileSize ) + { + User::Leave(KErrCorrupt); + } buffer = HBufC8::NewLC(size); bufferPtr.Set(buffer->Des()); @@ -558,6 +564,7 @@ void CFeedsServer::ScheduleUpdateManagerL() { RArray folderListIds; + CleanupClosePushL(folderListIds); TBool autoUpdate = EFalse; TInt autoUpdateFreq = 0; TUint32 autoUpdateAP = 0; @@ -576,6 +583,8 @@ } } } + + CleanupStack::PopAndDestroy(); //folderListIds } // ----------------------------------------------------------------------------- diff -r 4917f9bf7995 -r 8bfb9186a8b8 browserutilities/webutils/conf/webutils.confml Binary file browserutilities/webutils/conf/webutils.confml has changed diff -r 4917f9bf7995 -r 8bfb9186a8b8 web_pub/browser_control_api/inc/BrCtlDefs.h --- a/web_pub/browser_control_api/inc/BrCtlDefs.h Tue Apr 27 17:46:17 2010 +0300 +++ b/web_pub/browser_control_api/inc/BrCtlDefs.h Tue May 11 17:13:44 2010 +0300 @@ -211,7 +211,14 @@ ECommandSetRetryConnectivityFlag, ECommandUnSetRetryConnectivityFlag, ECommandClearQuedTransactions, - ECommandConnToDownloadManager + ECommandConnToDownloadManager, + + /** + * Pause/Resume Script Timers + */ + ECommandPauseScriptTimers, + ECommandResumeScriptTimers, + ECommandCancelQueuedTransactions }; /** * The load event that occurred. diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/JavaScriptCore/kjs/collector.cpp --- a/webengine/osswebengine/JavaScriptCore/kjs/collector.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/JavaScriptCore/kjs/collector.cpp Tue May 11 17:13:44 2010 +0300 @@ -79,7 +79,7 @@ const size_t MIN_ARRAY_SIZE = 14; const size_t GROWTH_FACTOR = 2; const size_t LOW_WATER_FACTOR = 4; -const size_t ALLOCATIONS_PER_COLLECTION = 1000; +const size_t ALLOCATIONS_PER_COLLECTION = 4000; enum OperationInProgress { NoOperation, Allocation, Collection }; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/MemoryManager/Src/heap.cpp --- a/webengine/osswebengine/MemoryManager/Src/heap.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/MemoryManager/Src/heap.cpp Tue May 11 17:13:44 2010 +0300 @@ -2344,9 +2344,16 @@ { // need to allocate-copy-free void* newp = map(0, sz); - memcpy(newp, p, oldsz); - unmap(p,oldsz); - return newp; + if(newp) + { + memcpy(newp, p, oldsz); + unmap(p,oldsz); + return newp; + } + else + { + return 0; + } } } return p; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/bindings/js/kjs_binding.cpp --- a/webengine/osswebengine/WebCore/bindings/js/kjs_binding.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/bindings/js/kjs_binding.cpp Tue May 11 17:13:44 2010 +0300 @@ -135,7 +135,7 @@ , m_timerCallback(false) { // Time in milliseconds before the script timeout handler kicks in. - setTimeoutTime(100000); + setTimeoutTime(10000); // 10 sec } DOMObject* ScriptInterpreter::getDOMObject(void* objectHandle) diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/bindings/js/kjs_window.cpp --- a/webengine/osswebengine/WebCore/bindings/js/kjs_window.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/bindings/js/kjs_window.cpp Tue May 11 17:13:44 2010 +0300 @@ -72,6 +72,12 @@ #include #include "symbian/kjs_console.h" +// for JTimerBase +#include "SystemTime.h" +#include +#include + + #if ENABLE(XSLT) #include "JSXSLTProcessor.h" #endif @@ -85,7 +91,8 @@ static int timerNestingLevel = 0; const int cMaxTimerNestingLevel = 5; -const double cMinimumTimerInterval = 0.010; +const double cMinimumTimerInterval = 0.020; // lower values can block CPU if periodic timers are used + struct WindowPrivate { WindowPrivate() @@ -108,7 +115,537 @@ TimeoutsMap m_timeouts; }; -class DOMWindowTimer : public TimerBase { +// ========================================================================================== +// Base class for JavaScript timers - start +// ========================================================================================== +using namespace std; +class JTimerBase : Noncopyable { +public: + JTimerBase(); + virtual ~JTimerBase(); + + void start(double nextFireInterval, double repeatInterval); + void startRepeating(double repeatInterval) { start(repeatInterval, repeatInterval); } + void startOneShot(double interval) { start(interval, 0); } + void stop(); + bool isActive() const; + double nextFireInterval() const; + double repeatInterval() const { return m_repeatInterval; } + void augmentRepeatInterval(double delta) { setNextFireTime(m_nextFireTime + delta); m_repeatInterval += delta; } + + + static void setDeferringTimers(bool); + static void shutdownSharedTimer(); + double m_nextFireTime; // 0 if inactive + double m_repeatInterval; // 0 if not repeating + int m_heapIndex; // -1 if not in heap +private: + virtual void fired() = 0; // to be implemented in derived class + void checkConsistency() const; + void checkHeapIndex() const; + void setNextFireTime(double); + bool inHeap() const { return m_heapIndex != -1; } + void heapDecreaseKey(); + void heapDelete(); + void heapDeleteMin(); + void heapIncreaseKey(); + void heapInsert(); + void heapPop(); + void heapPopMin(); + + //static void fireTimersInNestedEventLoop(); + static void deleteTimerHeap(); + static void collectFiringTimers(double fireTime, Vector&); + static void fireTimers(double fireTime, const Vector&); + + //shared timer functions + static void sharedTimerFired(); + static TInt TimerFn( TAny* /*aPtr*/ ); + static void setSharedTimerFireTime(double fireTime); + static bool isDeferringTimers(); + static void updateSharedTimer(); + static void stopSharedTimer(); + static void initSharedTimer(); + + friend class TimerHeapElement; + friend bool operator<(const TimerHeapElement&, const TimerHeapElement&); +}; + +static bool deferringTimers; +static Vector* timerHeap; +static HashSet* timersReadyToFire; + +struct JTimerCleaner { + ~JTimerCleaner() { + if( timerHeap ) { + delete timerHeap; + timerHeap = 0; + JTimerBase::shutdownSharedTimer(); + } + } +}; +struct JTimerCleaner jCleanTimer; + +// ---------------- + +// Class to represent elements in the heap when calling the standard library heap algorithms. +// Maintains the m_heapIndex value in the timers themselves, which allows us to do efficient +// modification of the heap. +class TimerHeapElement { +public: + explicit TimerHeapElement(int i) : m_index(i), m_timer((*timerHeap)[m_index]) { checkConsistency(); } + + TimerHeapElement(const TimerHeapElement&); + TimerHeapElement& operator=(const TimerHeapElement&); + + JTimerBase* timer() const { return m_timer; } + + void checkConsistency() const { + ASSERT(m_index >= 0); + ASSERT(m_index < (timerHeap ? static_cast(timerHeap->size()) : 0)); + } + +private: + TimerHeapElement(); + + int m_index; + JTimerBase* m_timer; +}; + +inline TimerHeapElement::TimerHeapElement(const TimerHeapElement& o) + : m_index(-1), m_timer(o.timer()) +{ +} + +inline TimerHeapElement& TimerHeapElement::operator=(const TimerHeapElement& o) +{ + JTimerBase* t = o.timer(); + m_timer = t; + if (m_index != -1) { + checkConsistency(); + (*timerHeap)[m_index] = t; + t->m_heapIndex = m_index; + } + return *this; +} + +inline bool operator<(const TimerHeapElement& a, const TimerHeapElement& b) +{ + // Note, this is "backwards" because the heap puts the largest element first + // and we want the lowest time to be the first one in the heap. + return b.timer()->m_nextFireTime < a.timer()->m_nextFireTime; +} + +// ---------------- + +// Class to represent iterators in the heap when calling the standard library heap algorithms. +// Returns TimerHeapElement for elements in the heap rather than the JTimerBase pointers themselves. +class TimerHeapIterator : public iterator { +public: + TimerHeapIterator() : m_index(-1) { } + TimerHeapIterator(int i) : m_index(i) { checkConsistency(); } + + TimerHeapIterator& operator++() { checkConsistency(); ++m_index; checkConsistency(); return *this; } + TimerHeapIterator operator++(int) { checkConsistency(); checkConsistency(1); return m_index++; } + + TimerHeapIterator& operator--() { checkConsistency(); --m_index; checkConsistency(); return *this; } + TimerHeapIterator operator--(int) { checkConsistency(); checkConsistency(-1); return m_index--; } + + TimerHeapIterator& operator+=(int i) { checkConsistency(); m_index += i; checkConsistency(); return *this; } + TimerHeapIterator& operator-=(int i) { checkConsistency(); m_index -= i; checkConsistency(); return *this; } + + TimerHeapElement operator*() const { return TimerHeapElement(m_index); } + TimerHeapElement operator[](int i) const { return TimerHeapElement(m_index + i); } + + int index() const { return m_index; } + + void checkConsistency(int offset = 0) const { + ASSERT(m_index + offset >= 0); + ASSERT(m_index + offset <= (timerHeap ? static_cast(timerHeap->size()) : 0)); + } + +private: + int m_index; +}; + +inline bool operator==(TimerHeapIterator a, TimerHeapIterator b) { return a.index() == b.index(); } +inline bool operator!=(TimerHeapIterator a, TimerHeapIterator b) { return a.index() != b.index(); } +inline bool operator<(TimerHeapIterator a, TimerHeapIterator b) { return a.index() < b.index(); } + +inline TimerHeapIterator operator+(TimerHeapIterator a, int b) { return a.index() + b; } +inline TimerHeapIterator operator+(int a, TimerHeapIterator b) { return a + b.index(); } + +inline TimerHeapIterator operator-(TimerHeapIterator a, int b) { return a.index() - b; } +inline int operator-(TimerHeapIterator a, TimerHeapIterator b) { return a.index() - b.index(); } + +// ---------------- + +static TInt64 remainingMicro = 0; +static bool shutdownInProgress = false; +static CPeriodic* sharedTimer; + +void setDeferringJSTimers(bool defer) + { + JTimerBase::setDeferringTimers(defer); + } + +void JTimerBase::shutdownSharedTimer() + { + shutdownInProgress = true; + stopSharedTimer(); + JTimerBase::deleteTimerHeap(); + } + +void JTimerBase::initSharedTimer() + { + shutdownInProgress = false; + } + + +TInt JTimerBase::TimerFn( TAny* /*aPtr*/ ) + { + if (shutdownInProgress) + { + return KErrNone; + } + if( remainingMicro == 0 ) + { + sharedTimerFired(); + } + else + { + setSharedTimerFireTime( -1 ); + } + return KErrNone; + } + + +void JTimerBase::setSharedTimerFireTime(double fireTime) + { + if (shutdownInProgress) + { + return; + } + + if (sharedTimer) + { + sharedTimer->Cancel(); + delete sharedTimer; + sharedTimer = NULL; + } + if (fireTime != -1) + remainingMicro = 0; + + sharedTimer = CPeriodic::New( CActive::EPriorityIdle ); + if( sharedTimer ) + { + TInt64 interval( remainingMicro ); + if( remainingMicro == 0 ) + { + // fireTime comes in second resolution + TTime fireDate( TTime(fireTime * 1000000 ).Int64() ); + + TTime time; + time.HomeTime(); + interval = fireDate.Int64() - time.Int64(); + } + interval = interval < 0 ? 0 : interval; + // + TInt t; + if (interval<(TInt)(KMaxTInt32)) + { + t = interval; + remainingMicro = 0; + } + else + { + t = KMaxTInt32; + remainingMicro = interval - KMaxTInt32; + } + sharedTimer->Start( t, 0, JTimerBase::TimerFn); + } + } + + +void JTimerBase::stopSharedTimer() + { + if (sharedTimer) + { + sharedTimer->Cancel(); + delete sharedTimer; + sharedTimer = NULL; + } + remainingMicro = 0; + /* + * The static boolean variable shutdownInProgress, must be reset in scenario's where a browser control instance is deleted and a new + * instance is created without actually closing the application. + */ + shutdownInProgress = false ; + } + +void JTimerBase::updateSharedTimer() +{ + if (timersReadyToFire || deferringTimers || !timerHeap || timerHeap->isEmpty()) + stopSharedTimer(); + else + setSharedTimerFireTime(timerHeap->first()->m_nextFireTime); +} + +bool JTimerBase::isDeferringTimers() +{ + return deferringTimers; +} + +void JTimerBase::setDeferringTimers(bool shouldDefer) +{ + if (shouldDefer == deferringTimers) + return; + deferringTimers = shouldDefer; + updateSharedTimer(); +} + +// ---------------- + +JTimerBase::JTimerBase() : m_nextFireTime(0), m_repeatInterval(0), m_heapIndex(-1) +{ +} + +JTimerBase::~JTimerBase() +{ + stop(); + + ASSERT(!inHeap()); +} + +void JTimerBase::start(double nextFireInterval, double repeatInterval) +{ + m_repeatInterval = repeatInterval; + setNextFireTime(currentTime() + nextFireInterval); +} + +void JTimerBase::stop() +{ + m_repeatInterval = 0; + setNextFireTime(0); + + ASSERT(m_nextFireTime == 0); + ASSERT(m_repeatInterval == 0); + ASSERT(!inHeap()); +} + +bool JTimerBase::isActive() const +{ + return m_nextFireTime || (timersReadyToFire && timersReadyToFire->contains(this)); +} + +double JTimerBase::nextFireInterval() const +{ + ASSERT(isActive()); + double current = currentTime(); + if (m_nextFireTime < current) + return 0; + return m_nextFireTime - current; +} + +inline void JTimerBase::checkHeapIndex() const +{ + ASSERT(timerHeap); + ASSERT(!timerHeap->isEmpty()); + ASSERT(m_heapIndex >= 0); + ASSERT(m_heapIndex < static_cast(timerHeap->size())); + ASSERT((*timerHeap)[m_heapIndex] == this); +} + +inline void JTimerBase::checkConsistency() const +{ + // Timers should be in the heap if and only if they have a non-zero next fire time. + ASSERT(inHeap() == (m_nextFireTime != 0)); + if (inHeap()) + checkHeapIndex(); +} + +void JTimerBase::heapDecreaseKey() +{ + ASSERT(m_nextFireTime != 0); + checkHeapIndex(); + #if PLATFORM(SYMBIAN) + // check for valid heap index + if(m_heapIndex < static_cast(timerHeap->size())) + #endif + { + push_heap(TimerHeapIterator(0), TimerHeapIterator(m_heapIndex + 1)); + } + checkHeapIndex(); +} + +inline void JTimerBase::heapDelete() +{ + ASSERT(m_nextFireTime == 0); + heapPop(); + timerHeap->removeLast(); + m_heapIndex = -1; +} + +inline void JTimerBase::heapDeleteMin() +{ + ASSERT(m_nextFireTime == 0); + heapPopMin(); + timerHeap->removeLast(); + m_heapIndex = -1; +} + +inline void JTimerBase::heapIncreaseKey() +{ + ASSERT(m_nextFireTime != 0); + heapPop(); + heapDecreaseKey(); +} + +inline void JTimerBase::heapInsert() +{ + ASSERT(!inHeap()); + if (!timerHeap) + timerHeap = new Vector; + timerHeap->append(this); + m_heapIndex = timerHeap->size() - 1; + heapDecreaseKey(); +} + +inline void JTimerBase::heapPop() +{ + // Temporarily force this timer to have the minimum key so we can pop it. + double fireTime = m_nextFireTime; + m_nextFireTime = -numeric_limits::infinity(); + heapDecreaseKey(); + heapPopMin(); + m_nextFireTime = fireTime; +} + +void JTimerBase::heapPopMin() +{ + ASSERT(this == timerHeap->first()); + checkHeapIndex(); + pop_heap(TimerHeapIterator(0), TimerHeapIterator(timerHeap->size())); + checkHeapIndex(); + ASSERT(this == timerHeap->last()); +} + +void JTimerBase::setNextFireTime(double newTime) +{ + // Keep heap valid while changing the next-fire time. + + if (timersReadyToFire) + timersReadyToFire->remove(this); + + double oldTime = m_nextFireTime; + if (oldTime != newTime) { + m_nextFireTime = newTime; + + bool wasFirstTimerInHeap = m_heapIndex == 0; + + if (oldTime == 0) + heapInsert(); + else if (newTime == 0) + heapDelete(); + else if (newTime < oldTime) + heapDecreaseKey(); + else + heapIncreaseKey(); + + bool isFirstTimerInHeap = m_heapIndex == 0; + + if (wasFirstTimerInHeap || isFirstTimerInHeap) + updateSharedTimer(); + } + + checkConsistency(); +} + +void JTimerBase::collectFiringTimers(double fireTime, Vector& firingTimers) +{ + while (!timerHeap->isEmpty() && timerHeap->first()->m_nextFireTime <= fireTime) { + JTimerBase* timer = timerHeap->first(); + firingTimers.append(timer); + timersReadyToFire->add(timer); + timer->m_nextFireTime = 0; + timer->heapDeleteMin(); + } +} + +void JTimerBase::fireTimers(double fireTime, const Vector& firingTimers) +{ + int size = firingTimers.size(); + for (int i = 0; i != size; ++i) { + JTimerBase* timer = firingTimers[i]; + + // If not in the set, this timer has been deleted or re-scheduled in another timer's fired function. + // So either we don't want to fire it at all or we will fire it next time the shared timer goes off. + // It might even have been deleted; that's OK because we won't do anything else with the pointer. + if (!timersReadyToFire->contains(timer)) + continue; + + // Setting the next fire time has a side effect of removing the timer from the firing timers set. + double interval = timer->repeatInterval(); + timer->setNextFireTime(interval ? fireTime + interval : 0); + + // Once the timer has been fired, it may be deleted, so do nothing else with it after this point. + timer->fired(); + + // Catch the case where the timer asked timers to fire in a nested event loop. + if (!timersReadyToFire) + break; + } +} + +void JTimerBase::sharedTimerFired() +{ + // Do a re-entrancy check. + if (timersReadyToFire) + return; + + double fireTime = currentTime(); + Vector firingTimers; + HashSet firingTimersSet; + + timersReadyToFire = &firingTimersSet; + + collectFiringTimers(fireTime, firingTimers); + fireTimers(fireTime, firingTimers); + + timersReadyToFire = 0; + + updateSharedTimer(); +} +/* +void JTimerBase::fireTimersInNestedEventLoop() +{ + timersReadyToFire = 0; + updateSharedTimer(); +} +*/ + +void JTimerBase::deleteTimerHeap() +{ + if (timerHeap) + { + while (!timerHeap->isEmpty()) + { + JTimerBase* timer = timerHeap->first(); + timer->m_nextFireTime = 0; + timer->heapDeleteMin(); + } + delete timerHeap ; + timerHeap = NULL ; + } +} + + +// ========================================================================================== +// Base class for JavaScript timers - end +// ========================================================================================== + + +class DOMWindowTimer : public JTimerBase { public: DOMWindowTimer(int timeoutId, int nestingLevel, Window* o, ScheduledAction* a) : m_timeoutId(timeoutId), m_nestingLevel(nestingLevel), m_object(o), m_action(a) { } @@ -1544,7 +2081,7 @@ #if PLATFORM(SYMBIAN) if (d->m_evt && d->m_evt->type() == "mouseover") { if (singleShot) { - double interval = max(0.001, t * 0.001); + double interval = max(0.010, t * 0.001); if (interval < cMinimumTimerInterval && (timerNestingLevel + 1) >= cMaxTimerNestingLevel) { interval = cMinimumTimerInterval; } @@ -1563,13 +2100,15 @@ // Use a minimum interval of 10 ms to match other browsers, but only once we've // nested enough to notice that we're repeating. // Faster timers might be "better", but they're incompatible. - double interval = max(0.001, t * 0.001); + double interval = max(0.010, t * 0.001); // min interval for mobile device if (interval < cMinimumTimerInterval && nestLevel >= cMaxTimerNestingLevel) interval = cMinimumTimerInterval; if (singleShot) timer->startOneShot(interval); - else + else { + interval = max(0.030, t * 0.001); // keep periodic timers less frequent timer->startRepeating(interval); + } return timeoutId; } @@ -1642,7 +2181,14 @@ int timeoutId = timer->timeoutId(); timer->action()->execute(this); - if (d->m_timeouts.contains(timeoutId) && timer->repeatInterval() && timer->repeatInterval() < cMinimumTimerInterval) { + + // The DOMWindowTimer object may have been deleted or replaced during execution, + // so we re-fetch it. + timer = d->m_timeouts.get(timeoutId); + if (!timer) + return; + + if (timer->repeatInterval() && timer->repeatInterval() < cMinimumTimerInterval) { timer->setNestingLevel(timer->nestingLevel() + 1); if (timer->nestingLevel() >= cMaxTimerNestingLevel) timer->augmentRepeatInterval(cMinimumTimerInterval - timer->repeatInterval()); diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/bindings/js/kjs_window.h --- a/webengine/osswebengine/WebCore/bindings/js/kjs_window.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/bindings/js/kjs_window.h Tue May 11 17:13:44 2010 +0300 @@ -225,6 +225,7 @@ WebCore::Frame* m_frame; }; + void setDeferringJSTimers(bool defer); // allow JS timers to defer when shared timers do } // namespace namespace WebCore { diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/StringImpl.cpp --- a/webengine/osswebengine/WebCore/platform/StringImpl.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/StringImpl.cpp Tue May 11 17:13:44 2010 +0300 @@ -103,6 +103,10 @@ } m_data = newUCharVector(m_length); + if ( !m_data ) { + m_length = 0; + return; + } int i = m_length; UChar* ptr = m_data; while (i--) { @@ -123,7 +127,11 @@ } m_data = newUCharVector(len); - memcpy(m_data, str, len * sizeof(UChar)); + if ( !m_data ) { + m_length = 0; + return; + } + memcpy(m_data, str, len * sizeof(UChar)); } StringImpl::~StringImpl() diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/Timer.cpp --- a/webengine/osswebengine/WebCore/platform/Timer.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/Timer.cpp Tue May 11 17:13:44 2010 +0300 @@ -32,6 +32,7 @@ #include #include #include +#include using namespace std; @@ -413,6 +414,7 @@ return; deferringTimers = shouldDefer; updateSharedTimer(); + KJS::setDeferringJSTimers(shouldDefer); // defer JS timers also } } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/graphics/symbian/ImageSourceSymbian.cpp --- a/webengine/osswebengine/WebCore/platform/graphics/symbian/ImageSourceSymbian.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/graphics/symbian/ImageSourceSymbian.cpp Tue May 11 17:13:44 2010 +0300 @@ -112,9 +112,8 @@ // sync decoding if no observer is passed m_decoder = CAnimationDecoder::NewL( NULL ); if( m_decoder ) { - TPtrC8 ptr( (const TUint8*)data->data(), data->size() ); TPtrC16 ptr16(m_mimeType.des()); - m_decoder->OpenL( ptr, &ptr16, ETrue ); + m_decoder->OpenL( data, &ptr16, ETrue ); } } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/network/symbian/CookieHandler.cpp --- a/webengine/osswebengine/WebCore/platform/network/symbian/CookieHandler.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/network/symbian/CookieHandler.cpp Tue May 11 17:13:44 2010 +0300 @@ -64,9 +64,9 @@ // Creates a new object. // @return The constructed session. // -CookieHandler* CookieHandler::init() +CookieHandler* CookieHandler::init(RStringPool aStringPool) { - CookieHandler* self = new CookieHandler; + CookieHandler* self = new CookieHandler(aStringPool); if (self) { TRAPD(err, self->constructL()); if (err) { @@ -94,7 +94,6 @@ User::LeaveIfError( uriParser.Parse( aUrl )); // possible leave cookieManager.GetCookiesL(uriParser.UriDes(), m_getCookies, cookie2Reqd); - TText* cookieString = NULL; HBufC8* cookieString8 = NULL; @@ -175,7 +174,7 @@ popAndDestroyCount +=6; // create a cookie // Why are we using the stringpool only constructor of cookie? - CCookie* cookie = CCookie::NewL( (*m_stringPool) ); + CCookie* cookie = CCookie::NewL( (m_stringPool) ); CleanupStack::PushL( cookie ); popAndDestroyCount ++; @@ -192,7 +191,6 @@ if(cookieRecord.m_secure.Length()) { User::LeaveIfError( cookie->SetAttribute( CCookie::EVersion, versionAttrib ) ); } - cookieManager.StoreCookie(*cookie, uriParser); CleanupStack::PopAndDestroy(popAndDestroyCount); // RCookieManager.Close(), InitAttributesForLongCookieLC(6),cookie,unicodeToAsciiLC,asciiToUnicodeLC(2) } @@ -201,33 +199,34 @@ { TRAP_IGNORE(addCookieL(aCookieData, aUrl, aPolicyBaseURL)); } +void CookieHandler::destroy() +{ + // frees all memory allocated , + // including the objects whose + // pointers are contained by the array + m_getCookies.ResetAndDestroy(); + if(m_cookieManager) { + m_cookieManager->Close(); + delete m_cookieManager; + m_cookieManager = NULL; + } + +} // // Destructor. // CookieHandler::~CookieHandler() -{ - // frees all memory allocated , - // including the objects whose - // pointers are contained by the array - m_getCookies.ResetAndDestroy(); - + { + destroy(); m_getCookies.Close(); - if(m_cookieManager) { - m_cookieManager->Close(); - delete m_cookieManager; } - - if(m_stringPool) { - m_stringPool->Close(); - delete m_stringPool; - } -} // // Constructor. // -CookieHandler::CookieHandler() +CookieHandler::CookieHandler(RStringPool aStringPool) + : m_stringPool(aStringPool) {} // @@ -236,9 +235,7 @@ // void CookieHandler::constructL( ) { - m_stringPool = new (ELeave)RStringPool; - m_stringPool->OpenL(); - m_cookieManager = new (ELeave) RCookieManager( *m_stringPool ); + m_cookieManager = new (ELeave) RCookieManager( m_stringPool ); User::LeaveIfError( m_cookieManager->Connect() ); } @@ -292,30 +289,30 @@ { // Setting name attribute - aName = m_stringPool->OpenFStringL(unicodeToAsciiLC(aCookieRecord.m_name)->Des()); + aName = m_stringPool.OpenFStringL(unicodeToAsciiLC(aCookieRecord.m_name)->Des()); CleanupStack::PopAndDestroy(); //unicodeToAsciiLC CleanupClosePushL( aName); // Setting name attribute - aNameValue = m_stringPool->OpenFStringL(unicodeToAsciiLC(aCookieRecord.m_nameValue)->Des()); + aNameValue = m_stringPool.OpenFStringL(unicodeToAsciiLC(aCookieRecord.m_nameValue)->Des()); CleanupStack::PopAndDestroy(); //unicodeToAsciiLC CleanupClosePushL( aNameValue); - aExpires = m_stringPool->OpenFStringL( unicodeToAsciiLC(aCookieRecord.m_expires)->Des()); + aExpires = m_stringPool.OpenFStringL( unicodeToAsciiLC(aCookieRecord.m_expires)->Des()); CleanupStack::PopAndDestroy(); //unicodeToAsciiLC CleanupClosePushL( aExpires); // Setting Path attribute - aPath = m_stringPool->OpenFStringL( unicodeToAsciiLC(aCookieRecord.m_pathName)->Des()); + aPath = m_stringPool.OpenFStringL( unicodeToAsciiLC(aCookieRecord.m_pathName)->Des()); CleanupStack::PopAndDestroy(); //unicodeToAsciiLC CleanupClosePushL( aPath ); // Setting Domain attribute - aDomain = m_stringPool->OpenFStringL( unicodeToAsciiLC(aCookieRecord.m_domainName)->Des() ); + aDomain = m_stringPool.OpenFStringL( unicodeToAsciiLC(aCookieRecord.m_domainName)->Des() ); CleanupStack::PopAndDestroy(); //unicodeToAsciiLC CleanupClosePushL( aDomain ); // Setting Domain attribute - aVersion = m_stringPool->OpenFStringL( _L8("1")); + aVersion = m_stringPool.OpenFStringL( _L8("1")); CleanupClosePushL( aVersion ); } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/network/symbian/CookieHandler.h --- a/webengine/osswebengine/WebCore/platform/network/symbian/CookieHandler.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/network/symbian/CookieHandler.h Tue May 11 17:13:44 2010 +0300 @@ -21,6 +21,7 @@ // System includes #include +#include // CONSTANTS @@ -33,7 +34,7 @@ // FUNCTION PROTOTYPES // FORWARD DECLARATIONS -class RStringPool; +//class RStringPool; class CCookie; class RStringF; class RCookieManager; @@ -67,7 +68,7 @@ * Creates a new object. * @return The constructed session. */ - static CookieHandler* init(); + static CookieHandler* init(RStringPool aStringPool); /** * adds cookie , @@ -87,12 +88,13 @@ * Destructor. */ virtual ~CookieHandler(); + void destroy(); private : // constructors /** * Constructor. */ - CookieHandler( ); + CookieHandler( RStringPool aStringPool); /** * ConstructL. @@ -161,8 +163,9 @@ */ void parseCookieFieldsL( const TPtrC& aCookieString, CookieRecord& aCookieRecord) const; + private : // data members - RStringPool* m_stringPool ;// < m_getCookies;// <resourceLoaderDelegate()->httpSessionManager()->getRetryConnectivityFlag(); + if( retryFlag ) + return; HttpSessionManager* httpSessionMgr = StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager(); User::LeaveIfNull(httpSessionMgr); @@ -726,7 +729,9 @@ default: { // error handling - if(aEvent.iStatus == KErrNotReady || aEvent.iStatus == KErrDisconnected ) + //KErrDisconnected should be coming only for OCC + //MHFRunL gets call before connection manager + if(aEvent.iStatus == KErrDisconnected) StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->setRetryConnectivityFlag(); else handleError(aEvent.iStatus); @@ -787,11 +792,10 @@ void HttpConnection::complete(int error) { - TBool retryFlag = StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager()->getRetryConnectivityFlag(); + HttpSessionManager* httpSessionManager = StaticObjectsContainer::instance()->resourceLoaderDelegate()->httpSessionManager(); + TBool retryFlag = httpSessionManager->getRetryConnectivityFlag(); if( retryFlag ) { - m_transaction->Cancel(); - //m_cancelled = false; //for flash return; } @@ -850,6 +854,7 @@ m_transaction->Close(); delete m_transaction; m_transaction = NULL; + httpSessionManager->removeRequest(this); } if (error) { CResourceHandleManager::self()->receivedFinished(m_handle, error, this); @@ -1202,57 +1207,60 @@ if(uriParser.Parse( m_transaction->Request().URI().UriDes() ) == KErrNone) { - if (uriParser.IsPresent(EUriHost) && uriParser.IsPresent(EUriScheme)) // looking only for absolue Url path and schemes other than http(s) + if (uriParser.IsPresent(EUriScheme)) // looking only for absolue Url path and schemes other than http(s) { const TDesC8& scheme = uriParser.Extract(EUriScheme); - if (scheme.FindF(_L8("http")) == KErrNotFound) // everything but http(s) + if(uriParser.IsPresent(EUriHost) || scheme.FindF(_L8("tel")) == KErrNone) { - TPtrC8 ptr(uriParser.UriDes()); - // these arrays are pushed into CleanupStack in case leave - // if no leave, they will be freed below - RArray* typeArray = new (ELeave) RArray(1); - CleanupStack::PushL(typeArray); - - CDesCArrayFlat* desArray = new (ELeave) CDesCArrayFlat(1); - CleanupStack::PushL(desArray); + if (scheme.FindF(_L8("http")) == KErrNotFound) // everything but http(s) + { + TPtrC8 ptr(uriParser.UriDes()); + // these arrays are pushed into CleanupStack in case leave + // if no leave, they will be freed below + RArray* typeArray = new (ELeave) RArray(1); + CleanupStack::PushL(typeArray); - User::LeaveIfError(typeArray->Append(EParamRequestUrl)); + CDesCArrayFlat* desArray = new (ELeave) CDesCArrayFlat(1); + CleanupStack::PushL(desArray); + + User::LeaveIfError(typeArray->Append(EParamRequestUrl)); - HBufC16* urlbuf = HBufC16::NewLC( ptr.Length() + 1); // +1 for zero terminate - urlbuf->Des().Copy( ptr ); - TPtr16 bufDes16 = urlbuf->Des(); - bufDes16.ZeroTerminate(); + HBufC16* urlbuf = HBufC16::NewLC( ptr.Length() + 1); // +1 for zero terminate + urlbuf->Des().Copy( ptr ); + TPtr16 bufDes16 = urlbuf->Des(); + bufDes16.ZeroTerminate(); - desArray->AppendL(bufDes16); - CleanupStack::Pop(); + desArray->AppendL(bufDes16); + CleanupStack::Pop(); - MBrCtlSpecialLoadObserver* loadObserver = control(m_frame)->brCtlSpecialLoadObserver(); + MBrCtlSpecialLoadObserver* loadObserver = control(m_frame)->brCtlSpecialLoadObserver(); - if (loadObserver) - { - TRAP_IGNORE(loadObserver->HandleRequestL(typeArray, desArray)); - } + if (loadObserver) + { + TRAP_IGNORE(loadObserver->HandleRequestL(typeArray, desArray)); + } - // No leave, so pop here and clean up - CleanupStack::Pop(desArray); - CleanupStack::Pop(typeArray); + // No leave, so pop here and clean up + CleanupStack::Pop(desArray); + CleanupStack::Pop(typeArray); - // cleanup arrays - if (typeArray) - { - // Closes the array and frees all memory allocated to the array - typeArray->Close(); - delete typeArray; - } + // cleanup arrays + if (typeArray) + { + // Closes the array and frees all memory allocated to the array + typeArray->Close(); + delete typeArray; + } - if (desArray) - { - // Deletes all descriptors from the array and frees the memory allocated to the array buffer - desArray->Reset(); - delete desArray; + if (desArray) + { + // Deletes all descriptors from the array and frees the memory allocated to the array buffer + desArray->Reset(); + delete desArray; + } + + return KErrCancel; } - - return KErrCancel; } } } @@ -1269,6 +1277,7 @@ m_transaction->PropertySet().RemoveProperty(session.StringPool().StringF(HttpFilterCommonStringsExt::ESelfPtr, HttpFilterCommonStringsExt::GetTable())); m_transaction = NULL; + m_isDone = true; return trans; } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/network/symbian/HttpSessionManager.cpp --- a/webengine/osswebengine/WebCore/platform/network/symbian/HttpSessionManager.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/network/symbian/HttpSessionManager.cpp Tue May 11 17:13:44 2010 +0300 @@ -60,7 +60,6 @@ m_SelfDownloadContentHandler = NULL; m_SelfDownloadContentTypes = KNullStr().Alloc(); retryConnectivityFlag = EFalse; - m_inSecConnection = EFalse; } HttpSessionManager::~HttpSessionManager() @@ -70,6 +69,7 @@ delete m_ReqHdrManager; m_ReqHdrManager = NULL; delete m_cookieHandler; + m_cookieHandler = NULL; delete m_httpDownload; m_httpDownload = NULL; delete m_SelfDownloadContentHandler; @@ -142,7 +142,7 @@ m_ReqHdrManager = HttpRequestHeaderManager::NewL(m_httpSession); } if (!m_cookieHandler) { - m_cookieHandler = CookieHandler::init(); + m_cookieHandler = CookieHandler::init(m_httpSession.StringPool()); } } updateFilters(true); @@ -175,6 +175,9 @@ // disconnect the Dl Mgr if (m_httpDownload){ m_httpDownload->disconnect(); + if(m_cookieHandler) + m_cookieHandler->destroy(); + } m_httpSession.Close(); m_sessionRunning = false; @@ -263,20 +266,25 @@ { Vector requests; + TBool newConn = ETrue; + m_httpSession.ConnectionInfo().SetPropertyL(m_httpSession.StringPool().StringF(HttpFilterCommonStringsExt::EHttpNewConnFlag, HttpFilterCommonStringsExt::GetTable()), THTTPHdrVal((TBool)newConn)); + for(HashMap::iterator tmpit = m_pendingHttpRequests.begin(); tmpit != m_pendingHttpRequests.end(); ++tmpit) { - ResourceHandle *tmp = tmpit->second; - ResourceHandleClient* client = tmp->client(); - if(!client->isLoadingPlugins()) requests.append(tmpit->first); } //Submit them again for (int i=0; iHttpTransaction()) { requests[i]->HttpTransaction()->SubmitL(); } - + else { + removeRequest(requests[i]); + } + + } } HttpConnection* HttpSessionManager::firstHttpConnection() @@ -483,4 +491,20 @@ } } +void HttpSessionManager::cancelQueuedTransactions() +{ + Vector requests; + for(HashMap::iterator tmpit = m_pendingHttpRequests.begin(); + tmpit != m_pendingHttpRequests.end(); ++tmpit) + { + requests.append(tmpit->first); + } + + for (int i = 0; i < requests.size(); ++i) { + if(requests[i]->HttpTransaction()) { + requests[i]->HttpTransaction()->Cancel(); + } + } +} + // end of file diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/network/symbian/HttpSessionManager.h --- a/webengine/osswebengine/WebCore/platform/network/symbian/HttpSessionManager.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/network/symbian/HttpSessionManager.h Tue May 11 17:13:44 2010 +0300 @@ -102,6 +102,7 @@ TUint pendingTransactionsCount(){ return m_pendingHttpRequests.size(); } TBool isInSecureConnection() {return m_inSecConnection;} void setInSecureConnection(TBool inSecCon) {m_inSecConnection = inSecCon;} + void cancelQueuedTransactions(); private: void updateFilters(bool initializing = false); diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoder.cpp --- a/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoder.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoder.cpp Tue May 11 17:13:44 2010 +0300 @@ -100,7 +100,7 @@ // ----------------------------------------------------------------------------- // OpenL // ----------------------------------------------------------------------------- -void CAnimationDecoder::OpenL( const TDesC8& aData, TDesC* aMIMEType, TBool aIsComplete ) +void CAnimationDecoder::OpenL( WebCore::SharedBuffer* aData, TDesC* aMIMEType, TBool aIsComplete ) { if (!iWrapped) { return; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoder.h --- a/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoder.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoder.h Tue May 11 17:13:44 2010 +0300 @@ -39,6 +39,10 @@ // INCLUDES #include "AnimationDecoderWrapped.h" +namespace WebCore { + class SharedBuffer; +} + // CLASS DECLARATION /** * CAnimationDecoder @@ -74,7 +78,7 @@ /* * From MIHLFileImage, see base class header. */ - void OpenL( const TDesC8& aData, TDesC* aMIMEType, TBool aIsComplete ); + void OpenL( WebCore::SharedBuffer* aData, TDesC* aMIMEType, TBool aIsComplete ); /* * From MIHLFileImage, see base class header. diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoderWrapped.cpp --- a/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoderWrapped.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoderWrapped.cpp Tue May 11 17:13:44 2010 +0300 @@ -51,11 +51,10 @@ #include "SyncDecodeThread.h" #include #include +#include "SharedBuffer.h" + using namespace ContentAccess; -namespace TBidirectionalState { - class TRunInfo; -}; #include @@ -242,24 +241,25 @@ // ----------------------------------------------------------------------------- // OpenL // ----------------------------------------------------------------------------- -void CAnimationDecoderWrapped::OpenL( const TDesC8& aData, TDesC* aMIMEType, TBool aIsComplete ) +void CAnimationDecoderWrapped::OpenL( SharedBuffer* aData, TDesC* aMIMEType, TBool aIsComplete ) { iCanBeDeleted = EFalse; if(!iObserver) { - OpenAndDecodeSyncL(aData); + TPtrC8 ptr( (const TUint8*)aData->data(), aData->size() ); + OpenAndDecodeSyncL(ptr); iCanBeDeleted = ETrue; if (iIsInvalid) delete this; return; } - + m_data = aData; + m_dataptr.Set((const TUint8*)aData->data(), aData->size()); delete iDestination; iDestination = NULL; iDestination = CMaskedBitmap::NewL(); HBufC8* mime = 0; - TPtrC8 buffer(aData.Ptr(),aData.Length()); if (aMIMEType) { // it is safer to ignore the server supplied mime type and just recognize // the image type from the data headers. this does not work for all formats though @@ -270,31 +270,23 @@ } if( *aMIMEType==KMimeDRM ) { - iDrmContent = DecodeDRMImageContentL(aData); + iDrmContent = DecodeDRMImageContentL(m_dataptr); TInt drmContentLength = iDrmContent->Des().Length(); - buffer.Set( (const TUint8*)iDrmContent->Des().Ptr(), drmContentLength); + m_dataptr.Set( (const TUint8*)iDrmContent->Des().Ptr(), drmContentLength); } } - - if( !iDecoder ) - iDecoder = CBufferedImageDecoder::NewL(CEikonEnv::Static()->FsSession()); - - if (mime){ - if (iDecoder) { - iDecoder->OpenL(buffer,*mime,CImageDecoder::EOptionNone); - CleanupStack::PopAndDestroy(); // mime - } - } - else { - if (iDecoder) { - iDecoder->OpenL(buffer,CImageDecoder::EOptionNone); - } - } + delete iDecoder; + iDecoder = NULL; + + if(mime) + iDecoder = CImageDecoder::DataNewL(CEikonEnv::Static()->FsSession(), m_dataptr, *mime); + else + iDecoder = CImageDecoder::DataNewL(CEikonEnv::Static()->FsSession(), m_dataptr); iRawDataComplete = aIsComplete; - if(iDecoder && iDecoder->ValidDecoder() && iDecoder->IsImageHeaderProcessingComplete()) { + if(iDecoder && iDecoder->IsImageHeaderProcessingComplete()) { StartDecodingL(); } else { @@ -310,7 +302,7 @@ // first see if have a netscape 2.0 extension header const TUint8 extString[] = { 'N', 'E', 'T', 'S', 'C', 'A', 'P','E','2','.','0','\3','\1' }; const TInt sizeofextString = sizeof(extString); - TPtrC8 rawDataPtr((TUint8*)aData.Ptr(), aData.Length()); + TPtrC8 rawDataPtr((TUint8*)m_dataptr.Ptr(), m_dataptr.Length()); TInt offset = rawDataPtr.Find(extString, sizeofextString); if(offset != KErrNotFound) { // found a header, get the loop count - @@ -331,44 +323,16 @@ } iCurLoopCount = iLoopCount; } + if(mime) + { + CleanupStack::PopAndDestroy(mime); + } iCanBeDeleted = ETrue; if (iIsInvalid) delete this; } // ----------------------------------------------------------------------------- -// CAnimationDecoderWrapped::AddDataL -// New chunk of raw data -// -// ----------------------------------------------------------------------------- -// -void CAnimationDecoderWrapped::AddDataL( - const TDesC8& aNextChunk, - TBool aIsComplete ) -{ - iRawDataComplete = aIsComplete; - - if( iDecoder ) { - iDecoder->AppendDataL(aNextChunk); - if( iDecoder->ValidDecoder() ) { - // if the image conversion is busy , then just appending the - // data should be sufficient - if(iStatus == KRequestPending) { - // more image data - iDecoder->ContinueConvert( &iStatus ); - SetActive(); - } - } - else { - iDecoder->ContinueOpenL() ; - if(iDecoder->ValidDecoder() && iDecoder->IsImageHeaderProcessingComplete()){ - StartDecodingL(); - } - } - } -} - -// ----------------------------------------------------------------------------- // CImageLoader::StartDecodingL // // ----------------------------------------------------------------------------- @@ -384,7 +348,6 @@ // we only support gray2 and gray256 tiling TDisplayMode maskmode = ( (iFrameInfo.iFlags & TFrameInfo::EAlphaChannel) && (iFrameInfo.iFlags & TFrameInfo::ECanDither)) ? EGray256 : EGray2; TInt error = iDestination->Create( iFrameInfo.iOverallSizeInPixels, DisplayMode(), maskmode ); - if (!error) LoadFrame(0); else @@ -578,8 +541,7 @@ CFbsBitmap& animMask = iAnimationBitmap->MaskModifyable(); TFrameInfo frameInfo( iDecoder->FrameInfo( aFrameIndex ) ); - User::LeaveIfError( animBitmap.Create( - frameInfo.iOverallSizeInPixels, EColor16M ) ); + User::LeaveIfError(animBitmap.Create(frameInfo.iOverallSizeInPixels, DisplayMode())); TDisplayMode maskDisplayMode( ENone ); @@ -588,7 +550,7 @@ maskDisplayMode = EGray256; maskDisplayMode = EGray2; - User::LeaveIfError( animMask.Create( frameInfo.iOverallSizeInPixels, maskDisplayMode ) ); + User::LeaveIfError(animMask.Create(frameInfo.iOverallSizeInPixels, maskDisplayMode)); iDecoder->Convert( &iStatus, animBitmap, animMask, aFrameIndex ); } else @@ -639,6 +601,7 @@ iImageState = EInactive; iObserver->imageReady(sizeinBytes); delete iDecoder, iDecoder = NULL; + m_data = NULL; } } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoderWrapped.h --- a/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoderWrapped.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/platform/symbian/bitmap/AnimationDecoderWrapped.h Tue May 11 17:13:44 2010 +0300 @@ -48,8 +48,11 @@ // INCLUDES +#include <../bidi.h> +#include "config.h" #include #include // TFrameInfo +#include // FORWARD DECLARATIONS class CMaskedBitmap; @@ -57,8 +60,8 @@ class CSynDecodeThread; namespace WebCore { class ImageObserver; -} -// CONSTANTS + class SharedBuffer; +}; _LIT(KMimeJPEG, "image/jpeg"); _LIT(KMimeJPG, "image/jpg"); @@ -106,24 +109,19 @@ /* * From MIHLFileImage, see base class header. */ - void OpenL( const TDesC8& aData, TDesC* aMIMEType, TBool aIsComplete ); + void OpenL( WebCore::SharedBuffer* aData, TDesC* aMIMEType, TBool aIsComplete ); void OpenAndDecodeSyncL( const TDesC8& aData ); /* * From MIHLFileImage, see base class header. */ - void AddDataL( const TDesC8& aData, TBool aIsComplete ); - - /* - * From MIHLFileImage, see base class header. - */ TSize Size() const { return iFrameInfo.iOverallSizeInPixels; } /* * From MIHLFileImage, see base class header. */ - TDisplayMode DisplayMode() const { return KMaxDepth; } - + TDisplayMode DisplayMode() const { return KMaxDepth;} + /* * From MIHLFileImage, see base class header. */ @@ -225,13 +223,14 @@ }; private: // Data - + RefPtr m_data; + TPtrC8 m_dataptr; // Image status & state TRequestStatus* iImageStatus; TImageState iImageState; // Own: Image decoder - CBufferedImageDecoder* iDecoder; // owned + CImageDecoder* iDecoder; // owned TFrameInfo iFrameInfo; TBool iAnimation; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebCore/rendering/RenderPartObject.cpp --- a/webengine/osswebengine/WebCore/rendering/RenderPartObject.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebCore/rendering/RenderPartObject.cpp Tue May 11 17:13:44 2010 +0300 @@ -210,7 +210,7 @@ mapClassIdToServiceType(o->m_classId, serviceType); #if PLATFORM(SYMBIAN) //If there is no Type and Classid then return. - else if (serviceType.isEmpty() && o->m_classId.isEmpty()) + else if (serviceType.isEmpty() && o->m_classId.isEmpty() && !embed) return; #endif diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/misc/WebTabbedNavigation.cpp --- a/webengine/osswebengine/WebKit/s60/misc/WebTabbedNavigation.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/misc/WebTabbedNavigation.cpp Tue May 11 17:13:44 2010 +0300 @@ -243,7 +243,7 @@ m_selectedElementRect = selectedRect; m_focusPosition = selectedPoint; m_node = selectedNode; - m_webView->page()->focusController()->setFocusedNode(selectedNode, selectedNode->document()->frame()); + selectedNode->document()->setFocusedNode(selectedNode); m_webView->page()->focusController()->setFocusedFrame(selectedNode->document()->frame()); // And scroll to the selected element diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/plugins/PluginSkin.cpp --- a/webengine/osswebengine/WebKit/s60/plugins/PluginSkin.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginSkin.cpp Tue May 11 17:13:44 2010 +0300 @@ -164,7 +164,8 @@ m_pluginfuncs(0), m_resized(false), m_oldRect(TRect(0,0,0,0)), - m_oldViewport(TRect(0,0,0,0)) + m_oldViewport(TRect(0,0,0,0)), + m_loadmode(ELoadModeNone) { } @@ -835,7 +836,8 @@ int PluginSkin::getRequestL(const TDesC8& url, bool notify, void* notifydata,const TDesC* aWindowType) { TPluginLoadMode loadmode = GetLoadMode(aWindowType); - + setLoadMode(loadmode); + if (url.Ptr() == NULL ) { return KErrArgument; } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/plugins/PluginSkin.h --- a/webengine/osswebengine/WebKit/s60/plugins/PluginSkin.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginSkin.h Tue May 11 17:13:44 2010 +0300 @@ -417,7 +417,8 @@ void reCreatePlugin(); TInt activeStreams() { return m_streams.size(); } void PlayPauseNotify(bool pause); - + TPluginLoadMode getLoadMode(){return m_loadmode;} + void setLoadMode(TPluginLoadMode mode){m_loadmode = mode;} public: // from MMemoryCollector TUint Collect(unsigned int aRequired); void Restore() {} @@ -478,8 +479,8 @@ RArray* iGenericElementArray; TRect m_oldRect; TRect m_oldViewport; + TPluginLoadMode m_loadmode; - public: TInt m_handle; NPP m_instance; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp --- a/webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/plugins/PluginWin.cpp Tue May 11 17:13:44 2010 +0300 @@ -376,6 +376,14 @@ { CCoeControl::MakeVisible(visible); } + TPluginLoadMode loadmode = m_pluginskin->getLoadMode(); + if(loadmode == ELoadModeNew ){ + m_pluginskin->setLoadMode(ELoadModeNone); + if(visible) + HandleGainingForeground(); + else + HandleLosingForeground(); + } NotifyPluginVisible(visible); if (!m_windowedPlugin && m_pluginskin->getNPPluginFucs() && m_pluginskin->getNPPluginFucs()->event) { NPEvent event; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webcoresupport/WebFrameLoaderClient.cpp --- a/webengine/osswebengine/WebKit/s60/webcoresupport/WebFrameLoaderClient.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webcoresupport/WebFrameLoaderClient.cpp Tue May 11 17:13:44 2010 +0300 @@ -161,6 +161,7 @@ core(m_webFrame)->loader()->isLoadingMainFrame() && FrameLoadTypeStandard == core(m_webFrame)->loader()->loadType()){ m_webFrame->frameView()->topView()->resetZoomLevel(); + m_webFrame->frameView()->topView()->resetJsTimers(); } if (!core(m_webFrame)->ownerElement()) { diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp --- a/webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/BrCtl.cpp Tue May 11 17:13:44 2010 +0300 @@ -420,6 +420,7 @@ , m_wmlEngineInterface(NULL) , m_brCtlDownloadObserver(aBrCtlDownloadObserver) , m_windoCloseTimer(NULL) + , m_didFirstLayout(false) { m_documentHeight = 0; m_displayHeight = 0; @@ -594,12 +595,15 @@ m_webView->formFillPopup()->handleCommandL(TBrCtlDefs::ECommandCancel); break; case TBrCtlDefs::EEventNewContentDisplayed: - if(m_brCtlLayoutObserver && m_webView) + 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; setDeferringTimers(true); @@ -664,6 +668,7 @@ if (coreFrame) coreFrame->eventHandler()->deactivatedEvent(); } + m_webView->setEditable(EFalse); break; } case TBrCtlDefs::ECommandCancelFetch: @@ -777,7 +782,7 @@ setDeferringTimers(false); m_suspendTimers = false; #endif - + m_webView->resumeJsTimers(); break; } case TBrCtlDefs::ECommandAppBackground: @@ -801,6 +806,7 @@ //Disable the zooming bar when it goes to background m_webView->hideZoomSliderL(); + m_webView->pauseJsTimers(); break; } case TBrCtlDefs::ECommandClearAutoFormFillData: @@ -956,6 +962,7 @@ case TBrCtlDefs::ECommandEnterFullscreenBrowsing: { + m_webView->resumeJsTimers(); m_webView->EnterFullscreenBrowsingL(); break; } @@ -1005,7 +1012,24 @@ } 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; + } default: { if ( m_wmlEngineInterface && @@ -1717,6 +1741,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) { @@ -2531,3 +2558,4 @@ + diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/BrCtl.h --- a/webengine/osswebengine/WebKit/s60/webview/BrCtl.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/BrCtl.h Tue May 11 17:13:44 2010 +0300 @@ -727,7 +727,8 @@ TBrCtlWmlServiceOption* m_firstPrevDoElement; MBrCtlDownloadObserver* m_brCtlDownloadObserver; CPeriodic* m_windoCloseTimer; //new timer for managing browser window close - + bool m_didFirstLayout; + }; #endif // BRCTL_H diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebFepTextEditor.cpp Tue May 11 17:13:44 2010 +0300 @@ -351,7 +351,7 @@ // ----------------------------------------------------------------------------- void CWebFepTextEditor::CancelFepInlineEdit() { - if (IsTextAreaFocused()) { + if (IsTextAreaFocused()||IsInputElementFocused()) { if (m_inlineEditText && DocumentLengthForFep() < DocumentMaximumLengthForFep()) { HBufC* tempBuf = HBufC::NewLC(DocumentLengthForFep()); TPtr ptr(tempBuf->Des()); diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebFrame.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebFrame.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebFrame.cpp Tue May 11 17:13:44 2010 +0300 @@ -508,10 +508,27 @@ void WebFrame::makeVisiblePlugins(TBool visible) { - PluginHandler* plghandler = StaticObjectsContainer::instance()->pluginHandler(); - WTF::HashSet pluginObjs = plghandler->pluginObjects(); - for(WTF::HashSet::iterator it = pluginObjs.begin() ; it != pluginObjs.end() ; ++it ) { - static_cast (*it)->makeVisible(visible); + MWebCoreObjectWidget* view = NULL; + Frame* coreFrame = core(this); + PluginSkin* plg = 0; + for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) { + + PassRefPtr objects = frame->document()->objects(); + for (Node* n = objects->firstItem(); n; n = objects->nextItem()) { + view = widget(n); + if (view) { + plg = static_cast(view); + plg->makeVisible(visible); + } + } + PassRefPtr embeds = frame->document()->embeds(); + for (Node* n = embeds->firstItem(); n; n = embeds->nextItem()) { + view = widget(n); + if (view) { + plg = static_cast(view); + plg->makeVisible(visible); + } + } } } @@ -577,12 +594,29 @@ void WebFrame::reCreatePlugins() { - PluginHandler* plghandler = StaticObjectsContainer::instance()->pluginHandler(); - WTF::HashSet pluginObjs = plghandler->pluginObjects(); - for(WTF::HashSet::iterator it = pluginObjs.begin() ; it != pluginObjs.end() ; ++it ) { - PluginSkin* plg = static_cast (*it); //->PlayPauseNotify(pause); - if(plg->activeStreams() > 0) - plg->reCreatePlugin(); + MWebCoreObjectWidget* view = NULL; + Frame* coreFrame = core(this); + PluginSkin* plg = 0; + for (Frame* frame = coreFrame; frame; frame = frame->tree()->traverseNext(coreFrame)) { + + PassRefPtr objects = frame->document()->objects(); + for (Node* n = objects->firstItem(); n; n = objects->nextItem()) { + view = widget(n); + if (view) { + plg = static_cast(view); + if (plg->activeStreams() > 0) + plg->reCreatePlugin(); + } + } + PassRefPtr embeds = frame->document()->embeds(); + for (Node* n = embeds->firstItem(); n; n = embeds->nextItem()) { + view = widget(n); + if (view) { + plg = static_cast(view); + if (plg->activeStreams() > 0) + plg->reCreatePlugin(); + } + } } } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebPageScrollHandler.cpp Tue May 11 17:13:44 2010 +0300 @@ -126,8 +126,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()) { diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebPointerEventHandler.cpp Tue May 11 17:13:44 2010 +0300 @@ -164,12 +164,16 @@ { m_ignoreTap = false; handleTouchUp(aGesture); - m_webview->setScrolling(false); + m_webview->resumeJsTimers(); // resume js timers break; } case stmGesture::EGestureUidPan: { + // pause js timers (if not already done) + if(!m_webview->jsTimersPaused()) + m_webview->pauseJsTimers(); + if(!m_webview->isScrolling()) m_webview->setScrolling(true); handleMove(aGesture); @@ -193,6 +197,9 @@ if(!m_webview->inPageViewMode()) { handlePinchZoomL(aGesture); + if(aGesture.GestureState() != EGestureEnter) { + m_webview->resumeJsTimers(); // resume js timers + } } break; } @@ -328,6 +335,10 @@ } } + // pause JS timers for better ui response + if (aPointerEvent.iType == TPointerEvent::EButton1Down) { + m_webview->pauseJsTimers(); + } #ifdef BRDO_USE_GESTURE_HELPER m_gestureInterface->HandlePointerEventL(aPointerEvent); #endif diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebScrollingDeceleratorGH.cpp Tue May 11 17:13:44 2010 +0300 @@ -109,6 +109,7 @@ m_decelelatorSwitch = false; if (m_decelTimer->IsActive()) { m_webView.setScrolling(false); + m_webView.resumeJsTimers(); m_decelTimer->Cancel(); } } @@ -137,11 +138,13 @@ m_numscrollsteps = 0; if (m_decelTimer->IsActive()) { m_webView.setScrolling(false); + m_webView.resumeJsTimers(); m_decelTimer->Cancel(); } WebFrameView* scrollingView = m_webView.pageScrollHandler()->currentScrollingFrameView(); if (scrollingView) { + m_webView.pauseJsTimers(); // pause the JS timers m_webView.setScrolling(true); m_startPos = scrollingView->contentPos(); m_lastPos = m_startPos; @@ -193,6 +196,8 @@ if (m_scrollbarDrawer) { m_scrollbarDrawer->fadeScrollbar(); } + + m_webView.resumeJsTimers(); // resume the js timers m_webView.setScrolling(false); m_decelTimer->Cancel(); handler->clearScrollingElement(); diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebView.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WebView.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebView.cpp Tue May 11 17:13:44 2010 +0300 @@ -100,6 +100,7 @@ #include "EventNames.h" #include "Editor.h" #include "ThumbnailGenerator.h" +#include using namespace WebCore; using namespace EventNames; @@ -217,6 +218,7 @@ , m_checkerBoardGc(NULL) , m_checkerBoardDestroyTimer(NULL) , m_isPinchZoomOut(false) +, m_jsTimeouts(0) { } @@ -274,6 +276,9 @@ destroyCheckerBoard(); delete m_checkerBoardDestroyTimer; + if (StaticObjectsContainer::instance()->webSurface()->topView() == this) + StaticObjectsContainer::instance()->webSurface()->setView( NULL ); + } // ----------------------------------------------------------------------------- @@ -355,14 +360,15 @@ m_pageScalerEnabled = false; } else { - if(m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalPage) + if((m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalHistory) + && !(m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalPage)) + { + m_thumbnailGenerator = CThumbnailGenerator::NewL(*this); + } + else { initializePageScalerL(); m_pageScalerEnabled = true; - } - else if(m_brctl->capabilities() & TBrCtlDefs::ECapabilityGraphicalHistory) - { - m_thumbnailGenerator = CThumbnailGenerator::NewL(*this); } } if (m_brctl->capabilities() & TBrCtlDefs::ECapabilityAutoFormFill) { @@ -564,11 +570,12 @@ if ( visible ) { clearOffScreenBitmap(); - m_tabbedNavigation->initializeForPage(); + if ( m_brctl && m_brctl->settings() && SettingsContainer::NavigationTypeTabbed == m_brctl->settings()->getNavigationType() ) { + m_tabbedNavigation->initializeForPage(); + } syncRepaint( mainFrame()->frameView()->visibleRect() ); TRAP_IGNORE( m_webfeptexteditor->EnableCcpuL() ); } - } @@ -1916,6 +1923,9 @@ void WebView::scrollBuffer(TPoint to, TPoint from, TBool usecopyscroll) { + if(!IsVisible()) + return; + TRect rect(m_offscreenrect); TSize bufSize( rect.Size() ); @@ -2521,6 +2531,7 @@ updateScrollbars(mainFrame()->frameView()->contentSize().iHeight, mainFrame()->frameView()->contentPos().iY, mainFrame()->frameView()->contentSize().iWidth, mainFrame()->frameView()->contentPos().iX); + m_allowRepaints = true; syncRepaint(view->visibleRect()); int zoomLevel = m_brctl->historyHandler()->historyController()->currentEntryZoomLevel(); @@ -3250,4 +3261,27 @@ } } +void WebView::pauseJsTimers() +{ + if(m_jsTimeouts==0) { + WebCore::Frame *frame = core(mainFrame()); + KJS::Window* window = KJS::Window::retrieveWindow(frame); + if(window) { + m_jsTimeouts = window->pauseTimeouts(); + } + } +} + +void WebView::resumeJsTimers() +{ + if(m_jsTimeouts) { + WebCore::Frame *frame = core(mainFrame()); + KJS::Window* window = KJS::Window::retrieveWindow(frame); + if(window) { + window->resumeTimeouts(m_jsTimeouts); + delete m_jsTimeouts; + m_jsTimeouts = 0; + } + } +} // END OF FILE diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WebView.h --- a/webengine/osswebengine/WebKit/s60/webview/WebView.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WebView.h Tue May 11 17:13:44 2010 +0300 @@ -39,6 +39,11 @@ class Frame; } +namespace KJS +{ + class PausedTimeouts; +} + class CPluginHandler; class WebPreferences; class WebBackForwardList; @@ -533,6 +538,12 @@ void clearEventFired() { m_firedEvent = 0; } void wait(double t); + + // JavaScript timers - pause and resume + void pauseJsTimers(); + void resumeJsTimers(); + bool jsTimersPaused() { return (m_jsTimeouts) ? true : false; } + void resetJsTimers() { m_jsTimeouts = 0; } private: WebCore::Page* m_page; WebFrameView* m_frameView; @@ -634,6 +645,9 @@ CPeriodic *m_checkerBoardDestroyTimer; TBool m_isPinchZoomOut; + + // JavaScript (DOMWindowTimer) timers + KJS::PausedTimeouts* m_jsTimeouts; }; #endif diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/WebKit/s60/webview/WidgetExtension.cpp --- a/webengine/osswebengine/WebKit/s60/webview/WidgetExtension.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/WebKit/s60/webview/WidgetExtension.cpp Tue May 11 17:13:44 2010 +0300 @@ -209,8 +209,8 @@ //From WidgetEngineCallbacks void CWidgetExtension::drawWidgetTransition() { - WebSurface* surface = WebCore::StaticObjectsContainer::instance()->webSurface(); - if (surface) { + WebSurface* surface = WebCore::StaticObjectsContainer::instance()->webSurface(); + if (surface && surface->topView()) { surface->topView()->DrawDeferred(); } } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.cpp --- a/webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/osswebengine/webkit/s60/webview/WebPagePinchZoomHandler.cpp Tue May 11 17:13:44 2010 +0300 @@ -216,11 +216,7 @@ m_bitmapUpdateTimer->Cancel(); m_webView->restoreZoomLevel(m_webView->scalingFactor()); //update the plugin rect after pinch zoom exit - PluginSkin* pluginskin = m_webView->mainFrame()->focusedPlugin(); - if(pluginskin) - { - pluginskin->setPluginWinClipedRect(); - } + m_webView->mainFrame()->notifyPluginsOfPositionChange(); m_webView->startCheckerBoardDestroyTimer(); } diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/widgetregistry/tsrc/public/basic/group/WidgetRegistrySTIF.mmp --- a/webengine/widgetregistry/tsrc/public/basic/group/WidgetRegistrySTIF.mmp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/widgetregistry/tsrc/public/basic/group/WidgetRegistrySTIF.mmp Tue May 11 17:13:44 2010 +0300 @@ -1,39 +1,52 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* ============================================================================== +* Name : WidgetRegistrySTIF.mmp +* Part of : WidgetRegistrySTIF +* +* Description : STIF for WidgetRegistry +* Version: 1.0 * -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: +* Copyright (C) 2007 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. * -* Description: STIF for WidgetRegistry -* +* ============================================================================ */ - TARGET WidgetRegistrySTIF.dll TARGETTYPE dll UID 0x1000008D 0x101FB3E7 + #if defined(EKA2) CAPABILITY ALL -TCB //VENDORID VID_DEFAULT -VENDORID 0 +//VENDORID 0 #endif DEFFILE WidgetRegistrySTIF.def + SOURCEPATH ../src SOURCE WidgetRegistrySTIF.cpp USERINCLUDE ../inc -MW_LAYER_SYSTEMINCLUDE +SYSTEMINCLUDE /epoc32/include +SYSTEMINCLUDE /epoc32/include/internal +SYSTEMINCLUDE /epoc32/include/domain/osextensions +SYSTEMINCLUDE /epoc32/include/domain/middleware + +#include +#include + +EPOCALLOWDLLDATA LIBRARY euser.lib efsrv.lib favouritesengine.lib estor.lib LIBRARY stiftestinterface.lib diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/widgetregistry/tsrc/public/basic/inc/WidgetRegistrySTIF.h --- a/webengine/widgetregistry/tsrc/public/basic/inc/WidgetRegistrySTIF.h Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/widgetregistry/tsrc/public/basic/inc/WidgetRegistrySTIF.h Tue May 11 17:13:44 2010 +0300 @@ -1,27 +1,30 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* ============================================================================== +* Name : WidgetRegistrySTIF.h +* Part of : WidgetRegistry +* +* Description : Widget Registry test module. +* Version: 1.0 * -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: +* Copyright (C) 2007 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. * -* Description: Widget Registry test module. -* +* ============================================================================ */ - #ifndef WIDGETREGISTRYSTIF_H #define WIDGETREGISTRYSTIF_H // INCLUDES -#include +#include #include #include #include @@ -255,6 +258,14 @@ TInt ClientSessionGetLprojNameL( TTestResult& aResult ); TInt ClientSessionSecurityPolicyId( TTestResult& aResult ); + TInt ClientSessionIsWidgetInFullViewTest( TTestResult& aResult ); + TInt ClientSessionIsWidgetInMiniViewTest( TTestResult& aResult ); + TInt ClientSessionIsBlanketPermGrantedTest( TTestResult& aResult ); + TInt ClientSessionSetMiniViewTestL( TTestResult& aResult ); + TInt ClientSessionSetFullViewTestL( TTestResult& aResult ); + TInt ClientSessionSetBlanketPermissionTestL( TTestResult& aResult ); + TInt ClientSessionWidgetSapiAccessStateTest( TTestResult& aResult ); + private: // Data TUid iValidUid; diff -r 4917f9bf7995 -r 8bfb9186a8b8 webengine/widgetregistry/tsrc/public/basic/src/WidgetRegistrySTIF.cpp --- a/webengine/widgetregistry/tsrc/public/basic/src/WidgetRegistrySTIF.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/webengine/widgetregistry/tsrc/public/basic/src/WidgetRegistrySTIF.cpp Tue May 11 17:13:44 2010 +0300 @@ -1,21 +1,24 @@ /* -* Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). -* All rights reserved. -* This component and the accompanying materials are made available -* under the terms of the License "Eclipse Public License v1.0" -* which accompanies this distribution, and is available -* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* ============================================================================== +* Name : WidgetRegistrySTIF.cpp +* Part of : STIF for WidgetRegistry +* +* Description : CWidgetRegistrySTIF class member functions +* Version: 1.0 * -* Initial Contributors: -* Nokia Corporation - initial contribution. -* -* Contributors: +* Copyright (C) 2007 Nokia Corporation. +* This material, including documentation and any related +* computer programs, is protected by copyright controlled by +* Nokia Corporation. All rights are reserved. Copying, +* including reproducing, storing, adapting or translating, any +* or all of this material requires the prior written consent of +* Nokia Corporation. This material also contains confidential +* information which may not be disclosed to others without the +* prior written consent of Nokia Corporation. * -* Description: CWidgetRegistrySTIF class member functions -* +* ============================================================================ */ - // INCLUDE FILES #include #include "WidgetRegistrySTIF.h" @@ -152,7 +155,9 @@ RWidgetRegistryClientSession* registryClient; registryClient = new (ELeave) RWidgetRegistryClientSession; CleanupStack::PushL( registryClient ); - TInt error = registryClient->Disconnect(); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + error = registryClient->Disconnect(); if ( KErrNone == error ) { aResult.SetResult( KErrNone, KPassed ); @@ -188,7 +193,12 @@ RWidgetRegistryClientSession* registryClient2; registryClient2 = new (ELeave) RWidgetRegistryClientSession; CleanupStack::PushL( registryClient2 ); + + + + TInt error = registryClient2->Connect(); + if ( KErrNone == error ) { aResult.SetResult( KErrNone, KPassed ); @@ -349,7 +359,19 @@ TInt error = registryClient->Connect(); if ( KErrNone == error ) { - TBool b = registryClient->WidgetExistsL( KValidBundle ); + //TBool b = registryClient->WidgetExistsL( KValidBundle ); + RWidgetInfoArray widgetInfoArray; + error = registryClient->InstalledWidgetsL( widgetInfoArray ); + CWidgetInfo *myInfo = widgetInfoArray[0]; + //myInfo->iBundleName; + + TUid ValidUid = myInfo->iUid; + HBufC* iWidgetBundleId = HBufC::NewL(KWidgetRegistryVal); + TPtr widgetBundleId = iWidgetBundleId->Des(); + + //HBufC BundleID( HBufC16::NewL(1024)); + registryClient->GetWidgetBundleId( ValidUid , widgetBundleId ); + TBool b = registryClient->WidgetExistsL( widgetBundleId ); if ( b != EFalse ) { aResult.SetResult( KErrNone, KPassed ); @@ -496,7 +518,20 @@ TInt error = registryClient->Connect(); if ( KErrNone == error ) { - TInt uid = registryClient->GetWidgetUidL( KValidBundle ); + RWidgetInfoArray widgetInfoArray; + error = registryClient->InstalledWidgetsL( widgetInfoArray ); + CWidgetInfo *myInfo = widgetInfoArray[0]; + //myInfo->iBundleName; + + TUid ValidUid = myInfo->iUid; + HBufC* iWidgetBundleId = HBufC::NewL(KWidgetRegistryVal); + TPtr widgetBundleId = iWidgetBundleId->Des(); + + //HBufC BundleID( HBufC16::NewL(1024)); + + registryClient->GetWidgetBundleId( ValidUid , widgetBundleId ); + TInt uid = registryClient->GetWidgetUidL( widgetBundleId ); + if ( iValidUid == TUid::Uid( uid ) ) { aResult.SetResult( KErrNone, KPassed ); @@ -796,6 +831,232 @@ } +//Added as part of homescreen implementation testcases + +//Method to verify IsWidgetInFullView API + TInt CWidgetRegistrySTIF::ClientSessionIsWidgetInFullViewTest( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + + const TInt maxExponent = 32; + TAny* Cells[maxExponent]; + TInt j=0; + + for (TInt i = 0; i < maxExponent; i++) + Cells[i] = 0; + + + for (TInt i = KMaxTInt/2-1; i > 0; ) + { + Cells[j] = User::Alloc(i); + if( !( Cells[j] ) ) + { + i/=2; + } + else + { + j++; + } + } + TBool iswidgetinfullview = registryClient->IsWidgetInFullView( KNullUid ); + + for (TInt i = 0; i < maxExponent; i++) // release all consumed heap memory + if (Cells[i]) + User::Free(Cells[i]); + + + if(EFalse == iswidgetinfullview) + { + aResult.SetResult( KErrNone, KPassed ); + } + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + +//Method to verify IsWidgetInMiniView API + TInt CWidgetRegistrySTIF::ClientSessionIsWidgetInMiniViewTest( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + + const TInt maxExponent = 32; + TAny* Cells[maxExponent]; + TInt j=0; + + for (TInt i = 0; i < maxExponent; i++) + Cells[i] = 0; + + + for (TInt i = KMaxTInt/2-1; i > 0; ) + { + Cells[j] = User::Alloc(i); + if( !( Cells[j] ) ) + { + i/=2; + } + else + { + j++; + } + } + TBool iswidgetinminiview = registryClient->IsWidgetInMiniView( KNullUid ); + + for (TInt i = 0; i < maxExponent; i++) // release all consumed heap memory + if (Cells[i]) + User::Free(Cells[i]); + if(EFalse == iswidgetinminiview) + { + aResult.SetResult( KErrNone, KPassed ); + } + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + +//Method to verify IsBlanketPermGranted API + TInt CWidgetRegistrySTIF::ClientSessionIsBlanketPermGrantedTest( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + TBool iswidgetgranted = registryClient->IsBlanketPermGranted( KNullUid ); + if(EFalse == iswidgetgranted) + { + aResult.SetResult( KErrNone, KPassed ); + } + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + + +//Method to verify SetminiViewL API + TInt CWidgetRegistrySTIF::ClientSessionSetMiniViewTestL( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + registryClient->SetMiniViewL( KNullUid, 0 ); + aResult.SetResult( KErrNone, KPassed ); + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + + +//Method to verify SetFullViewL API + TInt CWidgetRegistrySTIF::ClientSessionSetFullViewTestL( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + registryClient->SetFullViewL( KNullUid, 0 ); + aResult.SetResult( KErrNone, KPassed ); + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + +//Method to verify SetBlanketPermissionL API + TInt CWidgetRegistrySTIF::ClientSessionSetBlanketPermissionTestL( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + const TInt maxExponent = 32; + TAny* Cells[maxExponent]; + TInt j=0; + + for (TInt i = 0; i < maxExponent; i++) + Cells[i] = 0; + + + for (TInt i = KMaxTInt/2-1; i > 0; ) + { + Cells[j] = User::Alloc(i); + if( !( Cells[j] ) ) + { + i/=2; + } + else + { + j++; + } + } + registryClient->SetBlanketPermissionL( KNullUid, 0 ); + + for (TInt i = 0; i < maxExponent; i++) // release all consumed heap memory + if (Cells[i]) + User::Free(Cells[i]); + + + aResult.SetResult( KErrNone, KPassed ); + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + + +//Method to verify WidgetSapiAccessState API + TInt CWidgetRegistrySTIF::ClientSessionWidgetSapiAccessStateTest( TTestResult& aResult ) + { + aResult.SetResult( KErrGeneral, KFailed ); + RWidgetRegistryClientSession* registryClient; + registryClient = new (ELeave) RWidgetRegistryClientSession; + CleanupStack::PushL( registryClient ); + TInt error = registryClient->Connect(); + if ( KErrNone == error ) + { + TInt aAccessState = registryClient->WidgetSapiAccessState( KNullUid ); + if(aAccessState == -1) + { + aResult.SetResult( KErrNone, KPassed ); + } + else + { + aResult.SetResult( KErrNone, KFailed ); + } + registryClient->Disconnect(); + } + CleanupStack::PopAndDestroy( registryClient ); + return KErrNone; + } + + const TCaseInfo CWidgetRegistrySTIF::Case ( const TInt aCaseNumber ) const { static TCaseInfoInternal const KCases[] = @@ -871,6 +1132,20 @@ CWidgetRegistrySTIF::ClientSessionGetLprojNameL ), ENTRY( "ClientSession SecurityPolicyId", CWidgetRegistrySTIF::ClientSessionSecurityPolicyId ), + ENTRY( "ClientSession IsWidgetInFullViewTest", + CWidgetRegistrySTIF::ClientSessionIsWidgetInFullViewTest ), + ENTRY( "ClientSession IsWidgetInMiniViewTest", + CWidgetRegistrySTIF::ClientSessionIsWidgetInMiniViewTest ), + ENTRY( "ClientSession IsBlanketPermGrantedTest", + CWidgetRegistrySTIF::ClientSessionIsBlanketPermGrantedTest ), + ENTRY( "ClientSession SetminiViewTestL", + CWidgetRegistrySTIF::ClientSessionSetMiniViewTestL ), + ENTRY( "ClientSession SetFullViewTestL", + CWidgetRegistrySTIF::ClientSessionSetFullViewTestL ), + ENTRY( "ClientSession SetBlanketPermissionTestL", + CWidgetRegistrySTIF::ClientSessionSetBlanketPermissionTestL ), + ENTRY( "ClientSession WidgetSapiAccessStateTest", + CWidgetRegistrySTIF::ClientSessionWidgetSapiAccessStateTest ), }; /* diff -r 4917f9bf7995 -r 8bfb9186a8b8 widgets/widgetapp/src/WidgetUiNetworkListener.cpp --- a/widgets/widgetapp/src/WidgetUiNetworkListener.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/widgets/widgetapp/src/WidgetUiNetworkListener.cpp Tue May 11 17:13:44 2010 +0300 @@ -91,12 +91,24 @@ } else if ( iNote().iState == EInterfaceDown ) { +#ifndef BRDO_OCC_ENABLED_FF + RTimer timer; + TRequestStatus timerStatus; // Request status associated with timer + timer.CreateLocal(); +#endif // check if there are no other active connections if ( !CheckActiveNetworkConnection() ) { // notify widgets of a network connection going down iWindowManager.NotifyConnecionChange( EFalse ); +#ifndef BRDO_OCC_ENABLED_FF + timer.After(timerStatus,30000000); + User::WaitForRequest(timerStatus); +#endif } +#ifndef BRDO_OCC_ENABLED_FF + timer.Close(); +#endif } iConn.AllInterfaceNotification( iNote, iStatus ); diff -r 4917f9bf7995 -r 8bfb9186a8b8 widgets/widgetapp/src/WidgetUiWindow.cpp --- a/widgets/widgetapp/src/WidgetUiWindow.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/widgets/widgetapp/src/WidgetUiWindow.cpp Tue May 11 17:13:44 2010 +0300 @@ -925,7 +925,10 @@ User::Leave( connFailure ); } *aNewConn = ETrue; - + +#ifdef BRDO_OCC_ENABLED_FF + TRAP_IGNORE(ConnNeededStatusL(KErrNone)); +#endif } } @@ -1323,6 +1326,8 @@ TRAP_IGNORE( Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandSetRetryConnectivityFlag + (TInt)TBrCtlDefs::ECommandIdBase ) ); SetRetryFlag(ETrue); + TRAP_IGNORE( Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandCancelQueuedTransactions + (TInt)TBrCtlDefs::ECommandIdBase ) ); + if( iRetryConnectivity && iRetryConnectivity->IsActive()) { iRetryConnectivity->Cancel(); @@ -1349,7 +1354,7 @@ void CWidgetUiWindow::StopConnectionObserving() { - if ( iConnStageNotifier && iConnStageNotifier->IsActive() ) + if ( iConnStageNotifier ) { iConnStageNotifier->Cancel(); } diff -r 4917f9bf7995 -r 8bfb9186a8b8 widgets/widgetapp/src/WidgetUiWindowManager.cpp --- a/widgets/widgetapp/src/WidgetUiWindowManager.cpp Tue Apr 27 17:46:17 2010 +0300 +++ b/widgets/widgetapp/src/WidgetUiWindowManager.cpp Tue May 11 17:13:44 2010 +0300 @@ -688,7 +688,10 @@ TRAP_IGNORE( aWidgetWindow->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandIdBase + (TInt)TBrCtlDefs::ECommandDisconnect ) ); - iConnection->CancelConnection(); + iConnection->CancelConnection(); +#ifdef BRDO_OCC_ENABLED_FF + aWidgetWindow->StopConnectionObserving(); +#endif iConnection->StopConnectionL(); delete aWidgetWindow; return ETrue; @@ -711,6 +714,9 @@ aWidgetWindow->Engine()->HandleCommandL( (TInt)TBrCtlDefs::ECommandIdBase + (TInt)TBrCtlDefs::ECommandDisconnect ); +#ifdef BRDO_OCC_ENABLED_FF + aWidgetWindow->StopConnectionObserving(); +#endif iConnection->StopConnectionL(); } delete aWidgetWindow; @@ -1090,6 +1096,7 @@ (TInt)TBrCtlDefs::ECommandIdBase); #ifdef BRDO_WRT_HS_FF wdgt_window->Engine()->MakeVisible( EFalse ); + wdgt_window->SetIsCurrentWindow( EFalse ); wdgt_window->Engine()->SetRect( iCpsPublisher->BitmapSize()); //When HS comes to foreground show the latest updatd content on HS. //Relayout can sometimes happen only when widget in FullView. @@ -1405,6 +1412,9 @@ (TInt)TBrCtlDefs::ECommandIdBase + (TInt)TBrCtlDefs::ECommandDisconnect ) ); iConnection->CancelConnection(); +#ifdef BRDO_OCC_ENABLED_FF + window->StopConnectionObserving(); +#endif iConnection->StopConnectionL(); delete window; } @@ -1559,6 +1569,9 @@ (TInt)TBrCtlDefs::ECommandIdBase + (TInt)TBrCtlDefs::ECommandDisconnect ); iConnection->CancelConnection(); +#ifdef BRDO_OCC_ENABLED_FF + window->StopConnectionObserving(); +#endif iConnection->StopConnectionL(); } }