mirror of
https://github.com/microsoft/playwright.git
synced 2025-06-26 21:40:17 +00:00
browser(webkit): ensure user worlds created when attaching to new pages (#765)
This commit is contained in:
parent
f4640d145f
commit
1ad6134a54
@ -1 +1 @@
|
|||||||
1124
|
1125
|
||||||
|
|||||||
@ -2507,7 +2507,7 @@ index a68f84520736977c8b9216616c5a178fbf5275d6..8d6ed7188bca75fb46d1a5963983f088
|
|||||||
|
|
||||||
} // namespace WebCore
|
} // namespace WebCore
|
||||||
diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
||||||
index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eeaafa37089 100644
|
index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..5809b8726af46cf93007b15cad6904506352b26d 100644
|
||||||
--- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
--- a/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
||||||
+++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
+++ b/Source/WebCore/inspector/agents/InspectorPageAgent.cpp
|
||||||
@@ -32,6 +32,8 @@
|
@@ -32,6 +32,8 @@
|
||||||
@ -2535,7 +2535,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
#include "HTMLNames.h"
|
#include "HTMLNames.h"
|
||||||
#include "ImageBuffer.h"
|
#include "ImageBuffer.h"
|
||||||
#include "InspectorClient.h"
|
#include "InspectorClient.h"
|
||||||
@@ -56,18 +61,24 @@
|
@@ -56,19 +61,28 @@
|
||||||
#include "MIMETypeRegistry.h"
|
#include "MIMETypeRegistry.h"
|
||||||
#include "MemoryCache.h"
|
#include "MemoryCache.h"
|
||||||
#include "Page.h"
|
#include "Page.h"
|
||||||
@ -2558,9 +2558,33 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
#include <JavaScriptCore/RegularExpression.h>
|
#include <JavaScriptCore/RegularExpression.h>
|
||||||
+#include <platform/ProcessIdentifier.h>
|
+#include <platform/ProcessIdentifier.h>
|
||||||
#include <wtf/ListHashSet.h>
|
#include <wtf/ListHashSet.h>
|
||||||
|
+#include <wtf/NeverDestroyed.h>
|
||||||
|
+#include <wtf/Ref.h>
|
||||||
|
+#include <wtf/RefPtr.h>
|
||||||
#include <wtf/Stopwatch.h>
|
#include <wtf/Stopwatch.h>
|
||||||
#include <wtf/text/Base64.h>
|
#include <wtf/text/Base64.h>
|
||||||
@@ -340,6 +351,7 @@ InspectorPageAgent::InspectorPageAgent(PageAgentContext& context, InspectorClien
|
#include <wtf/text/StringBuilder.h>
|
||||||
|
@@ -81,7 +95,6 @@
|
||||||
|
#include "LegacyWebArchive.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-
|
||||||
|
namespace WebCore {
|
||||||
|
|
||||||
|
using namespace Inspector;
|
||||||
|
@@ -100,6 +113,11 @@ using namespace Inspector;
|
||||||
|
macro(WebRTCEncryptionEnabled) \
|
||||||
|
macro(WebSecurityEnabled)
|
||||||
|
|
||||||
|
+HashMap<String, Ref<DOMWrapperWorld>>& createdUserWorlds() {
|
||||||
|
+ static NeverDestroyed<HashMap<String, Ref<DOMWrapperWorld>>> nameToWorld;
|
||||||
|
+ return nameToWorld;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
static bool decodeBuffer(const char* buffer, unsigned size, const String& textEncodingName, String* result)
|
||||||
|
{
|
||||||
|
if (buffer) {
|
||||||
|
@@ -340,6 +358,7 @@ InspectorPageAgent::InspectorPageAgent(PageAgentContext& context, InspectorClien
|
||||||
, m_frontendDispatcher(makeUnique<Inspector::PageFrontendDispatcher>(context.frontendRouter))
|
, m_frontendDispatcher(makeUnique<Inspector::PageFrontendDispatcher>(context.frontendRouter))
|
||||||
, m_backendDispatcher(Inspector::PageBackendDispatcher::create(context.backendDispatcher, this))
|
, m_backendDispatcher(Inspector::PageBackendDispatcher::create(context.backendDispatcher, this))
|
||||||
, m_inspectedPage(context.inspectedPage)
|
, m_inspectedPage(context.inspectedPage)
|
||||||
@ -2568,7 +2592,19 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
, m_client(client)
|
, m_client(client)
|
||||||
, m_overlay(overlay)
|
, m_overlay(overlay)
|
||||||
{
|
{
|
||||||
@@ -378,6 +390,8 @@ void InspectorPageAgent::enable(ErrorString& errorString)
|
@@ -373,11 +392,20 @@ void InspectorPageAgent::enable(ErrorString& errorString)
|
||||||
|
#if HAVE(OS_DARK_MODE_SUPPORT)
|
||||||
|
defaultAppearanceDidChange(m_inspectedPage.defaultUseDarkAppearance());
|
||||||
|
#endif
|
||||||
|
+
|
||||||
|
+ if (!createdUserWorlds().isEmpty()) {
|
||||||
|
+ Vector<DOMWrapperWorld*> worlds;
|
||||||
|
+ for (const auto& world : createdUserWorlds().values())
|
||||||
|
+ worlds.append(world.ptr());
|
||||||
|
+ ensureUserWorldsExistInAllFrames(worlds);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
void InspectorPageAgent::disable(ErrorString&)
|
void InspectorPageAgent::disable(ErrorString&)
|
||||||
{
|
{
|
||||||
m_instrumentingAgents.setInspectorPageAgent(nullptr);
|
m_instrumentingAgents.setInspectorPageAgent(nullptr);
|
||||||
@ -2577,7 +2613,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
|
|
||||||
ErrorString unused;
|
ErrorString unused;
|
||||||
setShowPaintRects(unused, false);
|
setShowPaintRects(unused, false);
|
||||||
@@ -415,14 +429,36 @@ void InspectorPageAgent::reload(ErrorString&, const bool* optionalReloadFromOrig
|
@@ -415,14 +443,36 @@ void InspectorPageAgent::reload(ErrorString&, const bool* optionalReloadFromOrig
|
||||||
m_inspectedPage.mainFrame().loader().reload(reloadOptions);
|
m_inspectedPage.mainFrame().loader().reload(reloadOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2603,15 +2639,15 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
+ return;
|
+ return;
|
||||||
+
|
+
|
||||||
+ ResourceRequest resourceRequest { frame->document()->completeURL(url) };
|
+ ResourceRequest resourceRequest { frame->document()->completeURL(url) };
|
||||||
+
|
|
||||||
+ if (!resourceRequest.url().isValid()) {
|
|
||||||
+ errorString = "Cannot navigate to invalid URL"_s;
|
|
||||||
+ return;
|
|
||||||
+ }
|
|
||||||
|
|
||||||
- ResourceRequest resourceRequest { frame.document()->completeURL(url) };
|
- ResourceRequest resourceRequest { frame.document()->completeURL(url) };
|
||||||
- FrameLoadRequest frameLoadRequest { *frame.document(), frame.document()->securityOrigin(), resourceRequest, "_self"_s, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow, InitiatedByMainFrame::Unknown };
|
- FrameLoadRequest frameLoadRequest { *frame.document(), frame.document()->securityOrigin(), resourceRequest, "_self"_s, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow, InitiatedByMainFrame::Unknown };
|
||||||
- frame.loader().changeLocation(WTFMove(frameLoadRequest));
|
- frame.loader().changeLocation(WTFMove(frameLoadRequest));
|
||||||
|
+ if (!resourceRequest.url().isValid()) {
|
||||||
|
+ errorString = "Cannot navigate to invalid URL"_s;
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
+ if (referrer)
|
+ if (referrer)
|
||||||
+ resourceRequest.setInitiatorIdentifier(InspectorNetworkAgent::createInitiatorIdentifierForInspectorNavigation(*referrer));
|
+ resourceRequest.setInitiatorIdentifier(InspectorNetworkAgent::createInitiatorIdentifierForInspectorNavigation(*referrer));
|
||||||
+ FrameLoadRequest frameLoadRequest { *frame->document(), frame->document()->securityOrigin(), resourceRequest, "_self"_s, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow, InitiatedByMainFrame::Unknown };
|
+ FrameLoadRequest frameLoadRequest { *frame->document(), frame->document()->securityOrigin(), resourceRequest, "_self"_s, LockHistory::No, LockBackForwardList::No, MaybeSendReferrer, AllowNavigationToInvalidURL::No, NewFrameOpenerPolicy::Allow, ShouldOpenExternalURLsPolicy::ShouldNotAllow, InitiatedByMainFrame::Unknown };
|
||||||
@ -2619,7 +2655,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InspectorPageAgent::overrideUserAgent(ErrorString&, const String* value)
|
void InspectorPageAgent::overrideUserAgent(ErrorString&, const String* value)
|
||||||
@@ -683,15 +719,16 @@ void InspectorPageAgent::setShowPaintRects(ErrorString&, bool show)
|
@@ -683,15 +733,16 @@ void InspectorPageAgent::setShowPaintRects(ErrorString&, bool show)
|
||||||
m_overlay->setShowPaintRects(show);
|
m_overlay->setShowPaintRects(show);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2641,7 +2677,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
}
|
}
|
||||||
|
|
||||||
void InspectorPageAgent::frameNavigated(Frame& frame)
|
void InspectorPageAgent::frameNavigated(Frame& frame)
|
||||||
@@ -699,13 +736,18 @@ void InspectorPageAgent::frameNavigated(Frame& frame)
|
@@ -699,13 +750,18 @@ void InspectorPageAgent::frameNavigated(Frame& frame)
|
||||||
m_frontendDispatcher->frameNavigated(buildObjectForFrame(&frame));
|
m_frontendDispatcher->frameNavigated(buildObjectForFrame(&frame));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2663,7 +2699,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
}
|
}
|
||||||
|
|
||||||
Frame* InspectorPageAgent::frameForId(const String& frameId)
|
Frame* InspectorPageAgent::frameForId(const String& frameId)
|
||||||
@@ -717,20 +759,18 @@ String InspectorPageAgent::frameId(Frame* frame)
|
@@ -717,20 +773,18 @@ String InspectorPageAgent::frameId(Frame* frame)
|
||||||
{
|
{
|
||||||
if (!frame)
|
if (!frame)
|
||||||
return emptyString();
|
return emptyString();
|
||||||
@ -2690,7 +2726,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
}
|
}
|
||||||
|
|
||||||
Frame* InspectorPageAgent::assertFrame(ErrorString& errorString, const String& frameId)
|
Frame* InspectorPageAgent::assertFrame(ErrorString& errorString, const String& frameId)
|
||||||
@@ -741,11 +781,6 @@ Frame* InspectorPageAgent::assertFrame(ErrorString& errorString, const String& f
|
@@ -741,11 +795,6 @@ Frame* InspectorPageAgent::assertFrame(ErrorString& errorString, const String& f
|
||||||
return frame;
|
return frame;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2702,7 +2738,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
void InspectorPageAgent::frameStartedLoading(Frame& frame)
|
void InspectorPageAgent::frameStartedLoading(Frame& frame)
|
||||||
{
|
{
|
||||||
m_frontendDispatcher->frameStartedLoading(frameId(&frame));
|
m_frontendDispatcher->frameStartedLoading(frameId(&frame));
|
||||||
@@ -766,6 +801,12 @@ void InspectorPageAgent::frameClearedScheduledNavigation(Frame& frame)
|
@@ -766,6 +815,12 @@ void InspectorPageAgent::frameClearedScheduledNavigation(Frame& frame)
|
||||||
m_frontendDispatcher->frameClearedScheduledNavigation(frameId(&frame));
|
m_frontendDispatcher->frameClearedScheduledNavigation(frameId(&frame));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2715,7 +2751,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
void InspectorPageAgent::defaultAppearanceDidChange(bool useDarkAppearance)
|
void InspectorPageAgent::defaultAppearanceDidChange(bool useDarkAppearance)
|
||||||
{
|
{
|
||||||
m_frontendDispatcher->defaultAppearanceDidChange(useDarkAppearance ? Inspector::Protocol::Page::Appearance::Dark : Inspector::Protocol::Page::Appearance::Light);
|
m_frontendDispatcher->defaultAppearanceDidChange(useDarkAppearance ? Inspector::Protocol::Page::Appearance::Dark : Inspector::Protocol::Page::Appearance::Light);
|
||||||
@@ -823,6 +864,38 @@ void InspectorPageAgent::didRecalculateStyle()
|
@@ -823,6 +878,38 @@ void InspectorPageAgent::didRecalculateStyle()
|
||||||
m_overlay->update();
|
m_overlay->update();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2754,7 +2790,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
Ref<Inspector::Protocol::Page::Frame> InspectorPageAgent::buildObjectForFrame(Frame* frame)
|
Ref<Inspector::Protocol::Page::Frame> InspectorPageAgent::buildObjectForFrame(Frame* frame)
|
||||||
{
|
{
|
||||||
ASSERT_ARG(frame, frame);
|
ASSERT_ARG(frame, frame);
|
||||||
@@ -966,6 +1039,18 @@ void InspectorPageAgent::snapshotRect(ErrorString& errorString, int x, int y, in
|
@@ -966,6 +1053,18 @@ void InspectorPageAgent::snapshotRect(ErrorString& errorString, int x, int y, in
|
||||||
*outDataURL = snapshot->toDataURL("image/png"_s, WTF::nullopt, PreserveResolution::Yes);
|
*outDataURL = snapshot->toDataURL("image/png"_s, WTF::nullopt, PreserveResolution::Yes);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2773,7 +2809,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
void InspectorPageAgent::archive(ErrorString& errorString, String* data)
|
void InspectorPageAgent::archive(ErrorString& errorString, String* data)
|
||||||
{
|
{
|
||||||
#if ENABLE(WEB_ARCHIVE) && USE(CF)
|
#if ENABLE(WEB_ARCHIVE) && USE(CF)
|
||||||
@@ -983,4 +1068,514 @@ void InspectorPageAgent::archive(ErrorString& errorString, String* data)
|
@@ -983,4 +1082,520 @@ void InspectorPageAgent::archive(ErrorString& errorString, String* data)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3265,16 +3301,22 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
+
|
+
|
||||||
+void InspectorPageAgent::createUserWorld(ErrorString& errorString, const String& name)
|
+void InspectorPageAgent::createUserWorld(ErrorString& errorString, const String& name)
|
||||||
+{
|
+{
|
||||||
+ static NeverDestroyed<HashSet<String>> createdUserWorlds;
|
+ if (createdUserWorlds().contains(name)) {
|
||||||
+ if (createdUserWorlds->contains(name)) {
|
|
||||||
+ errorString = "World with the given name already exists"_s;
|
+ errorString = "World with the given name already exists"_s;
|
||||||
+ return;
|
+ return;
|
||||||
+ }
|
+ }
|
||||||
+ createdUserWorlds->add(name);
|
|
||||||
+
|
+
|
||||||
+ Ref<DOMWrapperWorld> world = ScriptController::createWorld(name, ScriptController::WorldType::User);
|
+ Ref<DOMWrapperWorld> world = ScriptController::createWorld(name, ScriptController::WorldType::User);
|
||||||
+ for (Frame* frame = &m_inspectedPage.mainFrame(); frame; frame = frame->tree().traverseNext())
|
+ ensureUserWorldsExistInAllFrames({world.ptr()});
|
||||||
+ frame->windowProxy().jsWindowProxy(world)->window();
|
+ createdUserWorlds().set(name, WTFMove(world));
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void InspectorPageAgent::ensureUserWorldsExistInAllFrames(const Vector<DOMWrapperWorld*>& worlds)
|
||||||
|
+{
|
||||||
|
+ for (Frame* frame = &m_inspectedPage.mainFrame(); frame; frame = frame->tree().traverseNext()) {
|
||||||
|
+ for (auto* world : worlds)
|
||||||
|
+ frame->windowProxy().jsWindowProxy(*world)->window();
|
||||||
|
+ }
|
||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+void InspectorPageAgent::setBypassCSP(ErrorString&, bool enabled)
|
+void InspectorPageAgent::setBypassCSP(ErrorString&, bool enabled)
|
||||||
@ -3289,7 +3331,7 @@ index d678cddbd20a1a2b410a8ebbb17f5f63f0fc620d..4732b818204dc5a7e00d38b6635d9eea
|
|||||||
+
|
+
|
||||||
} // namespace WebCore
|
} // namespace WebCore
|
||||||
diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.h b/Source/WebCore/inspector/agents/InspectorPageAgent.h
|
diff --git a/Source/WebCore/inspector/agents/InspectorPageAgent.h b/Source/WebCore/inspector/agents/InspectorPageAgent.h
|
||||||
index 110173dbbfe819226b6c4caa0f65a5dee8c39f2b..8cbb35194cfd408e934400ed1e3abd7b1dcd3949 100644
|
index 110173dbbfe819226b6c4caa0f65a5dee8c39f2b..cba0b43011a390c305aef7c01cc95e5350766283 100644
|
||||||
--- a/Source/WebCore/inspector/agents/InspectorPageAgent.h
|
--- a/Source/WebCore/inspector/agents/InspectorPageAgent.h
|
||||||
+++ b/Source/WebCore/inspector/agents/InspectorPageAgent.h
|
+++ b/Source/WebCore/inspector/agents/InspectorPageAgent.h
|
||||||
@@ -40,11 +40,16 @@
|
@@ -40,11 +40,16 @@
|
||||||
@ -3363,7 +3405,15 @@ index 110173dbbfe819226b6c4caa0f65a5dee8c39f2b..8cbb35194cfd408e934400ed1e3abd7b
|
|||||||
|
|
||||||
Frame* frameForId(const String& frameId);
|
Frame* frameForId(const String& frameId);
|
||||||
WEBCORE_EXPORT String frameId(Frame*);
|
WEBCORE_EXPORT String frameId(Frame*);
|
||||||
@@ -152,18 +170,19 @@ private:
|
@@ -141,6 +159,7 @@ public:
|
||||||
|
|
||||||
|
private:
|
||||||
|
double timestamp();
|
||||||
|
+ void ensureUserWorldsExistInAllFrames(const Vector<DOMWrapperWorld*>&);
|
||||||
|
|
||||||
|
static bool mainResourceContent(Frame*, bool withBase64Encode, String* result);
|
||||||
|
static bool dataContent(const char* data, unsigned size, const String& textEncodingName, bool withBase64Encode, String* result);
|
||||||
|
@@ -152,18 +171,19 @@ private:
|
||||||
RefPtr<Inspector::PageBackendDispatcher> m_backendDispatcher;
|
RefPtr<Inspector::PageBackendDispatcher> m_backendDispatcher;
|
||||||
|
|
||||||
Page& m_inspectedPage;
|
Page& m_inspectedPage;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user