diff options
Diffstat (limited to 'WebCore/loader/ProgressTracker.cpp')
-rw-r--r-- | WebCore/loader/ProgressTracker.cpp | 253 |
1 files changed, 0 insertions, 253 deletions
diff --git a/WebCore/loader/ProgressTracker.cpp b/WebCore/loader/ProgressTracker.cpp deleted file mode 100644 index 56aa976..0000000 --- a/WebCore/loader/ProgressTracker.cpp +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (C) 2007 Apple Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY - * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY - * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "config.h" -#include "ProgressTracker.h" - -#include "Frame.h" -#include "FrameLoader.h" -#include "FrameLoaderClient.h" -#include "ResourceResponse.h" -#include "SystemTime.h" - -using std::min; - -namespace WebCore { - -// Always start progress at initialProgressValue. This helps provide feedback as -// soon as a load starts. -static const double initialProgressValue = 0.1; - -// Similarly, always leave space at the end. This helps show the user that we're not done -// until we're done. -static const double finalProgressValue = 0.9; // 1.0 - initialProgressValue - -static const int progressItemDefaultEstimatedLength = 1024 * 16; - -struct ProgressItem { - ProgressItem(long long length) - : bytesReceived(0) - , estimatedLength(length) { } - - long long bytesReceived; - long long estimatedLength; -}; - -ProgressTracker::ProgressTracker() - : m_uniqueIdentifier(0) - , m_totalPageAndResourceBytesToLoad(0) - , m_totalBytesReceived(0) - , m_lastNotifiedProgressValue(0) - , m_lastNotifiedProgressTime(0) - , m_progressNotificationInterval(0.02) - , m_progressNotificationTimeInterval(0.1) - , m_finalProgressChangedSent(false) - , m_progressValue(0) - , m_numProgressTrackedFrames(0) -{ -} - -ProgressTracker::~ProgressTracker() -{ - deleteAllValues(m_progressItems); -} - -double ProgressTracker::estimatedProgress() const -{ - return m_progressValue; -} - -void ProgressTracker::reset() -{ - deleteAllValues(m_progressItems); - m_progressItems.clear(); - - m_totalPageAndResourceBytesToLoad = 0; - m_totalBytesReceived = 0; - m_progressValue = 0; - m_lastNotifiedProgressValue = 0; - m_lastNotifiedProgressTime = 0; - m_finalProgressChangedSent = false; - m_numProgressTrackedFrames = 0; - m_originatingProgressFrame = 0; -} - -void ProgressTracker::progressStarted(Frame* frame) -{ - // LOG (Progress, "frame %p(%@), _private->numProgressTrackedFrames %d, _private->originatingProgressFrame %p", frame, [frame name], _private->numProgressTrackedFrames, _private->originatingProgressFrame); - - frame->loader()->client()->willChangeEstimatedProgress(); - - if (m_numProgressTrackedFrames == 0 || m_originatingProgressFrame == frame) { - reset(); - m_progressValue = initialProgressValue; - m_originatingProgressFrame = frame; - - m_originatingProgressFrame->loader()->client()->postProgressStartedNotification(); - } - m_numProgressTrackedFrames++; - - frame->loader()->client()->didChangeEstimatedProgress(); -} - -void ProgressTracker::progressCompleted(Frame* frame) -{ - // LOG (Progress, "frame %p(%@), _private->numProgressTrackedFrames %d, _private->originatingProgressFrame %p", frame, [frame name], _private->numProgressTrackedFrames, _private->originatingProgressFrame); - - if (m_numProgressTrackedFrames <= 0) - return; - - frame->loader()->client()->willChangeEstimatedProgress(); - - m_numProgressTrackedFrames--; - if (m_numProgressTrackedFrames == 0 || - (frame == m_originatingProgressFrame && m_numProgressTrackedFrames != 0)) - finalProgressComplete(); - - frame->loader()->client()->didChangeEstimatedProgress(); -} - -void ProgressTracker::finalProgressComplete() -{ - // LOG (Progress, ""); - - RefPtr<Frame> frame = m_originatingProgressFrame.release(); - - // Before resetting progress value be sure to send client a least one notification - // with final progress value. - if (!m_finalProgressChangedSent) { - m_progressValue = 1; - frame->loader()->client()->postProgressEstimateChangedNotification(); - } - - reset(); - - frame->loader()->client()->setMainFrameDocumentReady(true); - frame->loader()->client()->postProgressFinishedNotification(); -} - -void ProgressTracker::incrementProgress(unsigned long identifier, const ResourceResponse& response) -{ - // LOG (Progress, "_private->numProgressTrackedFrames %d, _private->originatingProgressFrame %p", _private->numProgressTrackedFrames, _private->originatingProgressFrame); - - if (m_numProgressTrackedFrames <= 0) - return; - - long long estimatedLength = response.expectedContentLength(); - if (estimatedLength < 0) - estimatedLength = progressItemDefaultEstimatedLength; - - m_totalPageAndResourceBytesToLoad += estimatedLength; - - if (ProgressItem* item = m_progressItems.get(identifier)) { - item->bytesReceived = 0; - item->estimatedLength = estimatedLength; - } else - m_progressItems.set(identifier, new ProgressItem(estimatedLength)); -} - -void ProgressTracker::incrementProgress(unsigned long identifier, const char*, int length) -{ - ProgressItem* item = m_progressItems.get(identifier); - - // FIXME: Can this ever happen? - if (!item) - return; - - m_originatingProgressFrame->loader()->client()->willChangeEstimatedProgress(); - - unsigned bytesReceived = length; - double increment, percentOfRemainingBytes; - long long remainingBytes, estimatedBytesForPendingRequests; - - item->bytesReceived += bytesReceived; - if (item->bytesReceived > item->estimatedLength) { - m_totalPageAndResourceBytesToLoad += ((item->bytesReceived * 2) - item->estimatedLength); - item->estimatedLength = item->bytesReceived * 2; - } - - int numPendingOrLoadingRequests = m_originatingProgressFrame->loader()->numPendingOrLoadingRequests(true); - estimatedBytesForPendingRequests = progressItemDefaultEstimatedLength * numPendingOrLoadingRequests; - remainingBytes = ((m_totalPageAndResourceBytesToLoad + estimatedBytesForPendingRequests) - m_totalBytesReceived); - if (remainingBytes > 0) // Prevent divide by 0. - percentOfRemainingBytes = (double)bytesReceived / (double)remainingBytes; - else - percentOfRemainingBytes = 1.0; - - // Treat the first layout as the half-way point. - double maxProgressValue = m_originatingProgressFrame->loader()->firstLayoutDone() ? finalProgressValue : .5; - increment = (maxProgressValue - m_progressValue) * percentOfRemainingBytes; - m_progressValue += increment; - m_progressValue = min(m_progressValue, maxProgressValue); - ASSERT(m_progressValue >= initialProgressValue); - - m_totalBytesReceived += bytesReceived; - - double now = currentTime(); - double notifiedProgressTimeDelta = now - m_lastNotifiedProgressTime; - - // LOG (Progress, "_private->progressValue %g, _private->numProgressTrackedFrames %d", _private->progressValue, _private->numProgressTrackedFrames); - double notificationProgressDelta = m_progressValue - m_lastNotifiedProgressValue; - if ((notificationProgressDelta >= m_progressNotificationInterval || - notifiedProgressTimeDelta >= m_progressNotificationTimeInterval) && - m_numProgressTrackedFrames > 0) { - if (!m_finalProgressChangedSent) { - if (m_progressValue == 1) - m_finalProgressChangedSent = true; - - m_originatingProgressFrame->loader()->client()->postProgressEstimateChangedNotification(); - - m_lastNotifiedProgressValue = m_progressValue; - m_lastNotifiedProgressTime = now; - } - } - - m_originatingProgressFrame->loader()->client()->didChangeEstimatedProgress(); -} - -void ProgressTracker::completeProgress(unsigned long identifier) -{ - ProgressItem* item = m_progressItems.get(identifier); - - // FIXME: Can this happen? - if (!item) - return; - - // Adjust the total expected bytes to account for any overage/underage. - long long delta = item->bytesReceived - item->estimatedLength; - m_totalPageAndResourceBytesToLoad += delta; - item->estimatedLength = item->bytesReceived; - - m_progressItems.remove(identifier); - delete item; -} - -unsigned long ProgressTracker::createUniqueIdentifier() -{ - return ++m_uniqueIdentifier; -} - - -} |