Changeset 199020 in webkit
- Timestamp:
- Apr 4, 2016 2:03:28 PM (8 years ago)
- Location:
- trunk
- Files:
-
- 30 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r199017 r199020 1 2016-04-03 Sam Weinig <sam@webkit.org> 2 3 Add SPI to allow install script message handlers in isolated worlds 4 https://bugs.webkit.org/show_bug.cgi?id=156153 5 6 Reviewed by Anders Carlsson. 7 8 Added API Test: WKUserContentController.ScriptMessageHandlerBasicPostIsolatedWorld 9 10 - Changes the signature of the method in UserContentProvider to get UserMessageHandlerDescriptors 11 to match that of UserScripts and UserStyleSheets. 12 - Removes the need for UserMessageHandlerDescriptor::Client by making UserMessageHandlerDescriptor 13 directly subclassable. 14 - Changes invalidation model of UserMessageHandlersNamespace to be more direct by allowing it to 15 register for invalidation notifications, rather than always checking if handler has been removed 16 on each invocation. 17 18 * loader/EmptyClients.cpp: 19 Update for new signature. 20 21 * page/DOMWindow.cpp: 22 (WebCore::DOMWindow::shouldHaveWebKitNamespaceForWorld): 23 Switch to using forEachUserMessageHandler. 24 25 (WebCore::DOMWindow::webkitNamespace): 26 Pass the UserContentProvider to the namespace on creation, so the UserMessageHandlersNamespace 27 can use it to register to listen for UserMessageHandler changes. 28 29 * page/UserContentController.h: 30 * page/UserContentController.cpp: 31 (WebCore::UserContentController::forEachUserStyleSheet): 32 (WebCore::UserContentController::forEachUserMessageHandler): 33 (WebCore::UserContentController::addUserScript): 34 (WebCore::UserContentController::removeUserStyleSheets): 35 (WebCore::UserContentController::removeAllUserContent): 36 (WebCore::UserContentController::addUserMessageHandlerDescriptor): Deleted. 37 (WebCore::UserContentController::removeUserMessageHandlerDescriptor): Deleted. 38 (WebCore::UserContentController::addUserContentExtension): Deleted. 39 (WebCore::UserContentController::removeUserContentExtension): Deleted. 40 (WebCore::UserContentController::removeAllUserContentExtensions): Deleted. 41 Removed unused functions, all the UserMessageHandler and UserContentExtension ones. UserContentController 42 is only used for Legacy WebKit where those features are not exposed. 43 44 * page/UserContentProvider.h: 45 * page/UserContentProvider.cpp: 46 (WebCore::UserContentProvider::registerForUserMessageHandlerInvalidation): 47 (WebCore::UserContentProvider::unregisterForUserMessageHandlerInvalidation): 48 (WebCore::UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients): 49 (WebCore::UserContentProviderInvalidationClient::~UserContentProviderInvalidationClient): 50 Update signature for UserMessageHandlerDescriptor access to match UserScript and UserStyleSheet. 51 Adds explicit invalidation for UserMessageHandlers. 52 53 * page/UserMessageHandler.cpp: 54 (WebCore::UserMessageHandler::UserMessageHandler): 55 (WebCore::UserMessageHandler::postMessage): 56 (WebCore::UserMessageHandler::name): Deleted. 57 (WebCore::UserMessageHandler::world): Deleted. 58 * page/UserMessageHandler.h: 59 (WebCore::UserMessageHandler::descriptor): 60 (WebCore::UserMessageHandler::invalidateDescriptor): 61 * page/UserMessageHandlerDescriptor.cpp: 62 (WebCore::UserMessageHandlerDescriptor::UserMessageHandlerDescriptor): 63 (WebCore::UserMessageHandlerDescriptor::~UserMessageHandlerDescriptor): 64 (WebCore::UserMessageHandlerDescriptor::name): 65 (WebCore::UserMessageHandlerDescriptor::world): 66 * page/UserMessageHandlerDescriptor.h: 67 (WebCore::UserMessageHandlerDescriptor::Client::~Client): Deleted. 68 (WebCore::UserMessageHandlerDescriptor::create): Deleted. 69 (WebCore::UserMessageHandlerDescriptor::client): Deleted. 70 (WebCore::UserMessageHandlerDescriptor::invalidateClient): Deleted. 71 Simplify by removing the Client. Now, when the UserMessageHandlerDescriptor is no longer 72 active, it gets nulled out in the UserMessageHandler. 73 74 * page/UserMessageHandlersNamespace.cpp: 75 (WebCore::UserMessageHandlersNamespace::UserMessageHandlersNamespace): 76 (WebCore::UserMessageHandlersNamespace::~UserMessageHandlersNamespace): 77 (WebCore::UserMessageHandlersNamespace::didInvalidate): 78 (WebCore::UserMessageHandlersNamespace::handler): 79 * page/UserMessageHandlersNamespace.h: 80 Change the logic to listen for invalidations of the UserMessageHandlerDescriptor map. When it 81 is invalidated, re-build the map of cached UserMessageHandlers from the UserContentProvider, 82 and invalidate any remaining UserMessageHandlers that no longer exist in the UserContentProvider. 83 84 * page/WebKitNamespace.cpp: 85 (WebCore::WebKitNamespace::WebKitNamespace): 86 * page/WebKitNamespace.h: 87 (WebCore::WebKitNamespace::create): 88 Pass through the UserContentProvider. 89 1 90 2016-04-04 Chris Dumez <cdumez@apple.com> 2 91 -
trunk/Source/WebCore/loader/EmptyClients.cpp
r198389 r199020 102 102 void forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>&) const override { } 103 103 #if ENABLE(USER_MESSAGE_HANDLERS) 104 const UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const override { static NeverDestroyed<UserMessageHandlerDescriptorMap> map; return map.get();}104 void forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const override { } 105 105 #endif 106 106 #if ENABLE(CONTENT_EXTENSIONS) -
trunk/Source/WebCore/page/DOMWindow.cpp
r198180 r199020 762 762 return false; 763 763 764 for (auto& descriptor : page->userContentProvider().userMessageHandlerDescriptors().values()) { 765 if (&descriptor->world() == &world) 766 return true; 767 } 768 769 return false; 764 bool hasUserMessageHandler = false; 765 page->userContentProvider().forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) { 766 if (&descriptor.world() == &world) { 767 hasUserMessageHandler = true; 768 return; 769 } 770 }); 771 772 return hasUserMessageHandler; 770 773 } 771 774 … … 773 776 { 774 777 if (!isCurrentlyDisplayedInFrame()) 778 return nullptr; 779 auto* page = m_frame->page(); 780 if (!page) 775 781 return nullptr; 776 782 if (!m_webkitNamespace) 777 m_webkitNamespace = WebKitNamespace::create(*m_frame );783 m_webkitNamespace = WebKitNamespace::create(*m_frame, page->userContentProvider()); 778 784 return m_webkitNamespace.get(); 779 785 } -
trunk/Source/WebCore/page/UserContentController.cpp
r198183 r199020 32 32 #include <runtime/JSCellInlines.h> 33 33 #include <runtime/StructureInlines.h> 34 35 #if ENABLE(USER_MESSAGE_HANDLERS)36 #include "UserMessageHandlerDescriptor.h"37 #endif38 34 39 35 #if ENABLE(CONTENT_EXTENSIONS) … … 72 68 } 73 69 } 70 71 #if ENABLE(USER_MESSAGE_HANDLERS) 72 void UserContentController::forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const 73 { 74 } 75 #endif 74 76 75 77 void UserContentController::addUserScript(DOMWrapperWorld& world, std::unique_ptr<UserScript> userScript) … … 142 144 } 143 145 144 #if ENABLE(USER_MESSAGE_HANDLERS)145 void UserContentController::addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)146 {147 m_userMessageHandlerDescriptors.add(std::make_pair(descriptor.name(), &descriptor.world()), &descriptor);148 }149 150 void UserContentController::removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor& descriptor)151 {152 m_userMessageHandlerDescriptors.remove(std::make_pair(descriptor.name(), &descriptor.world()));153 }154 #endif155 156 #if ENABLE(CONTENT_EXTENSIONS)157 void UserContentController::addUserContentExtension(const String& name, RefPtr<ContentExtensions::CompiledContentExtension> contentExtension)158 {159 m_contentExtensionBackend.addContentExtension(name, contentExtension);160 }161 162 void UserContentController::removeUserContentExtension(const String& name)163 {164 m_contentExtensionBackend.removeContentExtension(name);165 }166 167 void UserContentController::removeAllUserContentExtensions()168 {169 m_contentExtensionBackend.removeAllContentExtensions();170 }171 #endif172 173 146 void UserContentController::removeAllUserContent() 174 147 { -
trunk/Source/WebCore/page/UserContentController.h
r198180 r199020 46 46 WEBCORE_EXPORT void removeAllUserContent(); 47 47 48 #if ENABLE(USER_MESSAGE_HANDLERS)49 WEBCORE_EXPORT void addUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&);50 WEBCORE_EXPORT void removeUserMessageHandlerDescriptor(UserMessageHandlerDescriptor&);51 #endif52 53 #if ENABLE(CONTENT_EXTENSIONS)54 WEBCORE_EXPORT void addUserContentExtension(const String& name, RefPtr<ContentExtensions::CompiledContentExtension>);55 WEBCORE_EXPORT void removeUserContentExtension(const String& name);56 WEBCORE_EXPORT void removeAllUserContentExtensions();57 #endif58 59 48 private: 60 49 UserContentController(); … … 64 53 void forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>&) const override; 65 54 #if ENABLE(USER_MESSAGE_HANDLERS) 66 const UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptors; }55 void forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const override; 67 56 #endif 68 57 #if ENABLE(CONTENT_EXTENSIONS) … … 72 61 UserScriptMap m_userScripts; 73 62 UserStyleSheetMap m_userStyleSheets; 74 #if ENABLE(USER_MESSAGE_HANDLERS)75 UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptors;76 #endif77 63 #if ENABLE(CONTENT_EXTENSIONS) 78 64 ContentExtensions::ContentExtensionsBackend m_contentExtensionBackend; -
trunk/Source/WebCore/page/UserContentProvider.cpp
r198180 r199020 62 62 } 63 63 64 void UserContentProvider::registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient& invalidationClient) 65 { 66 ASSERT(!m_userMessageHandlerInvalidationClients.contains(&invalidationClient)); 67 68 m_userMessageHandlerInvalidationClients.add(&invalidationClient); 69 } 70 71 void UserContentProvider::unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient& invalidationClient) 72 { 73 ASSERT(m_userMessageHandlerInvalidationClients.contains(&invalidationClient)); 74 75 m_userMessageHandlerInvalidationClients.remove(&invalidationClient); 76 } 77 78 void UserContentProvider::invalidateAllRegisteredUserMessageHandlerInvalidationClients() 79 { 80 for (auto& client : m_userMessageHandlerInvalidationClients) 81 client->didInvalidate(*this); 82 } 83 64 84 void UserContentProvider::invalidateInjectedStyleSheetCacheInAllFramesInAllPages() 65 85 { -
trunk/Source/WebCore/page/UserContentProvider.h
r198180 r199020 59 59 } 60 60 61 class UserContentProvider; 62 63 class UserContentProviderInvalidationClient { 64 public: 65 virtual ~UserContentProviderInvalidationClient() 66 { 67 } 68 69 virtual void didInvalidate(UserContentProvider&) = 0; 70 }; 71 61 72 class UserContentProvider : public RefCounted<UserContentProvider> { 62 73 public: … … 66 77 virtual void forEachUserScript(const std::function<void(DOMWrapperWorld&, const UserScript&)>&) const = 0; 67 78 virtual void forEachUserStyleSheet(const std::function<void(const UserStyleSheet&)>&) const = 0; 68 69 79 #if ENABLE(USER_MESSAGE_HANDLERS) 70 virtual const UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const = 0;80 virtual void forEachUserMessageHandler(const std::function<void(const UserMessageHandlerDescriptor&)>&) const = 0; 71 81 #endif 72 73 82 #if ENABLE(CONTENT_EXTENSIONS) 74 83 virtual ContentExtensions::ContentExtensionsBackend& userContentExtensionBackend() = 0; 75 84 #endif 76 85 86 void registerForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&); 87 void unregisterForUserMessageHandlerInvalidation(UserContentProviderInvalidationClient&); 88 77 89 void addPage(Page&); 78 90 void removePage(Page&); 79 80 91 81 92 #if ENABLE(CONTENT_EXTENSIONS) … … 87 98 88 99 protected: 100 WEBCORE_EXPORT void invalidateAllRegisteredUserMessageHandlerInvalidationClients(); 89 101 WEBCORE_EXPORT void invalidateInjectedStyleSheetCacheInAllFramesInAllPages(); 90 102 91 103 private: 92 104 HashSet<Page*> m_pages; 105 HashSet<UserContentProviderInvalidationClient*> m_userMessageHandlerInvalidationClients; 93 106 }; 94 107 -
trunk/Source/WebCore/page/UserMessageHandler.cpp
r184846 r199020 37 37 UserMessageHandler::UserMessageHandler(Frame& frame, UserMessageHandlerDescriptor& descriptor) 38 38 : FrameDestructionObserver(&frame) 39 , m_descriptor( descriptor)39 , m_descriptor(&descriptor) 40 40 { 41 41 } … … 49 49 // Check to see if the descriptor has been removed. This can happen if the host application has 50 50 // removed the named message handler at the WebKit2 API level. 51 if (!m_descriptor ->client()) {51 if (!m_descriptor) { 52 52 ec = INVALID_ACCESS_ERR; 53 53 return; 54 54 } 55 55 56 m_descriptor->client()->didPostMessage(*this, value.get()); 57 } 58 59 const AtomicString& UserMessageHandler::name() 60 { 61 return m_descriptor->name(); 62 } 63 64 DOMWrapperWorld& UserMessageHandler::world() 65 { 66 return m_descriptor->world(); 56 m_descriptor->didPostMessage(*this, value.get()); 67 57 } 68 58 -
trunk/Source/WebCore/page/UserMessageHandler.h
r197868 r199020 31 31 #include "FrameDestructionObserver.h" 32 32 #include "UserMessageHandlerDescriptor.h" 33 #include <bindings/ScriptValue.h>34 33 35 34 namespace WebCore { … … 47 46 void postMessage(PassRefPtr<SerializedScriptValue>, ExceptionCode&); 48 47 49 const AtomicString& name(); 50 DOMWrapperWorld& world(); 51 const UserMessageHandlerDescriptor& descriptor() const { return m_descriptor.get(); } 48 UserMessageHandlerDescriptor* descriptor() { return m_descriptor.get(); } 49 void invalidateDescriptor() { m_descriptor = nullptr; } 52 50 53 51 private: 54 52 UserMessageHandler(Frame&, UserMessageHandlerDescriptor&); 55 53 56 Ref <UserMessageHandlerDescriptor> m_descriptor;54 RefPtr<UserMessageHandlerDescriptor> m_descriptor; 57 55 }; 58 56 -
trunk/Source/WebCore/page/UserMessageHandlerDescriptor.cpp
r184846 r199020 33 33 namespace WebCore { 34 34 35 UserMessageHandlerDescriptor::UserMessageHandlerDescriptor(const AtomicString& name, DOMWrapperWorld& world , Client& client)35 UserMessageHandlerDescriptor::UserMessageHandlerDescriptor(const AtomicString& name, DOMWrapperWorld& world) 36 36 : m_name(name) 37 37 , m_world(world) 38 , m_client(&client)39 38 { 40 39 } … … 44 43 } 45 44 46 const AtomicString& UserMessageHandlerDescriptor::name() 45 const AtomicString& UserMessageHandlerDescriptor::name() const 47 46 { 48 47 return m_name; … … 54 53 } 55 54 55 const DOMWrapperWorld& UserMessageHandlerDescriptor::world() const 56 { 57 return m_world.get(); 58 } 59 56 60 } // namespace WebCore 57 61 -
trunk/Source/WebCore/page/UserMessageHandlerDescriptor.h
r198180 r199020 29 29 #if ENABLE(USER_MESSAGE_HANDLERS) 30 30 31 #include <wtf/ PassRefPtr.h>31 #include <wtf/Ref.h> 32 32 #include <wtf/RefCounted.h> 33 #include <wtf/RefPtr.h>34 33 #include <wtf/text/AtomicString.h> 35 34 36 35 namespace WebCore { 37 36 38 class Frame;39 37 class DOMWrapperWorld; 38 class SerializedScriptValue; 40 39 class UserMessageHandler; 41 class SerializedScriptValue;42 40 43 41 class UserMessageHandlerDescriptor : public RefCounted<UserMessageHandlerDescriptor> { 44 42 public: 45 class Client { 46 public: 47 virtual ~Client() { } 48 virtual void didPostMessage(UserMessageHandler&, SerializedScriptValue*) = 0; 49 }; 43 WEBCORE_EXPORT explicit UserMessageHandlerDescriptor(const AtomicString&, DOMWrapperWorld&); 44 WEBCORE_EXPORT virtual ~UserMessageHandlerDescriptor(); 50 45 51 static Ref<UserMessageHandlerDescriptor> create(const AtomicString& name, DOMWrapperWorld& world, Client& client) 52 { 53 return adoptRef(*new UserMessageHandlerDescriptor(name, world, client)); 54 } 55 WEBCORE_EXPORT ~UserMessageHandlerDescriptor(); 46 WEBCORE_EXPORT const AtomicString& name() const; 47 WEBCORE_EXPORT DOMWrapperWorld& world(); 48 WEBCORE_EXPORT const DOMWrapperWorld& world() const; 56 49 57 WEBCORE_EXPORT const AtomicString& name(); 58 WEBCORE_EXPORT DOMWrapperWorld& world(); 59 60 Client* client() const { return m_client; } 61 void invalidateClient() { m_client = nullptr; } 50 virtual void didPostMessage(UserMessageHandler&, SerializedScriptValue*) = 0; 62 51 63 52 private: 64 WEBCORE_EXPORT explicit UserMessageHandlerDescriptor(const AtomicString&, DOMWrapperWorld&, Client&);65 66 53 AtomicString m_name; 67 54 Ref<DOMWrapperWorld> m_world; 68 Client* m_client;69 55 }; 70 56 -
trunk/Source/WebCore/page/UserMessageHandlersNamespace.cpp
r198180 r199020 33 33 #include "Page.h" 34 34 #include "UserContentController.h" 35 #include "UserMessageHandler.h" 35 36 36 37 namespace WebCore { 37 38 38 UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame& frame )39 UserMessageHandlersNamespace::UserMessageHandlersNamespace(Frame& frame, UserContentProvider& userContentProvider) 39 40 : FrameDestructionObserver(&frame) 41 , m_userContentProvider(userContentProvider) 40 42 { 43 m_userContentProvider->registerForUserMessageHandlerInvalidation(*this); 41 44 } 42 45 43 46 UserMessageHandlersNamespace::~UserMessageHandlersNamespace() 44 47 { 48 m_userContentProvider->unregisterForUserMessageHandlerInvalidation(*this); 49 } 50 51 void UserMessageHandlersNamespace::didInvalidate(UserContentProvider& provider) 52 { 53 auto oldMap = WTFMove(m_messageHandlers); 54 55 provider.forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) { 56 auto userMessageHandler = oldMap.take(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world()))); 57 if (userMessageHandler) { 58 m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())), userMessageHandler); 59 return; 60 } 61 }); 62 63 for (auto& userMessageHandler : oldMap.values()) 64 userMessageHandler->invalidateDescriptor(); 45 65 } 46 66 47 67 UserMessageHandler* UserMessageHandlersNamespace::handler(const AtomicString& name, DOMWrapperWorld& world) 48 68 { 49 if (!frame()) 69 Frame* frame = this->frame(); 70 if (!frame) 50 71 return nullptr; 51 72 52 Page* page = frame ()->page();73 Page* page = frame->page(); 53 74 if (!page) 54 75 return nullptr; 55 56 auto& descriptors = page->userContentProvider().userMessageHandlerDescriptors();57 58 RefPtr<UserMessageHandlerDescriptor> descriptor = descriptors.get(std::make_pair(name, &world));59 if (!descriptor)60 return nullptr;61 76 62 for (auto& handler : m_messageHandlers) { 63 if (&handler->descriptor() == descriptor.get()) 64 return &handler.get(); 65 } 77 UserMessageHandler* handler = m_messageHandlers.get(std::pair<AtomicString, RefPtr<DOMWrapperWorld>>(name, &world)); 78 if (handler) 79 return handler; 66 80 67 auto liveHandlers = descriptors.values(); 68 m_messageHandlers.removeAllMatching([liveHandlers](const Ref<UserMessageHandler>& handler) { 69 for (const auto& liveHandler : liveHandlers) { 70 if (liveHandler.get() == &handler->descriptor()) 71 return true; 72 } 73 return false; 81 page->userContentProvider().forEachUserMessageHandler([&](const UserMessageHandlerDescriptor& descriptor) { 82 if (descriptor.name() != name || &descriptor.world() != &world) 83 return; 84 85 ASSERT(!handler); 86 87 auto addResult = m_messageHandlers.add(std::make_pair(descriptor.name(), const_cast<DOMWrapperWorld*>(&descriptor.world())), UserMessageHandler::create(*frame, const_cast<UserMessageHandlerDescriptor&>(descriptor))); 88 handler = addResult.iterator->value.get(); 74 89 }); 75 90 76 m_messageHandlers.append(UserMessageHandler::create(*frame(), *descriptor)); 77 return &m_messageHandlers.last().get(); 91 return handler; 78 92 } 79 93 -
trunk/Source/WebCore/page/UserMessageHandlersNamespace.h
r184066 r199020 30 30 31 31 #include "FrameDestructionObserver.h" 32 #include "UserContentProvider.h" 32 33 #include "UserMessageHandler.h" 34 #include <wtf/HashMap.h> 33 35 #include <wtf/RefCounted.h> 34 36 #include <wtf/RefPtr.h> 35 #include <wtf/Vector.h>36 37 #include <wtf/text/AtomicString.h> 38 #include <wtf/text/AtomicStringHash.h> 37 39 38 40 namespace WebCore { … … 42 44 class DOMWrapperWorld; 43 45 44 class UserMessageHandlersNamespace : public RefCounted<UserMessageHandlersNamespace>, public FrameDestructionObserver {46 class UserMessageHandlersNamespace : public RefCounted<UserMessageHandlersNamespace>, public FrameDestructionObserver, public UserContentProviderInvalidationClient { 45 47 public: 46 static Ref<UserMessageHandlersNamespace> create(Frame& frame )48 static Ref<UserMessageHandlersNamespace> create(Frame& frame, UserContentProvider& userContentProvider) 47 49 { 48 return adoptRef(*new UserMessageHandlersNamespace(frame ));50 return adoptRef(*new UserMessageHandlersNamespace(frame, userContentProvider)); 49 51 } 50 52 … … 54 56 55 57 private: 56 explicit UserMessageHandlersNamespace(Frame& );58 explicit UserMessageHandlersNamespace(Frame&, UserContentProvider&); 57 59 58 Vector<Ref<UserMessageHandler>> m_messageHandlers; 60 // UserContentProviderInvalidationClient 61 void didInvalidate(UserContentProvider&) override; 62 63 Ref<UserContentProvider> m_userContentProvider; 64 HashMap<std::pair<AtomicString, RefPtr<DOMWrapperWorld>>, RefPtr<UserMessageHandler>> m_messageHandlers; 59 65 }; 60 66 -
trunk/Source/WebCore/page/WebKitNamespace.cpp
r169023 r199020 34 34 namespace WebCore { 35 35 36 WebKitNamespace::WebKitNamespace(Frame& frame )36 WebKitNamespace::WebKitNamespace(Frame& frame, UserContentProvider& userContentProvider) 37 37 : DOMWindowProperty(&frame) 38 , m_messageHandlerNamespace(UserMessageHandlersNamespace::create(frame ))38 , m_messageHandlerNamespace(UserMessageHandlersNamespace::create(frame, userContentProvider)) 39 39 { 40 40 } -
trunk/Source/WebCore/page/WebKitNamespace.h
r184066 r199020 36 36 37 37 class Frame; 38 class UserContentProvider; 38 39 class UserMessageHandlersNamespace; 39 40 40 41 class WebKitNamespace : public DOMWindowProperty, public RefCounted<WebKitNamespace> { 41 42 public: 42 static Ref<WebKitNamespace> create(Frame& frame )43 static Ref<WebKitNamespace> create(Frame& frame, UserContentProvider& userContentProvider) 43 44 { 44 return adoptRef(*new WebKitNamespace(frame ));45 return adoptRef(*new WebKitNamespace(frame, userContentProvider)); 45 46 } 46 47 … … 50 51 51 52 private: 52 explicit WebKitNamespace(Frame& );53 explicit WebKitNamespace(Frame&, UserContentProvider&); 53 54 54 55 Ref<UserMessageHandlersNamespace> m_messageHandlerNamespace; -
trunk/Source/WebKit2/ChangeLog
r199011 r199020 1 2016-04-03 Sam Weinig <sam@webkit.org> 2 3 Add SPI to allow install script message handlers in isolated worlds 4 https://bugs.webkit.org/show_bug.cgi?id=156153 5 6 Reviewed by Anders Carlsson. 7 8 * Scripts/webkit/messages.py: 9 (headers_for_type): 10 * Shared/WebUserContentControllerDataTypes.cpp: 11 (WebKit::WebScriptMessageHandlerData::encode): 12 (WebKit::WebScriptMessageHandlerData::decode): 13 * Shared/WebUserContentControllerDataTypes.h: 14 Add WebKit::WebScriptMessageHandlerData, matching WebKit::WebUserScriptData and 15 WebKit::WebUserStyleSheetData. 16 17 * UIProcess/API/Cocoa/WKUserContentController.mm: 18 (-[WKUserContentController addScriptMessageHandler:name:]): 19 (-[WKUserContentController removeScriptMessageHandlerForName:]): 20 (-[WKUserContentController _removeAllUserStyleSheetsAssociatedWithUserContentWorld:]): 21 (-[WKUserContentController _addScriptMessageHandler:name:userContentWorld:]): 22 (-[WKUserContentController _removeScriptMessageHandlerForName:userContentWorld:]): 23 (-[WKUserContentController _removeAllScriptMessageHandlersAssociatedWithUserContentWorld:]): 24 * UIProcess/API/Cocoa/WKUserContentControllerPrivate.h: 25 Add SPI for adding and removing ScriptMessageHandlers associated with a world. 26 27 * UIProcess/UserContent/WebScriptMessageHandler.cpp: 28 (WebKit::WebScriptMessageHandler::create): 29 (WebKit::WebScriptMessageHandler::WebScriptMessageHandler): 30 (WebKit::WebScriptMessageHandlerHandle::encode): Deleted. 31 (WebKit::WebScriptMessageHandlerHandle::decode): Deleted. 32 * UIProcess/UserContent/WebScriptMessageHandler.h: 33 (WebKit::WebScriptMessageHandler::identifier): 34 (WebKit::WebScriptMessageHandler::name): 35 (WebKit::WebScriptMessageHandler::userContentWorld): 36 (WebKit::WebScriptMessageHandler::client): 37 (WebKit::WebScriptMessageHandler::handle): Deleted. 38 Add the world and move the data object to WebUserContentControllerDataTypes.h 39 40 * UIProcess/UserContent/WebUserContentControllerProxy.cpp: 41 (WebKit::WebUserContentControllerProxy::addProcess): 42 (WebKit::WebUserContentControllerProxy::addUserScriptMessageHandler): 43 (WebKit::WebUserContentControllerProxy::removeUserMessageHandlerForName): 44 (WebKit::WebUserContentControllerProxy::removeAllUserMessageHandlers): 45 * UIProcess/UserContent/WebUserContentControllerProxy.h: 46 Update for worlds, matching UserScript/UserStyleSheet model. 47 48 * WebProcess/UserContent/WebUserContentController.h: 49 * WebProcess/UserContent/WebUserContentController.cpp: 50 (WebKit::WebUserMessageHandlerDescriptorProxy::WebUserMessageHandlerDescriptorProxy): 51 Change to inherit directly from WebCore::UserMessageHandlerDescriptor. 52 53 (WebKit::WebUserContentController::addUserScriptMessageHandlers): 54 (WebKit::WebUserContentController::removeUserScriptMessageHandler): 55 (WebKit::WebUserContentController::removeAllUserScriptMessageHandlers): 56 (WebKit::WebUserContentController::addUserScriptMessageHandlerInternal): 57 (WebKit::WebUserContentController::removeUserScriptMessageHandlerInternal): 58 Add support for worlds, matching UserScript/UserStyleSheet model. 59 60 (WebKit::WebUserContentController::addUserStyleSheets): 61 Add missing call to invalidateInjectedStyleSheetCacheInAllFramesInAllPages() 62 63 (WebKit::WebUserContentController::removeAllUserStyleSheets): 64 Switch to only calling invalidateInjectedStyleSheetCacheInAllFramesInAllPages() once 65 after the loop and only if any stylesheets were removed. 66 67 (WebKit::WebUserContentController::addUserStyleSheetInternal): 68 Remove call to invalidateInjectedStyleSheetCacheInAllFramesInAllPages(), make 69 callers call it. This allows us to avoid calling it repeatedly in removeAllUserStyleSheets(). 70 71 (WebKit::WebUserContentController::addUserStyleSheet): 72 Call invalidateInjectedStyleSheetCacheInAllFramesInAllPages() explicitly since it 73 is no longer called in addUserStyleSheetInternal(). 74 75 (WebKit::WebUserContentController::forEachUserMessageHandler): 76 Implement by iterating the m_userMessageHandlers map. 77 78 * WebProcess/UserContent/WebUserContentController.messages.in: 79 Update for worlds, matching UserScript/UserStyleSheet model. 80 1 81 2016-04-04 Joonghun Park <jh718.park@samsung.com> 2 82 -
trunk/Source/WebKit2/Scripts/webkit/messages.py
r198180 r199020 378 378 'WebKit::WebTouchEvent': ['"WebEvent.h"'], 379 379 'WebKit::WebWheelEvent': ['"WebEvent.h"'], 380 'WebKit::WebScriptMessageHandlerHandle': ['"WebScriptMessageHandler.h"'],381 380 'struct WebKit::WebUserScriptData': ['"WebUserContentControllerDataTypes.h"'], 382 381 'struct WebKit::WebUserStyleSheetData': ['"WebUserContentControllerDataTypes.h"'], 382 'struct WebKit::WebScriptMessageHandlerData': ['"WebUserContentControllerDataTypes.h"'], 383 383 'std::chrono::system_clock::time_point': ['<chrono>'], 384 384 } -
trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.cpp
r198180 r199020 67 67 } 68 68 69 70 void WebScriptMessageHandlerData::encode(IPC::ArgumentEncoder& encoder) const 71 { 72 encoder << identifier; 73 encoder << worldIdentifier; 74 encoder << name; 75 } 76 77 bool WebScriptMessageHandlerData::decode(IPC::ArgumentDecoder& decoder, WebScriptMessageHandlerData& data) 78 { 79 if (!decoder.decode(data.identifier)) 80 return false; 81 if (!decoder.decode(data.worldIdentifier)) 82 return false; 83 if (!decoder.decode(data.name)) 84 return false; 85 86 return true; 87 } 88 69 89 } // namespace WebKit -
trunk/Source/WebKit2/Shared/WebUserContentControllerDataTypes.h
r198180 r199020 55 55 }; 56 56 57 struct WebScriptMessageHandlerData { 58 void encode(IPC::ArgumentEncoder&) const; 59 static bool decode(IPC::ArgumentDecoder&, WebScriptMessageHandlerData&); 60 61 uint64_t identifier; 62 uint64_t worldIdentifier; 63 String name; 64 }; 65 57 66 } // namespace WebKit 58 67 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm
r197302 r199020 30 30 31 31 #import "APISerializedScriptValue.h" 32 #import "APIUserContentWorld.h" 32 33 #import "WKFrameInfoInternal.h" 33 34 #import "WKNSArray.h" … … 119 120 - (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name 120 121 { 121 RefPtr<WebKit::WebScriptMessageHandler> handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name);122 auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name, API::UserContentWorld::normalWorld()); 122 123 if (!_userContentControllerProxy->addUserScriptMessageHandler(handler.get())) 123 124 [NSException raise:NSInvalidArgumentException format:@"Attempt to add script message handler with name '%@' when one already exists.", name]; … … 126 127 - (void)removeScriptMessageHandlerForName:(NSString *)name 127 128 { 128 _userContentControllerProxy->removeUserMessageHandlerForName(name );129 _userContentControllerProxy->removeUserMessageHandlerForName(name, API::UserContentWorld::normalWorld()); 129 130 } 130 131 … … 196 197 } 197 198 199 - (void)_addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld 200 { 201 auto handler = WebKit::WebScriptMessageHandler::create(std::make_unique<ScriptMessageHandlerDelegate>(self, scriptMessageHandler, name), name, *userContentWorld->_userContentWorld); 202 if (!_userContentControllerProxy->addUserScriptMessageHandler(handler.get())) 203 [NSException raise:NSInvalidArgumentException format:@"Attempt to add script message handler with name '%@' when one already exists.", name]; 204 } 205 206 - (void)_removeScriptMessageHandlerForName:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld 207 { 208 _userContentControllerProxy->removeUserMessageHandlerForName(name, *userContentWorld->_userContentWorld); 209 } 210 211 - (void)_removeAllScriptMessageHandlersAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld 212 { 213 _userContentControllerProxy->removeAllUserMessageHandlers(*userContentWorld->_userContentWorld); 214 } 215 198 216 @end 199 217 -
trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentControllerPrivate.h
r197302 r199020 48 48 - (void)_removeAllUserStyleSheetsAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld WK_AVAILABLE(WK_MAC_TBA, WK_IOS_TBA); 49 49 50 - (void)_addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld; 51 - (void)_removeScriptMessageHandlerForName:(NSString *)name userContentWorld:(_WKUserContentWorld *)userContentWorld; 52 - (void)_removeAllScriptMessageHandlersAssociatedWithUserContentWorld:(_WKUserContentWorld *)userContentWorld; 53 50 54 @end 51 55 -
trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.cpp
r194496 r199020 27 27 #include "WebScriptMessageHandler.h" 28 28 29 #include "A rgumentCoders.h"29 #include "APIUserContentWorld.h" 30 30 31 31 namespace WebKit { 32 33 void WebScriptMessageHandlerHandle::encode(IPC::ArgumentEncoder& encoder) const34 {35 encoder << identifier;36 encoder << name;37 }38 39 bool WebScriptMessageHandlerHandle::decode(IPC::ArgumentDecoder& decoder, WebScriptMessageHandlerHandle& handle)40 {41 if (!decoder.decode(handle.identifier))42 return false;43 44 if (!decoder.decode(handle.name))45 return false;46 47 return true;48 }49 32 50 33 static uint64_t generateIdentifier() … … 55 38 } 56 39 57 PassRefPtr<WebScriptMessageHandler> WebScriptMessageHandler::create(std::unique_ptr<Client> client, const String& name)40 Ref<WebScriptMessageHandler> WebScriptMessageHandler::create(std::unique_ptr<Client> client, const String& name, API::UserContentWorld& world) 58 41 { 59 return adoptRef( new WebScriptMessageHandler(WTFMove(client), name));42 return adoptRef(*new WebScriptMessageHandler(WTFMove(client), name, world)); 60 43 } 61 44 62 WebScriptMessageHandler::WebScriptMessageHandler(std::unique_ptr<Client> client, const String& name )45 WebScriptMessageHandler::WebScriptMessageHandler(std::unique_ptr<Client> client, const String& name, API::UserContentWorld& world) 63 46 : m_identifier(generateIdentifier()) 64 47 , m_client(WTFMove(client)) 65 48 , m_name(name) 49 , m_world(world) 66 50 { 67 51 } -
trunk/Source/WebKit2/UIProcess/UserContent/WebScriptMessageHandler.h
r189313 r199020 27 27 #define WebScriptMessageHandler_h 28 28 29 #include <wtf/PassRefPtr.h> 29 #include "WebUserContentControllerDataTypes.h" 30 #include <wtf/Ref.h> 30 31 #include <wtf/RefCounted.h> 31 32 #include <wtf/text/WTFString.h> 32 33 namespace IPC {34 class ArgumentDecoder;35 class ArgumentEncoder;36 }37 33 38 34 namespace WebCore { … … 41 37 } 42 38 39 namespace API { 40 class UserContentWorld; 41 } 42 43 43 namespace WebKit { 44 44 45 45 class WebPageProxy; 46 46 class WebFrameProxy; 47 48 struct WebScriptMessageHandlerHandle {49 void encode(IPC::ArgumentEncoder&) const;50 static bool decode(IPC::ArgumentDecoder&, WebScriptMessageHandlerHandle&);51 52 uint64_t identifier;53 String name;54 };55 47 56 48 class WebScriptMessageHandler : public RefCounted<WebScriptMessageHandler> { … … 62 54 }; 63 55 64 static PassRefPtr<WebScriptMessageHandler> create(std::unique_ptr<Client>, const String& name);56 static Ref<WebScriptMessageHandler> create(std::unique_ptr<Client>, const String& name, API::UserContentWorld&); 65 57 virtual ~WebScriptMessageHandler(); 66 67 WebScriptMessageHandlerHandle handle() { return { m_identifier, m_name }; }68 58 69 59 uint64_t identifier() const { return m_identifier; } 70 60 String name() const { return m_name; } 71 61 62 const API::UserContentWorld& userContentWorld() const { return m_world; } 63 API::UserContentWorld& userContentWorld() { return m_world; } 64 72 65 Client& client() const { return *m_client; } 73 66 74 67 private: 75 WebScriptMessageHandler(std::unique_ptr<Client>, const String& );68 WebScriptMessageHandler(std::unique_ptr<Client>, const String&, API::UserContentWorld&); 76 69 77 70 uint64_t m_identifier; … … 79 72 std::unique_ptr<Client> m_client; 80 73 String m_name; 74 Ref<API::UserContentWorld> m_world; 81 75 }; 82 76 -
trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.cpp
r198180 r199020 92 92 webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserStyleSheets(userStyleSheets), m_identifier); 93 93 94 Vector<WebScriptMessageHandler Handle> messageHandlerHandles;94 Vector<WebScriptMessageHandlerData> messageHandlers; 95 95 for (auto& handler : m_scriptMessageHandlers.values()) 96 messageHandler Handles.append(handler->handle());97 webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandler Handles), m_identifier);96 messageHandlers.append({ handler->identifier(), handler->userContentWorld().identifier(), handler->name() }); 97 webProcessProxy.connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers(messageHandlers), m_identifier); 98 98 99 99 #if ENABLE(CONTENT_EXTENSIONS) … … 271 271 } 272 272 273 bool WebUserContentControllerProxy::addUserScriptMessageHandler(WebScriptMessageHandler* handler) 274 { 273 bool WebUserContentControllerProxy::addUserScriptMessageHandler(WebScriptMessageHandler& handler) 274 { 275 Ref<API::UserContentWorld> world = handler.userContentWorld(); 276 275 277 for (auto& existingHandler : m_scriptMessageHandlers.values()) { 276 if (existingHandler->name() == handler ->name())278 if (existingHandler->name() == handler.name() && &existingHandler->userContentWorld() == world.ptr()) 277 279 return false; 278 280 } 279 281 280 m_scriptMessageHandlers.add(handler->identifier(), handler); 281 282 for (WebProcessProxy* process : m_processes) 283 process->connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ handler->handle() }), m_identifier); 282 addUserContentWorldUse(world.get()); 283 284 m_scriptMessageHandlers.add(handler.identifier(), &handler); 285 286 for (WebProcessProxy* process : m_processes) 287 process->connection()->send(Messages::WebUserContentController::AddUserScriptMessageHandlers({ { handler.identifier(), world->identifier(), handler.name() } }), m_identifier); 284 288 285 289 return true; 286 290 } 287 291 288 void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String& name )292 void WebUserContentControllerProxy::removeUserMessageHandlerForName(const String& name, API::UserContentWorld& world) 289 293 { 290 294 for (auto it = m_scriptMessageHandlers.begin(), end = m_scriptMessageHandlers.end(); it != end; ++it) { 291 if (it->value->name() == name ) {295 if (it->value->name() == name && &it->value->userContentWorld() == &world) { 292 296 for (WebProcessProxy* process : m_processes) 293 process->connection()->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(it->value->identifier()), m_identifier); 297 process->connection()->send(Messages::WebUserContentController::RemoveUserScriptMessageHandler(world.identifier(), it->value->identifier()), m_identifier); 298 294 299 m_scriptMessageHandlers.remove(it); 300 301 removeUserContentWorldUses(world, 1); 295 302 return; 296 303 } 297 304 } 305 } 306 307 void WebUserContentControllerProxy::removeAllUserMessageHandlers(API::UserContentWorld& world) 308 { 309 for (WebProcessProxy* process : m_processes) 310 process->connection()->send(Messages::WebUserContentController::RemoveAllUserScriptMessageHandlers({ world.identifier() }), m_identifier); 311 312 unsigned numberRemoved = 0; 313 m_scriptMessageHandlers.removeIf([&](HashMap<uint64_t, RefPtr<WebScriptMessageHandler>>::KeyValuePairType& entry) { 314 if (&entry.value->userContentWorld() == &world) { 315 ++numberRemoved; 316 return true; 317 } 318 return false; 319 }); 320 321 removeUserContentWorldUses(world, numberRemoved); 298 322 } 299 323 … … 316 340 return; 317 341 318 handler->client().didPostMessage(*page, *frame, securityOrigin, 319 WebCore::SerializedScriptValue::adopt(dataReference.vector())); 342 handler->client().didPostMessage(*page, *frame, securityOrigin, WebCore::SerializedScriptValue::adopt(dataReference.vector())); 320 343 } 321 344 -
trunk/Source/WebKit2/UIProcess/UserContent/WebUserContentControllerProxy.h
r197563 r199020 89 89 90 90 // Returns false if there was a name conflict. 91 bool addUserScriptMessageHandler(WebScriptMessageHandler*); 92 void removeUserMessageHandlerForName(const String&); 91 bool addUserScriptMessageHandler(WebScriptMessageHandler&); 92 void removeUserMessageHandlerForName(const String&, API::UserContentWorld&); 93 void removeAllUserMessageHandlers(API::UserContentWorld&); 93 94 94 95 #if ENABLE(CONTENT_EXTENSIONS) -
trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.cpp
r198180 r199020 172 172 addUserStyleSheetInternal(*it->value.first, userStyleSheetData.identifier, WTFMove(sheet)); 173 173 } 174 175 invalidateInjectedStyleSheetCacheInAllFramesInAllPages(); 174 176 } 175 177 … … 187 189 void WebUserContentController::removeAllUserStyleSheets(const Vector<uint64_t>& worldIdentifiers) 188 190 { 191 bool sheetsChanged = false; 189 192 for (auto& worldIdentifier : worldIdentifiers) { 190 193 auto it = worldMap().find(worldIdentifier); … … 194 197 } 195 198 196 removeUserStyleSheets(*it->value.first); 197 } 198 } 199 200 #if ENABLE(USER_MESSAGE_HANDLERS) 201 class WebUserMessageHandlerDescriptorProxy : public RefCounted<WebUserMessageHandlerDescriptorProxy>, public WebCore::UserMessageHandlerDescriptor::Client { 199 if (m_userStyleSheets.remove(it->value.first.get())) 200 sheetsChanged = true; 201 } 202 203 if (sheetsChanged) 204 invalidateInjectedStyleSheetCacheInAllFramesInAllPages(); 205 } 206 207 #if ENABLE(USER_MESSAGE_HANDLERS) 208 class WebUserMessageHandlerDescriptorProxy : public WebCore::UserMessageHandlerDescriptor { 202 209 public: 203 static PassRefPtr<WebUserMessageHandlerDescriptorProxy> create(WebUserContentController* controller, const String& name, uint64_t identifier)210 static PassRefPtr<WebUserMessageHandlerDescriptorProxy> create(WebUserContentController* controller, const String& name, InjectedBundleScriptWorld& world, uint64_t identifier) 204 211 { 205 return adoptRef(new WebUserMessageHandlerDescriptorProxy(controller, name, identifier));212 return adoptRef(new WebUserMessageHandlerDescriptorProxy(controller, name, world, identifier)); 206 213 } 207 214 208 215 virtual ~WebUserMessageHandlerDescriptorProxy() 209 216 { 210 m_descriptor->invalidateClient(); 211 } 212 213 // WebCore::UserMessageHandlerDescriptor::Client 214 virtual void didPostMessage(WebCore::UserMessageHandler& handler, WebCore::SerializedScriptValue* value) 217 } 218 219 uint64_t identifier() { return m_identifier; } 220 221 private: 222 WebUserMessageHandlerDescriptorProxy(WebUserContentController* controller, const String& name, InjectedBundleScriptWorld& world, uint64_t identifier) 223 : WebCore::UserMessageHandlerDescriptor(name, world.coreWorld()) 224 , m_controller(controller) 225 , m_identifier(identifier) 226 { 227 } 228 229 // WebCore::UserMessageHandlerDescriptor 230 void didPostMessage(WebCore::UserMessageHandler& handler, WebCore::SerializedScriptValue* value) override 215 231 { 216 232 WebCore::Frame* frame = handler.frame(); … … 229 245 } 230 246 231 WebCore::UserMessageHandlerDescriptor& descriptor() { return *m_descriptor; }232 uint64_t identifier() { return m_identifier; }233 234 private:235 WebUserMessageHandlerDescriptorProxy(WebUserContentController* controller, const String& name, uint64_t identifier)236 : m_controller(controller)237 , m_descriptor(UserMessageHandlerDescriptor::create(name, mainThreadNormalWorld(), *this))238 , m_identifier(identifier)239 {240 }241 242 247 RefPtr<WebUserContentController> m_controller; 243 RefPtr<WebCore::UserMessageHandlerDescriptor> m_descriptor;244 248 uint64_t m_identifier; 245 249 }; 246 250 #endif 247 251 248 void WebUserContentController::addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerHandle>& scriptMessageHandlers) 249 { 250 #if ENABLE(USER_MESSAGE_HANDLERS) 251 for (auto& handle : scriptMessageHandlers) { 252 RefPtr<WebUserMessageHandlerDescriptorProxy> descriptor = WebUserMessageHandlerDescriptorProxy::create(this, handle.name, handle.identifier); 253 254 m_userMessageHandlerDescriptors.add(descriptor->identifier(), descriptor); 255 256 auto& coreDescriptor = descriptor->descriptor(); 257 m_userMessageHandlerDescriptorsMap.add(std::make_pair(coreDescriptor.name(), &coreDescriptor.world()), &coreDescriptor); 252 void WebUserContentController::addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerData>& scriptMessageHandlers) 253 { 254 #if ENABLE(USER_MESSAGE_HANDLERS) 255 for (auto& handler : scriptMessageHandlers) { 256 auto it = worldMap().find(handler.worldIdentifier); 257 if (it == worldMap().end()) { 258 WTFLogAlways("Trying to add a UserScriptMessageHandler to a UserContentWorld (id=%" PRIu64 ") that does not exist.", handler.worldIdentifier); 259 continue; 260 } 261 262 addUserScriptMessageHandlerInternal(*it->value.first, handler.identifier, handler.name); 258 263 } 259 264 #else … … 262 267 } 263 268 264 void WebUserContentController::removeUserScriptMessageHandler(uint64_t identifier)265 { 266 #if ENABLE(USER_MESSAGE_HANDLERS) 267 auto it = m_userMessageHandlerDescriptors.find(identifier);268 ASSERT(it != m_userMessageHandlerDescriptors.end());269 270 auto& coreDescriptor = it->value->descriptor();271 m_userMessageHandlerDescriptorsMap.remove(std::make_pair(coreDescriptor.name(), &coreDescriptor.world()));272 273 m_userMessageHandlerDescriptors.remove(it);269 void WebUserContentController::removeUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t userScriptMessageHandlerIdentifier) 270 { 271 #if ENABLE(USER_MESSAGE_HANDLERS) 272 auto it = worldMap().find(worldIdentifier); 273 if (it == worldMap().end()) { 274 WTFLogAlways("Trying to remove a UserScriptMessageHandler from a UserContentWorld (id=%" PRIu64 ") that does not exist.", worldIdentifier); 275 return; 276 } 277 278 removeUserScriptMessageHandlerInternal(*it->value.first, userScriptMessageHandlerIdentifier); 274 279 #else 275 UNUSED_PARAM(identifier); 276 #endif 277 } 280 UNUSED_PARAM(worldIdentifier); 281 UNUSED_PARAM(userScriptMessageHandlerIdentifier); 282 #endif 283 } 284 285 void WebUserContentController::removeAllUserScriptMessageHandlers(const Vector<uint64_t>& worldIdentifiers) 286 { 287 #if ENABLE(USER_MESSAGE_HANDLERS) 288 bool userMessageHandlersChanged = false; 289 for (auto& worldIdentifier : worldIdentifiers) { 290 auto it = worldMap().find(worldIdentifier); 291 if (it == worldMap().end()) { 292 WTFLogAlways("Trying to remove all UserScriptMessageHandler from a UserContentWorld (id=%" PRIu64 ") that does not exist.", worldIdentifier); 293 return; 294 } 295 296 if (m_userMessageHandlers.remove(it->value.first.get())) 297 userMessageHandlersChanged = true; 298 } 299 300 if (userMessageHandlersChanged) 301 invalidateAllRegisteredUserMessageHandlerInvalidationClients(); 302 #else 303 UNUSED_PARAM(worldIdentifiers); 304 #endif 305 } 306 307 #if ENABLE(USER_MESSAGE_HANDLERS) 308 void WebUserContentController::addUserScriptMessageHandlerInternal(InjectedBundleScriptWorld& world, uint64_t userScriptMessageHandlerIdentifier, const String& name) 309 { 310 auto& messageHandlersInWorld = m_userMessageHandlers.ensure(&world, [] { return Vector<RefPtr<WebUserMessageHandlerDescriptorProxy>>(); }).iterator->value; 311 messageHandlersInWorld.append(WebUserMessageHandlerDescriptorProxy::create(this, name, world, userScriptMessageHandlerIdentifier)); 312 } 313 314 void WebUserContentController::removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld& world, uint64_t userScriptMessageHandlerIdentifier) 315 { 316 auto it = m_userMessageHandlers.find(&world); 317 if (it == m_userMessageHandlers.end()) 318 return; 319 320 auto& userMessageHandlers = it->value; 321 322 bool userMessageHandlersChanged = false; 323 for (int i = userMessageHandlers.size() - 1; i >= 0; --i) { 324 if (userMessageHandlers[i]->identifier() == userScriptMessageHandlerIdentifier) { 325 userMessageHandlers.remove(i); 326 userMessageHandlersChanged = true; 327 } 328 } 329 330 if (!userMessageHandlersChanged) 331 return; 332 333 if (userMessageHandlers.isEmpty()) 334 m_userMessageHandlers.remove(it); 335 336 invalidateAllRegisteredUserMessageHandlerInvalidationClients(); 337 } 338 #endif 278 339 279 340 #if ENABLE(CONTENT_EXTENSIONS) … … 298 359 } 299 360 #endif 300 301 302 361 303 362 void WebUserContentController::addUserScriptInternal(InjectedBundleScriptWorld& world, uint64_t userScriptIdentifier, UserScript&& userScript) … … 353 412 auto& styleSheetsInWorld = m_userStyleSheets.ensure(&world, [] { return Vector<std::pair<uint64_t, WebCore::UserStyleSheet>>(); }).iterator->value; 354 413 styleSheetsInWorld.append(std::make_pair(userStyleSheetIdentifier, WTFMove(userStyleSheet))); 355 414 } 415 416 void WebUserContentController::addUserStyleSheet(InjectedBundleScriptWorld& world, UserStyleSheet&& userStyleSheet) 417 { 418 addUserStyleSheetInternal(world, 0, WTFMove(userStyleSheet)); 356 419 invalidateInjectedStyleSheetCacheInAllFramesInAllPages(); 357 }358 359 void WebUserContentController::addUserStyleSheet(InjectedBundleScriptWorld& world, UserStyleSheet&& userStyleSheet)360 {361 addUserStyleSheetInternal(world, 0, WTFMove(userStyleSheet));362 420 } 363 421 … … 447 505 } 448 506 507 #if ENABLE(USER_MESSAGE_HANDLERS) 508 void WebUserContentController::forEachUserMessageHandler(const std::function<void(const WebCore::UserMessageHandlerDescriptor&)>& functor) const 509 { 510 for (const auto& userMessageHandlerVector : m_userMessageHandlers.values()) { 511 for (const auto& userMessageHandler : userMessageHandlerVector) 512 functor(*userMessageHandler.get()); 513 } 514 } 515 #endif 516 449 517 } // namespace WebKit -
trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.h
r198208 r199020 47 47 class InjectedBundleScriptWorld; 48 48 class WebCompiledContentExtensionData; 49 50 #if ENABLE(USER_MESSAGE_HANDLERS)51 49 class WebUserMessageHandlerDescriptorProxy; 52 #endif53 50 54 51 class WebUserContentController final : public WebCore::UserContentProvider, private IPC::MessageReceiver { … … 74 71 void forEachUserStyleSheet(const std::function<void(const WebCore::UserStyleSheet&)>&) const override; 75 72 #if ENABLE(USER_MESSAGE_HANDLERS) 76 const WebCore::UserMessageHandlerDescriptorMap& userMessageHandlerDescriptors() const override { return m_userMessageHandlerDescriptorsMap; }73 void forEachUserMessageHandler(const std::function<void(const WebCore::UserMessageHandlerDescriptor&)>&) const override; 77 74 #endif 78 75 #if ENABLE(CONTENT_EXTENSIONS) … … 94 91 void removeAllUserStyleSheets(const Vector<uint64_t>&); 95 92 96 void addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerHandle>&); 97 void removeUserScriptMessageHandler(uint64_t); 93 void addUserScriptMessageHandlers(const Vector<WebScriptMessageHandlerData>&); 94 void removeUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t userScriptIdentifier); 95 void removeAllUserScriptMessageHandlers(const Vector<uint64_t>&); 98 96 99 97 #if ENABLE(CONTENT_EXTENSIONS) … … 103 101 #endif 104 102 105 106 103 void addUserScriptInternal(InjectedBundleScriptWorld&, uint64_t userScriptIdentifier, WebCore::UserScript&&); 107 104 void removeUserScriptInternal(InjectedBundleScriptWorld&, uint64_t userScriptIdentifier); 108 105 void addUserStyleSheetInternal(InjectedBundleScriptWorld&, uint64_t userStyleSheetIdentifier, WebCore::UserStyleSheet&&); 109 106 void removeUserStyleSheetInternal(InjectedBundleScriptWorld&, uint64_t userStyleSheetIdentifier); 110 107 #if ENABLE(USER_MESSAGE_HANDLERS) 108 void addUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&, uint64_t userScriptMessageHandlerIdentifier, const String& name); 109 void removeUserScriptMessageHandlerInternal(InjectedBundleScriptWorld&, uint64_t userScriptMessageHandlerIdentifier); 110 #endif 111 111 112 112 uint64_t m_identifier; … … 119 119 120 120 #if ENABLE(USER_MESSAGE_HANDLERS) 121 HashMap<uint64_t, RefPtr<WebUserMessageHandlerDescriptorProxy>> m_userMessageHandlerDescriptors;122 W ebCore::UserMessageHandlerDescriptorMap m_userMessageHandlerDescriptorsMap;121 typedef HashMap<RefPtr<InjectedBundleScriptWorld>, Vector<RefPtr<WebUserMessageHandlerDescriptorProxy>>> WorldToUserMessageHandlerVectorMap; 122 WorldToUserMessageHandlerVectorMap m_userMessageHandlers; 123 123 #endif 124 124 #if ENABLE(CONTENT_EXTENSIONS) -
trunk/Source/WebKit2/WebProcess/UserContent/WebUserContentController.messages.in
r198180 r199020 36 36 RemoveAllUserStyleSheets(Vector<uint64_t> worldIdentifiers); 37 37 38 AddUserScriptMessageHandlers(Vector<WebKit::WebScriptMessageHandlerHandle> scriptMessageHandlers); 39 RemoveUserScriptMessageHandler(uint64_t identifier); 38 AddUserScriptMessageHandlers(Vector<struct WebKit::WebScriptMessageHandlerData> scriptMessageHandlers); 39 RemoveUserScriptMessageHandler(uint64_t worldIdentifier, uint64_t identifier); 40 RemoveAllUserScriptMessageHandlers(Vector<uint64_t> worldIdentifiers); 40 41 41 42 #if ENABLE(CONTENT_EXTENSIONS) -
trunk/Tools/ChangeLog
r199018 r199020 1 2016-04-03 Sam Weinig <sam@webkit.org> 2 3 Add SPI to allow install script message handlers in isolated worlds 4 https://bugs.webkit.org/show_bug.cgi?id=156153 5 6 Reviewed by Anders Carlsson. 7 8 * TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm: 9 Add new test, WKUserContentController.ScriptMessageHandlerBasicPostIsolatedWorld 10 1 11 2016-04-04 Jiewen Tan <jiewen_tan@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/UserContentController.mm
r197868 r199020 96 96 } 97 97 98 TEST(WKUserContentController, ScriptMessageHandlerBasicPostIsolatedWorld) 99 { 100 RetainPtr<_WKUserContentWorld> world = adoptNS([_WKUserContentWorld worldWithName:@"TestWorld"]); 101 102 RetainPtr<ScriptMessageHandler> handler = adoptNS([[ScriptMessageHandler alloc] init]); 103 RetainPtr<WKUserScript> userScript = adoptNS([[WKUserScript alloc] _initWithSource:@"window.webkit.messageHandlers.testHandler.postMessage('Hello')" injectionTime:WKUserScriptInjectionTimeAtDocumentStart forMainFrameOnly:NO legacyWhitelist:@[] legacyBlacklist:@[] userContentWorld:world.get()]); 104 105 RetainPtr<WKWebViewConfiguration> configuration = adoptNS([[WKWebViewConfiguration alloc] init]); 106 [[configuration userContentController] _addScriptMessageHandler:handler.get() name:@"testHandler" userContentWorld:world.get()]; 107 [[configuration userContentController] addUserScript:userScript.get()]; 108 109 RetainPtr<WKWebView> webView = adoptNS([[WKWebView alloc] initWithFrame:NSMakeRect(0, 0, 800, 600) configuration:configuration.get()]); 110 111 RetainPtr<SimpleNavigationDelegate> delegate = adoptNS([[SimpleNavigationDelegate alloc] init]); 112 [webView setNavigationDelegate:delegate.get()]; 113 114 NSURLRequest *request = [NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"simple" withExtension:@"html" subdirectory:@"TestWebKitAPI.resources"]]; 115 116 isDoneWithNavigation = false; 117 [webView loadRequest:request]; 118 119 TestWebKitAPI::Util::run(&receivedScriptMessage); 120 receivedScriptMessage = false; 121 122 EXPECT_WK_STREQ(@"Hello", (NSString *)[lastScriptMessage body]); 123 124 if (!isDoneWithNavigation) 125 TestWebKitAPI::Util::run(&isDoneWithNavigation); 126 127 __block bool isDoneEvaluatingScript = false; 128 __block NSString *resultValue = @""; 129 [webView evaluateJavaScript: 130 @"var result;" 131 "if (window.webkit && window.webkit.messageHandlers && window.webkit.messageHandlers.testHandler) {" 132 " result = { 'result': 'FAIL' };" 133 "} else {" 134 " result = { 'result': 'PASS' };" 135 "} " 136 "result;" 137 completionHandler:^(id value, NSError *error) { 138 resultValue = [((NSDictionary *)value)[@"result"] copy]; 139 isDoneEvaluatingScript = true; 140 }]; 141 142 TestWebKitAPI::Util::run(&isDoneEvaluatingScript); 143 144 EXPECT_WK_STREQ(@"PASS", resultValue); 145 } 146 98 147 TEST(WKUserContentController, ScriptMessageHandlerBasicRemove) 99 148 {
Note: See TracChangeset
for help on using the changeset viewer.