summaryrefslogtreecommitdiff
path: root/Source/WebKit2/UIProcess/Plugins/PlugInAutoStartProvider.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit2/UIProcess/Plugins/PlugInAutoStartProvider.cpp')
-rw-r--r--Source/WebKit2/UIProcess/Plugins/PlugInAutoStartProvider.cpp158
1 files changed, 158 insertions, 0 deletions
diff --git a/Source/WebKit2/UIProcess/Plugins/PlugInAutoStartProvider.cpp b/Source/WebKit2/UIProcess/Plugins/PlugInAutoStartProvider.cpp
new file mode 100644
index 000000000..fd0e1d9ee
--- /dev/null
+++ b/Source/WebKit2/UIProcess/Plugins/PlugInAutoStartProvider.cpp
@@ -0,0 +1,158 @@
+/*
+ * 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 <wtf/CurrentTime.h>
+
+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<ImmutableDictionary> 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<unsigned, double> 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<ImmutableDictionary*>(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<WebDouble*>(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<WebString*>(originList.at(i))->string());
+ }
+}
+
+void PlugInAutoStartProvider::didReceiveUserInteraction(unsigned plugInOriginHash)
+{
+ HashMap<unsigned, String>::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