| Index: third_party/WebKit/WebCore/history/HistoryItem.cpp
|
| ===================================================================
|
| --- third_party/WebKit/WebCore/history/HistoryItem.cpp (revision 9310)
|
| +++ third_party/WebKit/WebCore/history/HistoryItem.cpp (working copy)
|
| @@ -74,7 +74,7 @@
|
| , m_lastVisitWasFailure(false)
|
| , m_isTargetItem(false)
|
| , m_visitCount(0)
|
| -{
|
| +{
|
| iconDatabase()->retainIconForPageURL(m_urlString);
|
| }
|
|
|
| @@ -114,6 +114,8 @@
|
| , m_lastVisitWasFailure(item.m_lastVisitWasFailure)
|
| , m_isTargetItem(item.m_isTargetItem)
|
| , m_visitCount(item.m_visitCount)
|
| + , m_dailyVisitCounts(item.m_dailyVisitCounts)
|
| + , m_weeklyVisitCounts(item.m_weeklyVisitCounts)
|
| , m_formContentType(item.m_formContentType)
|
| {
|
| ASSERT(!item.m_cachedPage);
|
| @@ -246,31 +248,93 @@
|
| m_parent = parent;
|
| }
|
|
|
| -void HistoryItem::setLastVisitedTime(double time)
|
| +static inline int timeToDay(double time)
|
| {
|
| - if (m_lastVisitedTime != time) {
|
| - m_lastVisitedTime = time;
|
| - m_visitCount++;
|
| + static const double secondsPerDay = 60 * 60 * 24;
|
| + return static_cast<int>(ceil(time / secondsPerDay));
|
| +}
|
| +
|
| +void HistoryItem::padDailyCountsForNewVisit(double time)
|
| +{
|
| + if (m_dailyVisitCounts.isEmpty())
|
| + m_dailyVisitCounts.prepend(m_visitCount);
|
| +
|
| + int daysElapsed = timeToDay(time) - timeToDay(m_lastVisitedTime);
|
| +
|
| + if (daysElapsed < 0)
|
| + daysElapsed = 0;
|
| +
|
| + Vector<int> padding;
|
| + padding.fill(0, daysElapsed);
|
| + m_dailyVisitCounts.prepend(padding);
|
| +}
|
| +
|
| +static const size_t daysPerWeek = 7;
|
| +static const size_t maxDailyCounts = 2 * daysPerWeek - 1;
|
| +static const size_t maxWeeklyCounts = 5;
|
| +
|
| +void HistoryItem::collapseDailyVisitsToWeekly()
|
| +{
|
| + while (m_dailyVisitCounts.size() > maxDailyCounts) {
|
| + int oldestWeekTotal = 0;
|
| + for (size_t i = 0; i < daysPerWeek; i++)
|
| + oldestWeekTotal += m_dailyVisitCounts[m_dailyVisitCounts.size() - daysPerWeek + i];
|
| + m_dailyVisitCounts.shrink(m_dailyVisitCounts.size() - daysPerWeek);
|
| + m_weeklyVisitCounts.prepend(oldestWeekTotal);
|
| }
|
| +
|
| + if (m_weeklyVisitCounts.size() > maxWeeklyCounts)
|
| + m_weeklyVisitCounts.shrink(maxWeeklyCounts);
|
| }
|
|
|
| -void HistoryItem::visited(const String& title, double time)
|
| +void HistoryItem::recordVisitAtTime(double time)
|
| {
|
| - m_title = title;
|
| + padDailyCountsForNewVisit(time);
|
| +
|
| m_lastVisitedTime = time;
|
| m_visitCount++;
|
| +
|
| + m_dailyVisitCounts[0]++;
|
| +
|
| + collapseDailyVisitsToWeekly();
|
| }
|
|
|
| +void HistoryItem::setLastVisitedTime(double time)
|
| +{
|
| + if (m_lastVisitedTime != time)
|
| + recordVisitAtTime(time);
|
| +}
|
| +
|
| +void HistoryItem::visited(const String& title, double time)
|
| +{
|
| + m_title = title;
|
| + recordVisitAtTime(time);
|
| +}
|
| +
|
| int HistoryItem::visitCount() const
|
| {
|
| return m_visitCount;
|
| }
|
|
|
| +void HistoryItem::recordInitialVisit()
|
| +{
|
| + ASSERT(!m_visitCount);
|
| + recordVisitAtTime(m_lastVisitedTime);
|
| +}
|
| +
|
| void HistoryItem::setVisitCount(int count)
|
| {
|
| m_visitCount = count;
|
| }
|
|
|
| +void HistoryItem::adoptVisitCounts(Vector<int>& dailyCounts, Vector<int>& weeklyCounts)
|
| +{
|
| + m_dailyVisitCounts.clear();
|
| + m_dailyVisitCounts.swap(dailyCounts);
|
| + m_weeklyVisitCounts.clear();
|
| + m_weeklyVisitCounts.swap(weeklyCounts);
|
| +}
|
| +
|
| const IntPoint& HistoryItem::scrollPoint() const
|
| {
|
| return m_scrollPoint;
|
| @@ -395,6 +459,9 @@
|
|
|
| void HistoryItem::mergeAutoCompleteHints(HistoryItem* otherItem)
|
| {
|
| + // FIXME: this is broken - we should be merging the daily counts
|
| + // somehow. but this is to support API that's not really used in
|
| + // practice so leave it broken for now.
|
| ASSERT(otherItem);
|
| if (otherItem != this)
|
| m_visitCount += otherItem->m_visitCount;
|
|
|