/* * Copyright (C) 2012, 2013 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 "PlugInAutoStartProvider.h" #include "ImmutableArray.h" #include "ImmutableDictionary.h" #include "WebContext.h" #include "WebContextClient.h" #include "WebProcessMessages.h" #include using namespace WebCore; static const double plugInAutoStartExpirationTimeThreshold = 30 * 24 * 60 * 60; namespace WebKit { PlugInAutoStartProvider::PlugInAutoStartProvider(WebContext* context) : m_context(context) { } static double expirationTimeFromNow() { return currentTime() + plugInAutoStartExpirationTimeThreshold; } void PlugInAutoStartProvider::addAutoStartOriginHash(const String& pageOrigin, unsigned plugInOriginHash) { if (m_hashToOriginMap.contains(plugInOriginHash)) return; AutoStartTable::iterator it = m_autoStartTable.find(pageOrigin); if (it == m_autoStartTable.end()) it = m_autoStartTable.add(pageOrigin, PlugInAutoStartOriginHash()).iterator; double expirationTime = expirationTimeFromNow(); it->value.set(plugInOriginHash, expirationTime); m_hashToOriginMap.set(plugInOriginHash, pageOrigin); m_context->sendToAllProcesses(Messages::WebProcess::DidAddPlugInAutoStartOriginHash(plugInOriginHash, expirationTime)); m_context->client().plugInAutoStartOriginHashesChanged(m_context); } PlugInAutoStartOriginHash PlugInAutoStartProvider::autoStartOriginHashesCopy() const { PlugInAutoStartOriginHash copyMap; AutoStartTable::const_iterator end = m_autoStartTable.end(); for (AutoStartTable::const_iterator it = m_autoStartTable.begin(); it != end; ++it) { PlugInAutoStartOriginHash::const_iterator mapEnd = it->value.end(); for (PlugInAutoStartOriginHash::const_iterator mapIt = it->value.begin(); mapIt != mapEnd; ++mapIt) copyMap.set(mapIt->key, mapIt->value); } return copyMap; } PassRefPtr PlugInAutoStartProvider::autoStartOriginsTableCopy() const { ImmutableDictionary::MapType map; AutoStartTable::const_iterator end = m_autoStartTable.end(); double now = currentTime(); for (AutoStartTable::const_iterator it = m_autoStartTable.begin(); it != end; ++it) { ImmutableDictionary::MapType hashMap; PlugInAutoStartOriginHash::const_iterator valueEnd = it->value.end(); for (PlugInAutoStartOriginHash::const_iterator valueIt = it->value.begin(); valueIt != valueEnd; ++valueIt) { if (now > valueIt->value) continue; hashMap.set(String::number(valueIt->key), WebDouble::create(valueIt->value)); } if (hashMap.size()) map.set(it->key, ImmutableDictionary::adopt(hashMap)); } return ImmutableDictionary::adopt(map); } void PlugInAutoStartProvider::setAutoStartOriginsTable(ImmutableDictionary& table) { m_hashToOriginMap.clear(); m_autoStartTable.clear(); HashMap hashMap; ImmutableDictionary::MapType::const_iterator end = table.map().end(); for (ImmutableDictionary::MapType::const_iterator it = table.map().begin(); it != end; ++it) { PlugInAutoStartOriginHash hashes; ImmutableDictionary* hashesForPage = static_cast(it->value.get()); ImmutableDictionary::MapType::const_iterator hashEnd = hashesForPage->map().end(); for (ImmutableDictionary::MapType::const_iterator hashIt = hashesForPage->map().begin(); hashIt != hashEnd; ++hashIt) { bool ok; unsigned hash = hashIt->key.toUInt(&ok); if (!ok) continue; if (hashIt->value->type() != WebDouble::APIType) continue; double expirationTime = static_cast(hashIt->value.get())->value(); hashes.set(hash, expirationTime); hashMap.set(hash, expirationTime); m_hashToOriginMap.set(hash, it->key); } m_autoStartTable.set(it->key, hashes); } m_context->sendToAllProcesses(Messages::WebProcess::ResetPlugInAutoStartOriginHashes(hashMap)); } void PlugInAutoStartProvider::setAutoStartOriginsArray(ImmutableArray& originList) { m_autoStartOrigins.clear(); for (size_t i = 0, length = originList.size(); i < length; ++i) { if (originList.at(i)->type() != WebString::APIType) continue; m_autoStartOrigins.append(static_cast(originList.at(i))->string()); } } void PlugInAutoStartProvider::didReceiveUserInteraction(unsigned plugInOriginHash) { HashMap::const_iterator it = m_hashToOriginMap.find(plugInOriginHash); if (it == m_hashToOriginMap.end()) { ASSERT_NOT_REACHED(); return; } double newExpirationTime = expirationTimeFromNow(); m_autoStartTable.find(it->value)->value.set(plugInOriginHash, newExpirationTime); m_context->sendToAllProcesses(Messages::WebProcess::DidAddPlugInAutoStartOriginHash(plugInOriginHash, newExpirationTime)); m_context->client().plugInAutoStartOriginHashesChanged(m_context); } } // namespace WebKit