summaryrefslogtreecommitdiff
path: root/Source/WebCore/page/UserContentController.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/page/UserContentController.cpp')
-rw-r--r--Source/WebCore/page/UserContentController.cpp104
1 files changed, 98 insertions, 6 deletions
diff --git a/Source/WebCore/page/UserContentController.cpp b/Source/WebCore/page/UserContentController.cpp
index 95fa5fdfd..dfe8e38f4 100644
--- a/Source/WebCore/page/UserContentController.cpp
+++ b/Source/WebCore/page/UserContentController.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2014 Apple Inc. All rights reserved.
+ * Copyright (C) 2014-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -28,16 +28,30 @@
#include "DOMWrapperWorld.h"
#include "Document.h"
+#include "DocumentLoader.h"
+#include "ExtensionStyleSheets.h"
#include "MainFrame.h"
#include "Page.h"
+#include "ResourceLoadInfo.h"
#include "UserScript.h"
#include "UserStyleSheet.h"
+#include <runtime/JSCellInlines.h>
+#include <runtime/StructureInlines.h>
+
+#if ENABLE(USER_MESSAGE_HANDLERS)
+#include "UserMessageHandlerDescriptor.h"
+#endif
+
+#if ENABLE(CONTENT_EXTENSIONS)
+#include "ContentExtensionCompiler.h"
+#include "ContentExtensionsBackend.h"
+#endif
namespace WebCore {
-RefPtr<UserContentController> UserContentController::create()
+Ref<UserContentController> UserContentController::create()
{
- return adoptRef(new UserContentController);
+ return adoptRef(*new UserContentController);
}
UserContentController::UserContentController()
@@ -68,7 +82,7 @@ void UserContentController::addUserScript(DOMWrapperWorld& world, std::unique_pt
auto& scriptsInWorld = m_userScripts->add(&world, nullptr).iterator->value;
if (!scriptsInWorld)
scriptsInWorld = std::make_unique<UserScriptVector>();
- scriptsInWorld->append(std::move(userScript));
+ scriptsInWorld->append(WTFMove(userScript));
}
void UserContentController::removeUserScript(DOMWrapperWorld& world, const URL& url)
@@ -106,7 +120,7 @@ void UserContentController::addUserStyleSheet(DOMWrapperWorld& world, std::uniqu
auto& styleSheetsInWorld = m_userStyleSheets->add(&world, nullptr).iterator->value;
if (!styleSheetsInWorld)
styleSheetsInWorld = std::make_unique<UserStyleSheetVector>();
- styleSheetsInWorld->append(std::move(userStyleSheet));
+ styleSheetsInWorld->append(WTFMove(userStyleSheet));
if (injectionTime == InjectInExistingDocuments)
invalidateInjectedStyleSheetCacheInAllFrames();
@@ -151,6 +165,84 @@ void UserContentController::removeUserStyleSheets(DOMWrapperWorld& world)
invalidateInjectedStyleSheetCacheInAllFrames();
}
+#if ENABLE(USER_MESSAGE_HANDLERS)
+void UserContentController::addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)
+{
+ if (!m_userMessageHandlerDescriptors)
+ m_userMessageHandlerDescriptors = std::make_unique<UserMessageHandlerDescriptorMap>();
+
+ m_userMessageHandlerDescriptors->add(std::make_pair(descriptor.name(), &descriptor.world()), &descriptor);
+}
+
+void UserContentController::removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)
+{
+ if (!m_userMessageHandlerDescriptors)
+ return;
+
+ m_userMessageHandlerDescriptors->remove(std::make_pair(descriptor.name(), &descriptor.world()));
+}
+#endif
+
+#if ENABLE(CONTENT_EXTENSIONS)
+void UserContentController::addUserContentExtension(const String& name, RefPtr<ContentExtensions::CompiledContentExtension> contentExtension)
+{
+ if (!m_contentExtensionBackend)
+ m_contentExtensionBackend = std::make_unique<ContentExtensions::ContentExtensionsBackend>();
+
+ m_contentExtensionBackend->addContentExtension(name, contentExtension);
+}
+
+void UserContentController::removeUserContentExtension(const String& name)
+{
+ if (!m_contentExtensionBackend)
+ return;
+
+ m_contentExtensionBackend->removeContentExtension(name);
+}
+
+void UserContentController::removeAllUserContentExtensions()
+{
+ if (!m_contentExtensionBackend)
+ return;
+
+ m_contentExtensionBackend->removeAllContentExtensions();
+}
+
+static bool contentExtensionsEnabled(const DocumentLoader& documentLoader)
+{
+ if (auto frame = documentLoader.frame()) {
+ if (frame->isMainFrame())
+ return documentLoader.userContentExtensionsEnabled();
+ if (auto mainDocumentLoader = frame->mainFrame().loader().documentLoader())
+ return mainDocumentLoader->userContentExtensionsEnabled();
+ }
+
+ return true;
+}
+
+ContentExtensions::BlockedStatus UserContentController::processContentExtensionRulesForLoad(ResourceRequest& request, ResourceType resourceType, DocumentLoader& initiatingDocumentLoader)
+{
+ if (!m_contentExtensionBackend)
+ return ContentExtensions::BlockedStatus::NotBlocked;
+
+ if (!contentExtensionsEnabled(initiatingDocumentLoader))
+ return ContentExtensions::BlockedStatus::NotBlocked;
+
+ return m_contentExtensionBackend->processContentExtensionRulesForLoad(request, resourceType, initiatingDocumentLoader);
+}
+
+Vector<ContentExtensions::Action> UserContentController::actionsForResourceLoad(const ResourceLoadInfo& resourceLoadInfo, DocumentLoader& initiatingDocumentLoader)
+{
+ if (!m_contentExtensionBackend)
+ return Vector<ContentExtensions::Action>();
+
+ if (!contentExtensionsEnabled(initiatingDocumentLoader))
+ return Vector<ContentExtensions::Action>();
+
+ return m_contentExtensionBackend->actionsForResourceLoad(resourceLoadInfo);
+}
+#endif
+
void UserContentController::removeAllUserContent()
{
m_userScripts = nullptr;
@@ -165,7 +257,7 @@ void UserContentController::invalidateInjectedStyleSheetCacheInAllFrames()
{
for (auto& page : m_pages) {
for (Frame* frame = &page->mainFrame(); frame; frame = frame->tree().traverseNext()) {
- frame->document()->styleSheetCollection().invalidateInjectedStyleSheetCache();
+ frame->document()->extensionStyleSheets().invalidateInjectedStyleSheetCache();
frame->document()->styleResolverChanged(DeferRecalcStyle);
}
}