summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/VisitedLinkProvider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/VisitedLinkProvider.cpp')
-rw-r--r--Source/WebKit2/UIProcess/VisitedLinkProvider.cpp199
1 files changed, 0 insertions, 199 deletions
diff --git a/Source/WebKit2/UIProcess/VisitedLinkProvider.cpp b/Source/WebKit2/UIProcess/VisitedLinkProvider.cpp
deleted file mode 100644
index 7ecae847c..000000000
--- a/Source/WebKit2/UIProcess/VisitedLinkProvider.cpp
+++ /dev/null
@@ -1,199 +0,0 @@
-/*
- * Copyright (C) 2010 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 INC. AND ITS CONTRIBUTORS ``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 INC. OR ITS 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 "VisitedLinkProvider.h"
-
-#include "SharedMemory.h"
-#include "VisitedLinkTable.h"
-#include "WebContext.h"
-#include "WebProcessMessages.h"
-
-using namespace WebCore;
-
-namespace WebKit {
-
-static const int VisitedLinkTableMaxLoad = 2;
-
-VisitedLinkProvider::VisitedLinkProvider(WebContext* context)
- : m_context(context)
- , m_visitedLinksPopulated(false)
- , m_keyCount(0)
- , m_tableSize(0)
- , m_pendingVisitedLinksTimer(RunLoop::main(), this, &VisitedLinkProvider::pendingVisitedLinksTimerFired)
-{
-}
-
-void VisitedLinkProvider::processDidFinishLaunching(WebProcessProxy* process)
-{
- m_processesWithoutVisitedLinkState.add(process);
-
- if (m_keyCount)
- m_pendingVisitedLinksTimer.startOneShot(0);
-
- if (m_visitedLinksPopulated)
- return;
-
- m_context->populateVisitedLinks();
-
- m_visitedLinksPopulated = true;
-}
-
-void VisitedLinkProvider::addVisitedLink(LinkHash linkHash)
-{
- m_pendingVisitedLinks.add(linkHash);
-
- if (!m_pendingVisitedLinksTimer.isActive())
- m_pendingVisitedLinksTimer.startOneShot(0);
-}
-
-void VisitedLinkProvider::processDidClose(WebProcessProxy* process)
-{
- m_processesWithVisitedLinkState.remove(process);
- m_processesWithoutVisitedLinkState.remove(process);
-}
-
-static unsigned nextPowerOf2(unsigned v)
-{
- // Taken from http://www.cs.utk.edu/~vose/c-stuff/bithacks.html
- // Devised by Sean Anderson, Sepember 14, 2001
-
- v--;
- v |= v >> 1;
- v |= v >> 2;
- v |= v >> 4;
- v |= v >> 8;
- v |= v >> 16;
- v++;
-
- return v;
-}
-
-static unsigned tableSizeForKeyCount(unsigned keyCount)
-{
- // We want the table to be at least half empty.
- unsigned tableSize = nextPowerOf2(keyCount * VisitedLinkTableMaxLoad);
-
- // Ensure that the table size is at least the size of a page.
- size_t minimumTableSize = SharedMemory::systemPageSize() / sizeof(LinkHash);
- if (tableSize < minimumTableSize)
- return minimumTableSize;
-
- return tableSize;
-}
-
-void VisitedLinkProvider::pendingVisitedLinksTimerFired()
-{
- Vector<WebCore::LinkHash> pendingVisitedLinks;
- copyToVector(m_pendingVisitedLinks, pendingVisitedLinks);
- m_pendingVisitedLinks.clear();
-
- unsigned currentTableSize = m_tableSize;
-
- // Upper bound on needed size - some of the links may be duplicates, in which case we could have done with less.
- unsigned newTableSize = tableSizeForKeyCount(m_keyCount + pendingVisitedLinks.size());
-
- // Never decrease table size when adding to it, to avoid unneeded churn.
- newTableSize = std::max(currentTableSize, newTableSize);
-
- // Links that were added.
- Vector<WebCore::LinkHash> addedVisitedLinks;
-
- // VisitedLinkTable remains internally consistent when adding, so it's OK to modify it in place
- // even if a web process is accessing it at the same time.
- if (currentTableSize != newTableSize) {
- RefPtr<SharedMemory> newTableMemory = SharedMemory::create(newTableSize * sizeof(LinkHash));
-
- // We failed to create the shared memory.
- if (!newTableMemory) {
- LOG_ERROR("Could not allocate shared memory for visited link table");
- return;
- }
-
- memset(newTableMemory->data(), 0, newTableMemory->size());
-
- RefPtr<SharedMemory> currentTableMemory = m_table.sharedMemory();
-
- m_table.setSharedMemory(newTableMemory);
- m_tableSize = newTableSize;
-
- if (currentTableMemory) {
- ASSERT(currentTableMemory->size() == currentTableSize * sizeof(LinkHash));
-
- // Go through the current hash table and re-add all entries to the new hash table.
- const LinkHash* currentLinkHashes = static_cast<const LinkHash*>(currentTableMemory->data());
- for (unsigned i = 0; i < currentTableSize; ++i) {
- LinkHash linkHash = currentLinkHashes[i];
-
- if (!linkHash)
- continue;
-
- // It should always be possible to add the link hash to a new table.
- if (!m_table.addLinkHash(linkHash))
- ASSERT_NOT_REACHED();
- }
- }
- }
-
- for (size_t i = 0; i < pendingVisitedLinks.size(); ++i) {
- if (m_table.addLinkHash(pendingVisitedLinks[i]))
- addedVisitedLinks.append(pendingVisitedLinks[i]);
- }
-
- m_keyCount += pendingVisitedLinks.size();
-
-
- for (HashSet<WebProcessProxy*>::iterator iter = m_processesWithVisitedLinkState.begin(); iter != m_processesWithVisitedLinkState.end(); ++iter) {
- WebProcessProxy* process = *iter;
- if (currentTableSize != newTableSize) {
- // In the rare case of needing to resize the table, we'll bypass the VisitedLinkStateChanged optimization,
- // and unconditionally use AllVisitedLinkStateChanged for the process.
- m_processesWithoutVisitedLinkState.add(process);
- continue;
- }
-
- if (addedVisitedLinks.size() <= 20)
- process->send(Messages::WebProcess::VisitedLinkStateChanged(addedVisitedLinks), 0);
- else
- process->send(Messages::WebProcess::AllVisitedLinkStateChanged(), 0);
- }
-
- for (HashSet<WebProcessProxy*>::iterator iter = m_processesWithoutVisitedLinkState.begin(); iter != m_processesWithoutVisitedLinkState.end(); ++iter) {
- WebProcessProxy* process = *iter;
-
- SharedMemory::Handle handle;
- if (!m_table.sharedMemory()->createHandle(handle, SharedMemory::ReadOnly))
- return;
-
- process->send(Messages::WebProcess::SetVisitedLinkTable(handle), 0);
- process->send(Messages::WebProcess::AllVisitedLinkStateChanged(), 0);
-
- m_processesWithVisitedLinkState.add(process);
- }
-
- m_processesWithoutVisitedLinkState.clear();
-}
-
-} // namespace WebKit