From 70f3d96d629050da14a3054515619ec2618f9398 Mon Sep 17 00:00:00 2001 From: zhangxin11112342 Date: Tue, 6 Aug 2024 16:28:49 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DCVE-2024-6778?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangxin11112342 --- blink/renderer/core/inspector/build.gni | 1 + .../core/inspector/inspector_page_agent.cc | 66 +++++++++++++++---- .../core/inspector/inspector_page_agent.h | 19 +++++- .../inspector_page_agent_unittest.cc | 58 ++++++++++++++++ 4 files changed, 131 insertions(+), 13 deletions(-) create mode 100644 blink/renderer/core/inspector/inspector_page_agent_unittest.cc diff --git a/blink/renderer/core/inspector/build.gni b/blink/renderer/core/inspector/build.gni index 084a3b190..3c6cc482c 100644 --- a/blink/renderer/core/inspector/build.gni +++ b/blink/renderer/core/inspector/build.gni @@ -136,6 +136,7 @@ blink_core_tests_inspector = [ "inspector_emulation_agent_test.cc", "inspector_highlight_test.cc", "inspector_history_test.cc", + "inspector_page_agent_unittest.cc", "inspector_media_context_impl_unittest.cc", "inspector_session_state_test.cc", "inspector_style_resolver_test.cc", diff --git a/blink/renderer/core/inspector/inspector_page_agent.cc b/blink/renderer/core/inspector/inspector_page_agent.cc index 8f4b06c58..41911fc23 100644 --- a/blink/renderer/core/inspector/inspector_page_agent.cc +++ b/blink/renderer/core/inspector/inspector_page_agent.cc @@ -480,6 +480,42 @@ String InspectorPageAgent::CachedResourceTypeJson( return ResourceTypeJson(ToResourceType(cached_resource.GetType())); } +InspectorPageAgent::PageReloadScriptInjection::PageReloadScriptInjection( + InspectorAgentState& agent_state) + : pending_script_to_evaluate_on_load_once_(&agent_state, + /*default_value=*/{}), + target_url_for_pending_script_(&agent_state, + /*default_value=*/{}) {} + +void InspectorPageAgent::PageReloadScriptInjection::clear() { + script_to_evaluate_on_load_once_ = {}; + pending_script_to_evaluate_on_load_once_.Set({}); + target_url_for_pending_script_.Set({}); +} + +void InspectorPageAgent::PageReloadScriptInjection::SetPending( + String script, + const KURL& target_url) { + pending_script_to_evaluate_on_load_once_.Set(script); + target_url_for_pending_script_.Set(target_url.GetString()); +} + +void InspectorPageAgent::PageReloadScriptInjection::PromoteToLoadOnce() { + script_to_evaluate_on_load_once_ = + pending_script_to_evaluate_on_load_once_.Get(); + target_url_for_active_script_ = target_url_for_pending_script_.Get(); + pending_script_to_evaluate_on_load_once_.Set({}); + target_url_for_pending_script_.Set({}); +} + +String InspectorPageAgent::PageReloadScriptInjection::GetScriptForInjection( + const KURL& target_url) { + if (target_url_for_active_script_ == target_url.GetString()) { + return script_to_evaluate_on_load_once_; + } + return {}; +} + InspectorPageAgent::InspectorPageAgent( InspectedFrames* inspected_frames, Client* client, @@ -505,7 +541,8 @@ InspectorPageAgent::InspectorPageAgent( /*default_value=*/false), standard_font_size_(&agent_state_, /*default_value=*/0), fixed_font_size_(&agent_state_, /*default_value=*/0), - script_font_families_cbor_(&agent_state_, std::vector()) {} + script_font_families_cbor_(&agent_state_, std::vector()), + script_injection_on_load_(agent_state_) {} void InspectorPageAgent::Restore() { if (enabled_.Get()) @@ -544,8 +581,7 @@ protocol::Response InspectorPageAgent::enable() { protocol::Response InspectorPageAgent::disable() { agent_state_.ClearAllFields(); pending_isolated_worlds_.clear(); - script_to_evaluate_on_load_once_ = String(); - pending_script_to_evaluate_on_load_once_ = String(); + script_injection_on_load_.clear(); instrumenting_agents_->RemoveInspectorPageAgent(this); inspector_resource_content_loader_->Cancel( resource_content_loader_client_id_); @@ -668,8 +704,9 @@ protocol::Response InspectorPageAgent::setAdBlockingEnabled(bool enable) { protocol::Response InspectorPageAgent::reload( Maybe optional_bypass_cache, Maybe optional_script_to_evaluate_on_load) { - pending_script_to_evaluate_on_load_once_ = - optional_script_to_evaluate_on_load.fromMaybe(""); + script_injection_on_load_.SetPending( + optional_script_to_evaluate_on_load.fromMaybe(""), + inspected_frames_->Root()->Loader().GetDocumentLoader()->Url()); v8_session_->setSkipAllPauses(true); return protocol::Response::Success(); } @@ -984,11 +1021,19 @@ void InspectorPageAgent::DidCreateMainWorldContext(LocalFrame* frame) { EvaluateScriptOnNewDocument(*frame, key); } - if (!script_to_evaluate_on_load_once_.empty()) { - ClassicScript::CreateUnspecifiedScript(script_to_evaluate_on_load_once_) - ->RunScript(frame->DomWindow(), - ExecuteScriptPolicy::kExecuteScriptWhenScriptsDisabled); + String script = script_injection_on_load_.GetScriptForInjection( + frame->Loader().GetDocumentLoader()->Url()); + if (script.empty()) { + return; } + ScriptState* script_state = ToScriptStateForMainWorld(frame); + if (!script_state) { + return; + } + + ClassicScript::CreateUnspecifiedScript(script)->RunScript( + frame->DomWindow(), + ExecuteScriptPolicy::kExecuteScriptWhenScriptsDisabled); } void InspectorPageAgent::EvaluateScriptOnNewDocument( @@ -1050,8 +1095,7 @@ void InspectorPageAgent::LoadEventFired(LocalFrame* frame) { void InspectorPageAgent::WillCommitLoad(LocalFrame*, DocumentLoader* loader) { if (loader->GetFrame() == inspected_frames_->Root()) { - script_to_evaluate_on_load_once_ = pending_script_to_evaluate_on_load_once_; - pending_script_to_evaluate_on_load_once_ = String(); + script_injection_on_load_.PromoteToLoadOnce(); } GetFrontend()->frameNavigated(BuildObjectForFrame(loader->GetFrame()), protocol::Page::NavigationTypeEnum::Navigation); diff --git a/blink/renderer/core/inspector/inspector_page_agent.h b/blink/renderer/core/inspector/inspector_page_agent.h index a1c17c7c1..3825fdb07 100644 --- a/blink/renderer/core/inspector/inspector_page_agent.h +++ b/blink/renderer/core/inspector/inspector_page_agent.h @@ -93,6 +93,22 @@ class CORE_EXPORT InspectorPageAgent final kOtherResource }; + class CORE_EXPORT PageReloadScriptInjection { + private: + String script_to_evaluate_on_load_once_; + String target_url_for_active_script_; + InspectorAgentState::String pending_script_to_evaluate_on_load_once_; + InspectorAgentState::String target_url_for_pending_script_; + + public: + explicit PageReloadScriptInjection(InspectorAgentState&); + + void clear(); + void SetPending(String script, const KURL& target_url); + void PromoteToLoadOnce(); + String GetScriptForInjection(const KURL& target_url); + }; + static bool CachedResourceContent(const Resource*, String* result, bool* base64_encoded); @@ -306,8 +322,6 @@ class CORE_EXPORT InspectorPageAgent final ad_script_identifiers_; v8_inspector::V8InspectorSession* v8_session_; Client* client_; - String pending_script_to_evaluate_on_load_once_; - String script_to_evaluate_on_load_once_; Member inspector_resource_content_loader_; int resource_content_loader_client_id_; InspectorAgentState::Boolean intercept_file_chooser_; @@ -322,6 +336,7 @@ class CORE_EXPORT InspectorPageAgent final InspectorAgentState::Integer standard_font_size_; InspectorAgentState::Integer fixed_font_size_; InspectorAgentState::Bytes script_font_families_cbor_; + PageReloadScriptInjection script_injection_on_load_; }; } // namespace blink diff --git a/blink/renderer/core/inspector/inspector_page_agent_unittest.cc b/blink/renderer/core/inspector/inspector_page_agent_unittest.cc new file mode 100644 index 000000000..5f115c22c --- /dev/null +++ b/blink/renderer/core/inspector/inspector_page_agent_unittest.cc @@ -0,0 +1,58 @@ +// Copyright 2024 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/core/inspector/inspector_page_agent.h" + +#include "testing/gtest/include/gtest/gtest.h" +#include "third_party/blink/renderer/core/inspector/inspector_session_state.h" +#include "third_party/blink/renderer/platform/weborigin/kurl.h" + +class PageReloadScriptInjectionTest : public testing::Test { + protected: + blink::mojom::blink::DevToolsSessionStatePtr session_state_cookie_; + blink::InspectorAgentState agent_state_; + blink::InspectorPageAgent::PageReloadScriptInjection injection_; + blink::InspectorSessionState state_; + + public: + PageReloadScriptInjectionTest() + : agent_state_("page"), + injection_(agent_state_), + state_(session_state_cookie_.Clone()) {} + + void SetUp() override { agent_state_.InitFrom(&state_); } +}; + +TEST_F(PageReloadScriptInjectionTest, PromotesScript) { + blink::KURL url("http://example.com"); + injection_.SetPending("script", url); + ASSERT_TRUE(injection_.GetScriptForInjection(url).empty()); + injection_.PromoteToLoadOnce(); + ASSERT_EQ(injection_.GetScriptForInjection(url), "script"); + injection_.PromoteToLoadOnce(); + ASSERT_TRUE(injection_.GetScriptForInjection(url).empty()); +} + +TEST_F(PageReloadScriptInjectionTest, ClearsScript) { + blink::KURL url("http://example.com"); + injection_.SetPending("script", url); + injection_.clear(); + injection_.PromoteToLoadOnce(); + ASSERT_TRUE(injection_.GetScriptForInjection(url).empty()); + + injection_.SetPending("script", url); + injection_.PromoteToLoadOnce(); + ASSERT_EQ(injection_.GetScriptForInjection(url), "script"); + injection_.clear(); + ASSERT_TRUE(injection_.GetScriptForInjection(url).empty()); +} + +TEST_F(PageReloadScriptInjectionTest, ChecksLoaderId) { + blink::KURL url("http://example.com"); + blink::KURL url2("about:blank"); + injection_.SetPending("script", url); + injection_.PromoteToLoadOnce(); + ASSERT_TRUE(injection_.GetScriptForInjection(url2).empty()); +} + -- Gitee