diff options
Diffstat (limited to 'Source/WebCore/page/UserContentController.cpp')
| -rw-r--r-- | Source/WebCore/page/UserContentController.cpp | 104 |
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); } } |
