browser(webkit): simplify isolated world handling (#766)
This commit is contained in:
parent
2b231c9e1b
commit
6c58f93416
|
|
@ -1 +1 @@
|
||||||
1125
|
1126
|
||||||
|
|
|
||||||
|
|
@ -3539,7 +3539,7 @@ index 5bc523a07233d6efab4ee18d19a6b8f105274664..d640783477744da05c5baed94dc0c168
|
||||||
DocumentWriter& writer() const { return m_writer; }
|
DocumentWriter& writer() const { return m_writer; }
|
||||||
|
|
||||||
diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp
|
diff --git a/Source/WebCore/loader/FrameLoader.cpp b/Source/WebCore/loader/FrameLoader.cpp
|
||||||
index a1285851f259d82a63a86de58c53de3e3b02d914..b2493d7629504bd11594fb7107a2b8b8acfe3e1c 100644
|
index a1285851f259d82a63a86de58c53de3e3b02d914..9b090e501f3212e8522ee77e8aa7fdae521793c1 100644
|
||||||
--- a/Source/WebCore/loader/FrameLoader.cpp
|
--- a/Source/WebCore/loader/FrameLoader.cpp
|
||||||
+++ b/Source/WebCore/loader/FrameLoader.cpp
|
+++ b/Source/WebCore/loader/FrameLoader.cpp
|
||||||
@@ -1180,6 +1180,7 @@ void FrameLoader::loadInSameDocument(const URL& url, SerializedScriptValue* stat
|
@@ -1180,6 +1180,7 @@ void FrameLoader::loadInSameDocument(const URL& url, SerializedScriptValue* stat
|
||||||
|
|
@ -3577,37 +3577,35 @@ index a1285851f259d82a63a86de58c53de3e3b02d914..b2493d7629504bd11594fb7107a2b8b8
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue)
|
void FrameLoader::continueFragmentScrollAfterNavigationPolicy(const ResourceRequest& request, bool shouldContinue)
|
||||||
@@ -3946,24 +3953,30 @@ String FrameLoader::referrer() const
|
@@ -3946,24 +3953,29 @@ String FrameLoader::referrer() const
|
||||||
|
|
||||||
void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds()
|
void FrameLoader::dispatchDidClearWindowObjectsInAllWorlds()
|
||||||
{
|
{
|
||||||
- if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript))
|
- if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript))
|
||||||
- return;
|
- return;
|
||||||
-
|
+ // It is essential that the normal world is cleared first.
|
||||||
|
+ // Various subsystem (InjectedScriptManager) will reset state upon normal
|
||||||
|
+ // world initialization.
|
||||||
|
+ DOMWrapperWorld& mainWorld = mainThreadNormalWorld();
|
||||||
|
+ dispatchDidClearWindowObjectInWorld(mainWorld);
|
||||||
|
|
||||||
Vector<Ref<DOMWrapperWorld>> worlds;
|
Vector<Ref<DOMWrapperWorld>> worlds;
|
||||||
ScriptController::getAllWorlds(worlds);
|
ScriptController::getAllWorlds(worlds);
|
||||||
- for (auto& world : worlds)
|
- for (auto& world : worlds)
|
||||||
- dispatchDidClearWindowObjectInWorld(world);
|
- dispatchDidClearWindowObjectInWorld(world);
|
||||||
+ // It is essential that the normal world is cleared first.
|
|
||||||
+ // Various subsystem (InjectedScriptManager) will reset state upon normal
|
|
||||||
+ // world initialization.
|
|
||||||
+ Vector<DOMWrapperWorld*> nonNormalWorlds;
|
|
||||||
+ for (auto& world : worlds) {
|
+ for (auto& world : worlds) {
|
||||||
+ if (world->type() == DOMWrapperWorld::Type::Normal)
|
+ if (world.ptr() != &mainWorld)
|
||||||
+ dispatchDidClearWindowObjectInWorld(world);
|
+ dispatchDidClearWindowObjectInWorld(world);
|
||||||
+ else
|
|
||||||
+ nonNormalWorlds.append(&world.get());
|
|
||||||
+ }
|
+ }
|
||||||
+ for (auto* world : nonNormalWorlds)
|
|
||||||
+ dispatchDidClearWindowObjectInWorld(*world);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world)
|
void FrameLoader::dispatchDidClearWindowObjectInWorld(DOMWrapperWorld& world)
|
||||||
{
|
{
|
||||||
- if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript) || !m_frame.windowProxy().existingJSWindowProxy(world))
|
- if (!m_frame.script().canExecuteScripts(NotAboutToExecuteScript) || !m_frame.windowProxy().existingJSWindowProxy(world))
|
||||||
- return;
|
- return;
|
||||||
+ if (m_frame.script().canExecuteScripts(NotAboutToExecuteScript) && m_frame.windowProxy().existingJSWindowProxy(world)) {
|
+ if (m_frame.windowProxy().existingJSWindowProxy(world)) {
|
||||||
+ m_client.dispatchDidClearWindowObjectInWorld(world);
|
+ if (m_frame.script().canExecuteScripts(NotAboutToExecuteScript))
|
||||||
|
+ m_client.dispatchDidClearWindowObjectInWorld(world);
|
||||||
|
|
||||||
- m_client.dispatchDidClearWindowObjectInWorld(world);
|
- m_client.dispatchDidClearWindowObjectInWorld(world);
|
||||||
-
|
-
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue