WebKit Bugzilla
Attachment 347918 Details for
Bug 188883
: [GTK][WPE] Add API to inject/register user content in isolated worlds
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
Patch
wk-user-content-world.diff (text/plain), 38.13 KB, created by
Carlos Garcia Campos
on 2018-08-23 04:30:50 PDT
(
hide
)
Description:
Patch
Filename:
MIME Type:
Creator:
Carlos Garcia Campos
Created:
2018-08-23 04:30:50 PDT
Size:
38.13 KB
patch
obsolete
>diff --git a/Source/WebKit/ChangeLog b/Source/WebKit/ChangeLog >index 0cd463f0cc1..0aae9886e3e 100644 >--- a/Source/WebKit/ChangeLog >+++ b/Source/WebKit/ChangeLog >@@ -1,3 +1,33 @@ >+2018-08-23 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK][WPE] Add API to inject/register user content in isolated worlds >+ https://bugs.webkit.org/show_bug.cgi?id=188883 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add new API to create user scripts/stylesheets for a given script world and to register/unregister user script >+ messages in a given script world. >+ >+ * UIProcess/API/glib/WebKitUserContent.cpp: >+ (webkitUserContentWorld): >+ (_WebKitUserStyleSheet::_WebKitUserStyleSheet): >+ (webkit_user_style_sheet_new): >+ (webkit_user_style_sheet_new_for_world): >+ (_WebKitUserScript::_WebKitUserScript): >+ (webkit_user_script_new): >+ (webkit_user_script_new_for_world): >+ * UIProcess/API/glib/WebKitUserContentManager.cpp: >+ (webkit_user_content_manager_register_script_message_handler_in_world): >+ (webkit_user_content_manager_unregister_script_message_handler_in_world): >+ * UIProcess/API/glib/WebKitUserContentPrivate.h: >+ * UIProcess/API/gtk/WebKitUserContent.h: >+ * UIProcess/API/gtk/WebKitUserContentManager.h: >+ * UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt: >+ * UIProcess/API/wpe/WebKitUserContent.h: >+ * UIProcess/API/wpe/WebKitUserContentManager.h: >+ * WebProcess/UserContent/WebUserContentController.cpp: >+ (WebKit::WebUserContentController::addUserContentWorlds): >+ > 2018-08-21 Ryosuke Niwa <rniwa@webkit.org> > > Replace booleans for modifier keys in UIEventWithKeyState with OptionSet<Modifier> >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitUserContent.cpp b/Source/WebKit/UIProcess/API/glib/WebKitUserContent.cpp >index a0e6dfb3dc7..34583f98061 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitUserContent.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitUserContent.cpp >@@ -21,6 +21,8 @@ > #include "WebKitUserContent.h" > > #include "WebKitUserContentPrivate.h" >+#include <wtf/HashMap.h> >+#include <wtf/NeverDestroyed.h> > #include <wtf/text/CString.h> > > using namespace WebCore; >@@ -35,6 +37,13 @@ using namespace WebCore; > * Since: 2.6 > */ > >+ >+API::UserContentWorld& webkitUserContentWorld(const char* worldName) >+{ >+ static NeverDestroyed<HashMap<CString, RefPtr<API::UserContentWorld>>> map; >+ return *map.get().ensure(worldName, [&] { return API::UserContentWorld::worldWithName(String::fromUTF8(worldName)); }).iterator->value; >+} >+ > static inline UserContentInjectedFrames toUserContentInjectedFrames(WebKitUserContentInjectedFrames injectedFrames) > { > switch (injectedFrames) { >@@ -86,12 +95,12 @@ static inline Vector<String> toStringVector(const char* const* strv) > } > > struct _WebKitUserStyleSheet { >- _WebKitUserStyleSheet(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* const* whitelist, const char* const* blacklist) >+ _WebKitUserStyleSheet(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* const* whitelist, const char* const* blacklist, API::UserContentWorld& world) > : userStyleSheet(adoptRef(new API::UserStyleSheet(UserStyleSheet { > String::fromUTF8(source), URL { }, > toStringVector(whitelist), toStringVector(blacklist), > toUserContentInjectedFrames(injectedFrames), >- toUserStyleLevel(level) }, API::UserContentWorld::normalWorld()))) >+ toUserStyleLevel(level) }, world))) > , referenceCount(1) > { > } >@@ -162,7 +171,33 @@ WebKitUserStyleSheet* webkit_user_style_sheet_new(const gchar* source, WebKitUse > { > g_return_val_if_fail(source, nullptr); > WebKitUserStyleSheet* userStyleSheet = static_cast<WebKitUserStyleSheet*>(fastMalloc(sizeof(WebKitUserStyleSheet))); >- new (userStyleSheet) WebKitUserStyleSheet(source, injectedFrames, level, whitelist, blacklist); >+ new (userStyleSheet) WebKitUserStyleSheet(source, injectedFrames, level, whitelist, blacklist, API::UserContentWorld::normalWorld()); >+ return userStyleSheet; >+} >+ >+/** >+ * webkit_user_style_sheet_new_for_world: >+ * @source: Source code of the user style sheet. >+ * @injected_frames: A #WebKitUserContentInjectedFrames value >+ * @level: A #WebKitUserStyleLevel >+ * @world_name: the name of a #WebKitScriptWorld >+ * @whitelist: (array zero-terminated=1) (allow-none): A whitelist of URI patterns or %NULL >+ * @blacklist: (array zero-terminated=1) (allow-none): A blacklist of URI patterns or %NULL >+ * >+ * Creates a new user style sheet for script world with name @world_name. >+ * See webkit_user_style_sheet_new() for a full description. >+ * >+ * Returns: A new #WebKitUserStyleSheet >+ * >+ * Since: 2.22 >+ */ >+WebKitUserStyleSheet* webkit_user_style_sheet_new_for_world(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserStyleLevel level, const char* worldName, const char* const* whitelist, const char* const* blacklist) >+{ >+ g_return_val_if_fail(source, nullptr); >+ g_return_val_if_fail(worldName, nullptr); >+ >+ WebKitUserStyleSheet* userStyleSheet = static_cast<WebKitUserStyleSheet*>(fastMalloc(sizeof(WebKitUserStyleSheet))); >+ new (userStyleSheet) WebKitUserStyleSheet(source, injectedFrames, level, whitelist, blacklist, webkitUserContentWorld(worldName)); > return userStyleSheet; > } > >@@ -172,12 +207,12 @@ API::UserStyleSheet& webkitUserStyleSheetGetUserStyleSheet(WebKitUserStyleSheet* > } > > struct _WebKitUserScript { >- _WebKitUserScript(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserScriptInjectionTime injectionTime, const gchar* const* whitelist, const gchar* const* blacklist) >+ _WebKitUserScript(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserScriptInjectionTime injectionTime, const gchar* const* whitelist, const gchar* const* blacklist, API::UserContentWorld& world) > : userScript(adoptRef(new API::UserScript(UserScript { > String::fromUTF8(source), URL { }, > toStringVector(whitelist), toStringVector(blacklist), > toUserScriptInjectionTime(injectionTime), >- toUserContentInjectedFrames(injectedFrames) }, API::UserContentWorld::normalWorld()))) >+ toUserContentInjectedFrames(injectedFrames) }, world))) > , referenceCount(1) > { > } >@@ -248,7 +283,33 @@ WebKitUserScript* webkit_user_script_new(const gchar* source, WebKitUserContentI > { > g_return_val_if_fail(source, nullptr); > WebKitUserScript* userScript = static_cast<WebKitUserScript*>(fastMalloc(sizeof(WebKitUserScript))); >- new (userScript) WebKitUserScript(source, injectedFrames, injectionTime, whitelist, blacklist); >+ new (userScript) WebKitUserScript(source, injectedFrames, injectionTime, whitelist, blacklist, API::UserContentWorld::normalWorld()); >+ return userScript; >+} >+ >+/** >+ * webkit_user_script_new_for_world: >+ * @source: Source code of the user script. >+ * @injected_frames: A #WebKitUserContentInjectedFrames value >+ * @injection_time: A #WebKitUserScriptInjectionTime value >+ * @world_name: the name of a #WebKitScriptWorld >+ * @whitelist: (array zero-terminated=1) (allow-none): A whitelist of URI patterns or %NULL >+ * @blacklist: (array zero-terminated=1) (allow-none): A blacklist of URI patterns or %NULL >+ * >+ * Creates a new user script for script world with name @world_name. >+ * See webkit_user_script_new() for a full description. >+ * >+ * Returns: A new #WebKitUserScript >+ * >+ * Since: 2.22 >+ */ >+WebKitUserScript* webkit_user_script_new_for_world(const gchar* source, WebKitUserContentInjectedFrames injectedFrames, WebKitUserScriptInjectionTime injectionTime, const char* worldName, const gchar* const* whitelist, const gchar* const* blacklist) >+{ >+ g_return_val_if_fail(source, nullptr); >+ g_return_val_if_fail(worldName, nullptr); >+ >+ WebKitUserScript* userScript = static_cast<WebKitUserScript*>(fastMalloc(sizeof(WebKitUserScript))); >+ new (userScript) WebKitUserScript(source, injectedFrames, injectionTime, whitelist, blacklist, webkitUserContentWorld(worldName)); > return userScript; > } > >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitUserContentManager.cpp b/Source/WebKit/UIProcess/API/glib/WebKitUserContentManager.cpp >index 02dcc0b7519..36746c72e7c 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitUserContentManager.cpp >+++ b/Source/WebKit/UIProcess/API/glib/WebKitUserContentManager.cpp >@@ -265,6 +265,59 @@ void webkit_user_content_manager_unregister_script_message_handler(WebKitUserCon > manager->priv->userContentController->removeUserMessageHandlerForName(String::fromUTF8(name), API::UserContentWorld::normalWorld()); > } > >+/** >+ * webkit_user_content_manager_register_script_message_handler_in_world: >+ * @manager: A #WebKitUserContentManager >+ * @name: Name of the script message channel >+ * @world_name: the name of a #WebKitScriptWorld >+ * >+ * Registers a new user script message handler in script world with name @world_name. >+ * See webkit_user_content_manager_register_script_message_handler() for full description. >+ * >+ * Registering a script message handler will fail if the requested >+ * name has been already registered before. >+ * >+ * Returns: %TRUE if message handler was registered successfully, or %FALSE otherwise. >+ * >+ * Since: 2.22 >+ */ >+gboolean webkit_user_content_manager_register_script_message_handler_in_world(WebKitUserContentManager* manager, const char* name, const char* worldName) >+{ >+ g_return_val_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager), FALSE); >+ g_return_val_if_fail(name, FALSE); >+ g_return_val_if_fail(worldName, FALSE); >+ >+ Ref<WebScriptMessageHandler> handler = >+ WebScriptMessageHandler::create(std::make_unique<ScriptMessageClientGtk>(manager, name), String::fromUTF8(name), webkitUserContentWorld(worldName)); >+ return manager->priv->userContentController->addUserScriptMessageHandler(handler.get()); >+} >+ >+/** >+ * webkit_user_content_manager_unregister_script_message_handler_in_world: >+ * @manager: A #WebKitUserContentManager >+ * @name: Name of the script message channel >+ * @world_name: the name of a #WebKitScriptWorld >+ * >+ * Unregisters a previously registered message handler in script world with name @world_name. >+ * >+ * Note that this does *not* disconnect handlers for the >+ * #WebKitUserContentManager::script-message-received signal, >+ * they will be kept connected, but the signal will not be emitted >+ * unless the handler name is registered again. >+ * >+ * See also webkit_user_content_manager_register_script_message_handler() >+ * >+ * Since: 2.22 >+ */ >+void webkit_user_content_manager_unregister_script_message_handler_in_world(WebKitUserContentManager* manager, const char* name, const char* worldName) >+{ >+ g_return_if_fail(WEBKIT_IS_USER_CONTENT_MANAGER(manager)); >+ g_return_if_fail(name); >+ g_return_if_fail(worldName); >+ >+ manager->priv->userContentController->removeUserMessageHandlerForName(String::fromUTF8(name), webkitUserContentWorld(worldName)); >+} >+ > WebUserContentControllerProxy* webkitUserContentManagerGetUserContentControllerProxy(WebKitUserContentManager* manager) > { > return manager->priv->userContentController.get(); >diff --git a/Source/WebKit/UIProcess/API/glib/WebKitUserContentPrivate.h b/Source/WebKit/UIProcess/API/glib/WebKitUserContentPrivate.h >index 444e2caaa72..f181a294553 100644 >--- a/Source/WebKit/UIProcess/API/glib/WebKitUserContentPrivate.h >+++ b/Source/WebKit/UIProcess/API/glib/WebKitUserContentPrivate.h >@@ -20,6 +20,7 @@ > #ifndef WebKitUserContentPrivate_h > #define WebKitUserContentPrivate_h > >+#include "APIUserContentWorld.h" > #include "APIUserScript.h" > #include "APIUserStyleSheet.h" > #include "WebKitUserContent.h" >@@ -28,5 +29,6 @@ > > API::UserScript& webkitUserScriptGetUserScript(WebKitUserScript*); > API::UserStyleSheet& webkitUserStyleSheetGetUserStyleSheet(WebKitUserStyleSheet*); >+API::UserContentWorld& webkitUserContentWorld(const char*); > > #endif // WebKitUserContentPrivate_h >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitUserContent.h b/Source/WebKit/UIProcess/API/gtk/WebKitUserContent.h >index c3f1ed569f8..1dd450d0cb7 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitUserContent.h >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitUserContent.h >@@ -69,20 +69,28 @@ typedef enum { > typedef struct _WebKitUserStyleSheet WebKitUserStyleSheet; > > WEBKIT_API GType >-webkit_user_style_sheet_get_type (void); >+webkit_user_style_sheet_get_type (void); > > WEBKIT_API WebKitUserStyleSheet * >-webkit_user_style_sheet_ref (WebKitUserStyleSheet *user_style_sheet); >+webkit_user_style_sheet_ref (WebKitUserStyleSheet *user_style_sheet); > > WEBKIT_API void >-webkit_user_style_sheet_unref (WebKitUserStyleSheet *user_style_sheet); >+webkit_user_style_sheet_unref (WebKitUserStyleSheet *user_style_sheet); > > WEBKIT_API WebKitUserStyleSheet * >-webkit_user_style_sheet_new (const gchar *source, >- WebKitUserContentInjectedFrames injected_frames, >- WebKitUserStyleLevel level, >- const gchar* const *whitelist, >- const gchar* const *blacklist); >+webkit_user_style_sheet_new (const gchar *source, >+ WebKitUserContentInjectedFrames injected_frames, >+ WebKitUserStyleLevel level, >+ const gchar* const *whitelist, >+ const gchar* const *blacklist); >+ >+WEBKIT_API WebKitUserStyleSheet * >+webkit_user_style_sheet_new_for_world (const gchar *source, >+ WebKitUserContentInjectedFrames injected_frames, >+ WebKitUserStyleLevel level, >+ const gchar *world_name, >+ const gchar* const *whitelist, >+ const gchar* const *blacklist); > > /** > * WebKitUserScriptInjectionTime: >@@ -120,6 +128,14 @@ webkit_user_script_new (const gchar *source, > const gchar* const *whitelist, > const gchar* const *blacklist); > >+WEBKIT_API WebKitUserScript * >+webkit_user_script_new_for_world (const gchar *source, >+ WebKitUserContentInjectedFrames injected_frames, >+ WebKitUserScriptInjectionTime injection_time, >+ const gchar *world_name, >+ const gchar* const *whitelist, >+ const gchar* const *blacklist); >+ > G_END_DECLS > > #endif >diff --git a/Source/WebKit/UIProcess/API/gtk/WebKitUserContentManager.h b/Source/WebKit/UIProcess/API/gtk/WebKitUserContentManager.h >index 86d24a11352..ff505689323 100644 >--- a/Source/WebKit/UIProcess/API/gtk/WebKitUserContentManager.h >+++ b/Source/WebKit/UIProcess/API/gtk/WebKitUserContentManager.h >@@ -58,32 +58,40 @@ struct _WebKitUserContentManagerClass { > void (*_webkit_reserved3) (void); > }; > >- > WEBKIT_API GType >-webkit_user_content_manager_get_type (void); >+webkit_user_content_manager_get_type (void); > > WEBKIT_API WebKitUserContentManager * >-webkit_user_content_manager_new (void); >+webkit_user_content_manager_new (void); > > WEBKIT_API void >-webkit_user_content_manager_add_style_sheet (WebKitUserContentManager *manager, >- WebKitUserStyleSheet *stylesheet); >+webkit_user_content_manager_add_style_sheet (WebKitUserContentManager *manager, >+ WebKitUserStyleSheet *stylesheet); >+WEBKIT_API void >+webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager); >+ >+WEBKIT_API gboolean >+webkit_user_content_manager_register_script_message_handler (WebKitUserContentManager *manager, >+ const gchar *name); > WEBKIT_API void >-webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager); >+webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager, >+ const gchar *name); > > WEBKIT_API gboolean >-webkit_user_content_manager_register_script_message_handler (WebKitUserContentManager *manager, >- const gchar *name); >+webkit_user_content_manager_register_script_message_handler_in_world (WebKitUserContentManager *manager, >+ const gchar *name, >+ const gchar *world_name); > WEBKIT_API void >-webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager, >- const gchar *name); >+webkit_user_content_manager_unregister_script_message_handler_in_world (WebKitUserContentManager *manager, >+ const gchar *name, >+ const gchar *world_name); > > WEBKIT_API void >-webkit_user_content_manager_add_script (WebKitUserContentManager *manager, >- WebKitUserScript *script); >+webkit_user_content_manager_add_script (WebKitUserContentManager *manager, >+ WebKitUserScript *script); > > WEBKIT_API void >-webkit_user_content_manager_remove_all_scripts (WebKitUserContentManager *manager); >+webkit_user_content_manager_remove_all_scripts (WebKitUserContentManager *manager); > > G_END_DECLS > >diff --git a/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt b/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt >index 3eb82986014..55605db4043 100644 >--- a/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt >+++ b/Source/WebKit/UIProcess/API/gtk/docs/webkit2gtk-4.0-sections.txt >@@ -96,9 +96,11 @@ WebKitUserScriptInjectionTime > webkit_user_style_sheet_ref > webkit_user_style_sheet_unref > webkit_user_style_sheet_new >+webkit_user_style_sheet_new_for_world > webkit_user_script_ref > webkit_user_script_unref > webkit_user_script_new >+webkit_user_script_new_for_world > > <SUBSECTION Standard> > WEBKIT_TYPE_USER_STYLE_SHEET >@@ -120,6 +122,8 @@ webkit_user_content_manager_add_script > webkit_user_content_manager_remove_all_scripts > webkit_user_content_manager_register_script_message_handler > webkit_user_content_manager_unregister_script_message_handler >+webkit_user_content_manager_register_script_message_handler_in_world >+webkit_user_content_manager_unregister_script_message_handler_in_world > > <SUBSECTION Standard> > WEBKIT_IS_USER_CONTENT_MANAGER >diff --git a/Source/WebKit/UIProcess/API/wpe/WebKitUserContent.h b/Source/WebKit/UIProcess/API/wpe/WebKitUserContent.h >index e7b5aeebdba..926f98dc5ad 100644 >--- a/Source/WebKit/UIProcess/API/wpe/WebKitUserContent.h >+++ b/Source/WebKit/UIProcess/API/wpe/WebKitUserContent.h >@@ -69,20 +69,28 @@ typedef enum { > typedef struct _WebKitUserStyleSheet WebKitUserStyleSheet; > > WEBKIT_API GType >-webkit_user_style_sheet_get_type (void); >+webkit_user_style_sheet_get_type (void); > > WEBKIT_API WebKitUserStyleSheet * >-webkit_user_style_sheet_ref (WebKitUserStyleSheet *user_style_sheet); >+webkit_user_style_sheet_ref (WebKitUserStyleSheet *user_style_sheet); > > WEBKIT_API void >-webkit_user_style_sheet_unref (WebKitUserStyleSheet *user_style_sheet); >+webkit_user_style_sheet_unref (WebKitUserStyleSheet *user_style_sheet); > > WEBKIT_API WebKitUserStyleSheet * >-webkit_user_style_sheet_new (const gchar *source, >- WebKitUserContentInjectedFrames injected_frames, >- WebKitUserStyleLevel level, >- const gchar* const *whitelist, >- const gchar* const *blacklist); >+webkit_user_style_sheet_new (const gchar *source, >+ WebKitUserContentInjectedFrames injected_frames, >+ WebKitUserStyleLevel level, >+ const gchar* const *whitelist, >+ const gchar* const *blacklist); >+ >+WEBKIT_API WebKitUserStyleSheet * >+webkit_user_style_sheet_new_for_world (const gchar *source, >+ WebKitUserContentInjectedFrames injected_frames, >+ WebKitUserStyleLevel level, >+ const gchar *world_name, >+ const gchar* const *whitelist, >+ const gchar* const *blacklist); > > /** > * WebKitUserScriptInjectionTime: >@@ -120,6 +128,14 @@ webkit_user_script_new (const gchar *source, > const gchar* const *whitelist, > const gchar* const *blacklist); > >+WEBKIT_API WebKitUserScript * >+webkit_user_script_new_for_world (const gchar *source, >+ WebKitUserContentInjectedFrames injected_frames, >+ WebKitUserScriptInjectionTime injection_time, >+ const gchar *world_name, >+ const gchar* const *whitelist, >+ const gchar* const *blacklist); >+ > G_END_DECLS > > #endif >diff --git a/Source/WebKit/UIProcess/API/wpe/WebKitUserContentManager.h b/Source/WebKit/UIProcess/API/wpe/WebKitUserContentManager.h >index 27a27c83a4f..6513fa7b423 100644 >--- a/Source/WebKit/UIProcess/API/wpe/WebKitUserContentManager.h >+++ b/Source/WebKit/UIProcess/API/wpe/WebKitUserContentManager.h >@@ -58,32 +58,40 @@ struct _WebKitUserContentManagerClass { > void (*_webkit_reserved3) (void); > }; > >- > WEBKIT_API GType >-webkit_user_content_manager_get_type (void); >+webkit_user_content_manager_get_type (void); > > WEBKIT_API WebKitUserContentManager * >-webkit_user_content_manager_new (void); >+webkit_user_content_manager_new (void); > > WEBKIT_API void >-webkit_user_content_manager_add_style_sheet (WebKitUserContentManager *manager, >- WebKitUserStyleSheet *stylesheet); >+webkit_user_content_manager_add_style_sheet (WebKitUserContentManager *manager, >+ WebKitUserStyleSheet *stylesheet); >+WEBKIT_API void >+webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager); >+ >+WEBKIT_API gboolean >+webkit_user_content_manager_register_script_message_handler (WebKitUserContentManager *manager, >+ const gchar *name); > WEBKIT_API void >-webkit_user_content_manager_remove_all_style_sheets (WebKitUserContentManager *manager); >+webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager, >+ const gchar *name); > > WEBKIT_API gboolean >-webkit_user_content_manager_register_script_message_handler (WebKitUserContentManager *manager, >- const gchar *name); >+webkit_user_content_manager_register_script_message_handler_in_world (WebKitUserContentManager *manager, >+ const gchar *name, >+ const gchar *world_name); > WEBKIT_API void >-webkit_user_content_manager_unregister_script_message_handler (WebKitUserContentManager *manager, >- const gchar *name); >+webkit_user_content_manager_unregister_script_message_handler_in_world (WebKitUserContentManager *manager, >+ const gchar *name, >+ const gchar *world_name); > > WEBKIT_API void >-webkit_user_content_manager_add_script (WebKitUserContentManager *manager, >- WebKitUserScript *script); >+webkit_user_content_manager_add_script (WebKitUserContentManager *manager, >+ WebKitUserScript *script); > > WEBKIT_API void >-webkit_user_content_manager_remove_all_scripts (WebKitUserContentManager *manager); >+webkit_user_content_manager_remove_all_scripts (WebKitUserContentManager *manager); > > G_END_DECLS > >diff --git a/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp b/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp >index c4fcb908683..718ee453af1 100644 >--- a/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp >+++ b/Source/WebKit/WebProcess/UserContent/WebUserContentController.cpp >@@ -101,7 +101,15 @@ void WebUserContentController::addUserContentWorlds(const Vector<std::pair<uint6 > ASSERT(world.first); > ASSERT(world.first != 1); > >- worldMap().ensure(world.first, [&] { return std::make_pair(InjectedBundleScriptWorld::create(world.second), 1); }); >+ worldMap().ensure(world.first, [&] { >+#if PLATFORM(GTK) || PLATFORM(WPE) >+ // The GLib API doesn't allow to create script worlds from the UI process, and the >+ // world name is used as the identifier. Use the existing world if found. >+ if (auto* existingWorld = InjectedBundleScriptWorld::find(world.second)) >+ return std::make_pair(Ref<InjectedBundleScriptWorld>(*existingWorld), 1); >+#endif >+ return std::make_pair(InjectedBundleScriptWorld::create(world.second), 1); >+ }); > } > } > >diff --git a/Tools/ChangeLog b/Tools/ChangeLog >index a7bb2e7b1cd..f8d285a5c06 100644 >--- a/Tools/ChangeLog >+++ b/Tools/ChangeLog >@@ -1,3 +1,23 @@ >+2018-08-23 Carlos Garcia Campos <cgarcia@igalia.com> >+ >+ [GTK][WPE] Add API to inject/register user content in isolated worlds >+ https://bugs.webkit.org/show_bug.cgi?id=188883 >+ >+ Reviewed by NOBODY (OOPS!). >+ >+ Add test cases for the new API. >+ >+ * TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp: >+ (isStyleSheetInjectedForURLAtPath): >+ (isScriptInjectedForURLAtPath): >+ (testUserContentManagerInjectedStyleSheet): >+ (testUserContentManagerInjectedScript): >+ (UserScriptMessageTest::registerHandler): >+ (UserScriptMessageTest::unregisterHandler): >+ (UserScriptMessageTest::postMessageAndWaitUntilReceived): >+ (testUserContentManagerScriptMessageInWorldReceived): >+ (beforeAll): >+ > 2018-08-21 Alex Christensen <achristensen@webkit.org> > > Transition ResizeReversePaginatedWebView API test from WKPageLoaderClient to WKPageNavigationClient >diff --git a/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp b/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp >index 9783c3533b4..ad231230343 100644 >--- a/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp >+++ b/Tools/TestWebKitAPI/Tests/WebKitGLib/TestWebKitUserContentManager.cpp >@@ -47,13 +47,14 @@ static void testWebViewNewWithUserContentManager(Test* test, gconstpointer) > g_assert(webkit_web_view_get_user_content_manager(webView2.get()) != userContentManager1.get()); > } > >-static bool isStyleSheetInjectedForURLAtPath(WebViewTest* test, const char* path) >+static bool isStyleSheetInjectedForURLAtPath(WebViewTest* test, const char* path, const char* world = nullptr) > { > test->loadURI(kServer->getURIForPath(path).data()); > test->waitUntilLoadFinished(); > > GUniqueOutPtr<GError> error; >- WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished(kStyleSheetTestScript, &error.outPtr()); >+ WebKitJavascriptResult* javascriptResult = world ? test->runJavaScriptInWorldAndWaitUntilFinished(kStyleSheetTestScript, world, &error.outPtr()) >+ : test->runJavaScriptAndWaitUntilFinished(kStyleSheetTestScript, &error.outPtr()); > g_assert(javascriptResult); > g_assert(!error.get()); > >@@ -61,13 +62,15 @@ static bool isStyleSheetInjectedForURLAtPath(WebViewTest* test, const char* path > return !g_strcmp0(resultString.get(), kStyleSheetTestScriptResult); > } > >-static bool isScriptInjectedForURLAtPath(WebViewTest* test, const char* path) >+static bool isScriptInjectedForURLAtPath(WebViewTest* test, const char* path, const char* world = nullptr) > { > test->loadURI(kServer->getURIForPath(path).data()); > test->waitUntilLoadFinished(); > > GUniqueOutPtr<GError> error; >- if (WebKitJavascriptResult* javascriptResult = test->runJavaScriptAndWaitUntilFinished(kScriptTestScript, &error.outPtr())) { >+ WebKitJavascriptResult* javascriptResult = world ? test->runJavaScriptInWorldAndWaitUntilFinished(kScriptTestScript, world, &error.outPtr()) >+ : test->runJavaScriptAndWaitUntilFinished(kScriptTestScript, &error.outPtr()); >+ if (javascriptResult) { > g_assert(!error.get()); > > GUniquePtr<char> resultString(WebViewTest::javascriptResultToCString(javascriptResult)); >@@ -125,6 +128,14 @@ static void testUserContentManagerInjectedStyleSheet(WebViewTest* test, gconstpo > > removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist); > >+ g_assert(!isStyleSheetInjectedForURLAtPath(test, randomPath, "WebExtensionTestScriptWorld")); >+ styleSheet = webkit_user_style_sheet_new_for_world(kInjectedStyleSheet, WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, WEBKIT_USER_STYLE_LEVEL_USER, "WebExtensionTestScriptWorld", nullptr, nullptr); >+ webkit_user_content_manager_add_style_sheet(test->m_userContentManager.get(), styleSheet); >+ webkit_user_style_sheet_unref(styleSheet); >+ g_assert(isStyleSheetInjectedForURLAtPath(test, randomPath, "WebExtensionTestScriptWorld")); >+ >+ removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist); >+ > fillURLListFromPaths(blacklist, randomPath, 0); > styleSheet = webkit_user_style_sheet_new(kInjectedStyleSheet, WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, WEBKIT_USER_STYLE_LEVEL_USER, nullptr, blacklist); > webkit_user_content_manager_add_style_sheet(test->m_userContentManager.get(), styleSheet); >@@ -168,6 +179,14 @@ static void testUserContentManagerInjectedScript(WebViewTest* test, gconstpointe > > removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist); > >+ g_assert(!isScriptInjectedForURLAtPath(test, randomPath, "WebExtensionTestScriptWorld")); >+ script = webkit_user_script_new_for_world(kInjectedScript, WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_END, "WebExtensionTestScriptWorld", nullptr, nullptr); >+ webkit_user_content_manager_add_script(test->m_userContentManager.get(), script); >+ webkit_user_script_unref(script); >+ g_assert(isScriptInjectedForURLAtPath(test, randomPath, "WebExtensionTestScriptWorld")); >+ >+ removeOldInjectedContentAndResetLists(test->m_userContentManager.get(), whitelist, blacklist); >+ > fillURLListFromPaths(blacklist, randomPath, 0); > script = webkit_user_script_new(kInjectedScript, WEBKIT_USER_CONTENT_INJECT_ALL_FRAMES, WEBKIT_USER_SCRIPT_INJECT_AT_DOCUMENT_END, nullptr, blacklist); > webkit_user_content_manager_add_script(test->m_userContentManager.get(), script); >@@ -209,14 +228,16 @@ public: > webkit_javascript_result_unref(m_userScriptMessage); > } > >- bool registerHandler(const char* handlerName) >+ bool registerHandler(const char* handlerName, const char* worldName = nullptr) > { >- return webkit_user_content_manager_register_script_message_handler(m_userContentManager.get(), handlerName); >+ return worldName ? webkit_user_content_manager_register_script_message_handler_in_world(m_userContentManager.get(), handlerName, worldName) >+ : webkit_user_content_manager_register_script_message_handler(m_userContentManager.get(), handlerName); > } > >- void unregisterHandler(const char* handlerName) >+ void unregisterHandler(const char* handlerName, const char* worldName = nullptr) > { >- webkit_user_content_manager_unregister_script_message_handler(m_userContentManager.get(), handlerName); >+ return worldName ? webkit_user_content_manager_unregister_script_message_handler_in_world(m_userContentManager.get(), handlerName, worldName) >+ : webkit_user_content_manager_unregister_script_message_handler(m_userContentManager.get(), handlerName); > } > > static void scriptMessageReceived(WebKitUserContentManager* userContentManager, WebKitJavascriptResult* jsResult, UserScriptMessageTest* test) >@@ -252,11 +273,14 @@ public: > g_main_loop_quit(test->m_mainLoop); > } > >- WebKitJavascriptResult* postMessageAndWaitUntilReceived(const char* handlerName, const char* javascriptValueAsText) >+ WebKitJavascriptResult* postMessageAndWaitUntilReceived(const char* handlerName, const char* javascriptValueAsText, const char* worldName = nullptr) > { > GUniquePtr<char> javascriptSnippet(g_strdup_printf("window.webkit.messageHandlers.%s.postMessage(%s);", handlerName, javascriptValueAsText)); > m_waitForScriptRun = true; >- webkit_web_view_run_javascript(m_webView, javascriptSnippet.get(), nullptr, reinterpret_cast<GAsyncReadyCallback>(runJavaScriptFinished), this); >+ if (worldName) >+ webkit_web_view_run_javascript_in_world(m_webView, javascriptSnippet.get(), worldName, nullptr, reinterpret_cast<GAsyncReadyCallback>(runJavaScriptFinished), this); >+ else >+ webkit_web_view_run_javascript(m_webView, javascriptSnippet.get(), nullptr, reinterpret_cast<GAsyncReadyCallback>(runJavaScriptFinished), this); > return waitUntilMessageReceived(handlerName); > } > >@@ -331,6 +355,40 @@ static void testUserContentManagerScriptMessageReceived(UserScriptMessageTest* t > test->unregisterHandler("anotherHandler"); > } > >+static void testUserContentManagerScriptMessageInWorldReceived(UserScriptMessageTest* test, gconstpointer) >+{ >+ g_assert(test->registerHandler("msg")); >+ >+ test->loadHtml("<html></html>", nullptr); >+ test->waitUntilLoadFinished(); >+ >+ // Check that the "window.webkit.messageHandlers" namespace doesn't exist in isolated worlds. >+ GUniqueOutPtr<GError> error; >+ WebKitJavascriptResult* javascriptResult = test->runJavaScriptInWorldAndWaitUntilFinished("window.webkit.messageHandlers ? 'y' : 'n';", "WebExtensionTestScriptWorld", &error.outPtr()); >+ g_assert(!javascriptResult); >+ g_assert_error(error.get(), WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED); >+ test->unregisterHandler("msg"); >+ >+ g_assert(test->registerHandler("msg", "WebExtensionTestScriptWorld")); >+ >+ // Check that the "window.webkit.messageHandlers" namespace exists in the world. >+ javascriptResult = test->runJavaScriptInWorldAndWaitUntilFinished("window.webkit.messageHandlers ? 'y' : 'n';", "WebExtensionTestScriptWorld", &error.outPtr()); >+ g_assert(javascriptResult); >+ g_assert(!error.get()); >+ GUniquePtr<char> valueString(WebViewTest::javascriptResultToCString(javascriptResult)); >+ g_assert_cmpstr(valueString.get(), ==, "y"); >+ >+ valueString.reset(WebViewTest::javascriptResultToCString(test->postMessageAndWaitUntilReceived("msg", "'user message'", "WebExtensionTestScriptWorld"))); >+ g_assert_cmpstr(valueString.get(), ==, "user message"); >+ >+ // Post message in nain world should fail. >+ javascriptResult = test->runJavaScriptAndWaitUntilFinished("window.webkit.messageHandlers.msg.postMessage('42');", &error.outPtr()); >+ g_assert(!javascriptResult); >+ g_assert_error(error.get(), WEBKIT_JAVASCRIPT_ERROR, WEBKIT_JAVASCRIPT_ERROR_SCRIPT_FAILED); >+ >+ test->unregisterHandler("msg", "WebExtensionTestScriptWorld"); >+} >+ > #if PLATFORM(GTK) > static void testUserContentManagerScriptMessageFromDOMBindings(UserScriptMessageTest* test, gconstpointer) > { >@@ -362,6 +420,7 @@ void beforeAll() > WebViewTest::add("WebKitUserContentManager", "injected-style-sheet", testUserContentManagerInjectedStyleSheet); > WebViewTest::add("WebKitUserContentManager", "injected-script", testUserContentManagerInjectedScript); > UserScriptMessageTest::add("WebKitUserContentManager", "script-message-received", testUserContentManagerScriptMessageReceived); >+ UserScriptMessageTest::add("WebKitUserContentManager", "script-message-in-world-received", testUserContentManagerScriptMessageInWorldReceived); > #if PLATFORM(GTK) > UserScriptMessageTest::add("WebKitUserContentManager", "script-message-from-dom-bindings", testUserContentManagerScriptMessageFromDOMBindings); > #endif
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Flags:
mcatanzaro
:
review+
Actions:
View
|
Formatted Diff
|
Diff
Attachments on
bug 188883
: 347918