From 86982ad05d4301961c02d53a2b40a1d69ff461c4 Mon Sep 17 00:00:00 2001 From: "caii.xu@qq.com" Date: Thu, 19 Dec 2024 11:49:36 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8C=91=E5=8D=95=EF=BC=9A1=20generate=20reque?= =?UTF-8?q?st=20id=20for=20preflight=20requets.=EF=BC=9Ahttps://gitee.com/?= =?UTF-8?q?openharmony-tpc/chromium=5Fsrc/pulls/1613/files=202=EF=BC=9Afix?= =?UTF-8?q?=20crash=20for=20create=20urlloader=20on=20UI=20Thread=EF=BC=9A?= =?UTF-8?q?https://gitee.com/openharmony-tpc/chromium=5Fsrc/pulls/1892?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: caii.xu@qq.com --- .../src/cef_delegate/nweb_handler_delegate.cc | 96 +++++++++++++++++-- .../src/cef_delegate/nweb_handler_delegate.h | 8 ++ services/network/cors/preflight_controller.cc | 31 +++++- 3 files changed, 128 insertions(+), 7 deletions(-) diff --git a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc index c1226b2c85..13f0287ccb 100644 --- a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc +++ b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.cc @@ -27,6 +27,9 @@ #include "cef/include/wrapper/cef_closure_task.h" #include "cef/include/wrapper/cef_helpers.h" #include "content/public/browser/browser_thread.h" +#include "net/base/net_errors.h" +#include "net/cookies/site_for_cookies.h" +#include "net/cookies/static_cookie_policy.h" #include "nweb_access_request_delegate.h" #include "nweb_context_menu_params_impl.h" #include "nweb_controller_handler_impl.h" @@ -58,6 +61,7 @@ #include "nweb_url_resource_response_impl.h" #include "nweb_value_callback.h" #include "nweb_value_convert.h" +#include "url/gurl.h" #include "ohos_adapter_helper.h" @@ -1750,6 +1754,45 @@ CefRefPtr NWebHandlerDelegate::GetResourceHandler( return nullptr; } } + +void NWebHandlerDelegate::GetResourceHandlerByIO( + CefRefPtr browser, + CefRefPtr frame, + CefRefPtr request, + CefRefPtr callback, + CefRefPtr scheme_factory, + const CefString& scheme) { + if (!content::BrowserThread::CurrentlyOn(content::BrowserThread::UI)) { + content::GetUIThreadTaskRunner({})->PostTask(FROM_HERE, + base::BindOnce(&NWebHandlerDelegate::GetResourceHandlerByIO, + this, browser, frame, request, callback, + scheme_factory, scheme)); + return; + } + if (!request) { + LOG(ERROR) << "NWebHandlerDelegate::GetResourceHandlerByIO request is null"; + return; + } + CefRequest::HeaderMap cef_request_headers; + request->GetHeaderMap(cef_request_headers); + std::map request_headers; + ConvertMapToHeaderMap(cef_request_headers, request_headers); + std::shared_ptr nweb_request = + std::make_shared( + request->GetMethod().ToString(), request_headers, + request->GetURL().ToString(), false, request->IsMainFrame()); + std::shared_ptr response = + std::make_shared(); + CefRefPtr resource_handler = nullptr; + if (nweb_handler_->OnHandleInterceptRequest(nweb_request, response)) { + std::string tag = ""; + resource_handler = new NWebResourceHandler(response, tag); + } else if (scheme_factory) { + // here to get ets schemeHandler + resource_handler = scheme_factory->Create(browser, frame, scheme, request); + } + callback->ContinueLoad(resource_handler); +} /* CefResourceRequestHandler method end */ /* CefPrintHandler method begin */ @@ -2765,22 +2808,63 @@ void NWebHandlerDelegate::OnFindResult(CefRefPtr browser, /* CefResourceRequestHandler methods begin */ +bool AllowCookies( + const GURL& url, + const net::SiteForCookies& site_for_cookies, + bool block_all_cookies, + bool block_thirdparty_cookies) { + net::StaticCookiePolicy::Type policy = + net::StaticCookiePolicy::ALLOW_ALL_COOKIES; + if (block_all_cookies) { + policy = net::StaticCookiePolicy::BLOCK_ALL_COOKIES; + } else if (block_thirdparty_cookies) { + policy = net::StaticCookiePolicy::BLOCK_ALL_THIRD_PARTY_COOKIES; + } else { + return true; + } + return net::StaticCookiePolicy(policy).CanAccessCookies( + url, site_for_cookies) == net::OK; +} + bool NWebHandlerDelegate::CanSendCookie(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, const CefCookie& cookie) { - return NWebEngineImpl::GetInstance() - ->GetCookieManager() - ->IsAcceptCookieAllowed(); + auto cookie_manager = NWebEngineImpl::GetInstance()->GetCookieManager(); + bool block_all_cookies = !cookie_manager->IsAcceptCookieAllowed(); + bool block_thirdparty_cookies = !cookie_manager->IsThirdPartyCookieAllowed(); + bool allow_cookies = AllowCookies(GURL(request->GetURL().ToString()), + net::SiteForCookies::FromUrl( + GURL(request->GetFirstPartyForCookies().ToString())), + block_all_cookies, block_thirdparty_cookies); + LOG(INFO) << "CanSendCookie allow_cookies: " << allow_cookies + << " block_all_cookies:" << block_all_cookies + << " block_thirdparty_cookies:" << block_thirdparty_cookies + << " url: " << request->GetURL().ToString() + << " site_for_cookies: " << request->GetFirstPartyForCookies().ToString(); + + return allow_cookies; } bool NWebHandlerDelegate::CanSaveCookie(CefRefPtr browser, CefRefPtr frame, CefRefPtr request, CefRefPtr response, const CefCookie& cookie) { - return NWebEngineImpl::GetInstance() - ->GetCookieManager() - ->IsAcceptCookieAllowed(); + auto cookie_manager = NWebEngineImpl::GetInstance()->GetCookieManager(); + bool block_all_cookies = !cookie_manager->IsAcceptCookieAllowed(); + bool block_thirdparty_cookies = !cookie_manager->IsThirdPartyCookieAllowed(); + bool allow_cookies = AllowCookies(GURL(request->GetURL().ToString()), + net::SiteForCookies::FromUrl( + GURL(request->GetFirstPartyForCookies().ToString())), + block_all_cookies, + block_thirdparty_cookies); + LOG(INFO) << " CanSendCookie allow_cookies: " << allow_cookies + << " block_all_cookies:" << block_all_cookies + << " block_thirdparty_cookies:" << block_thirdparty_cookies + << " url: " << request->GetURL().ToString() + << " site_for_cookies: " << request->GetFirstPartyForCookies().ToString(); + + return allow_cookies; } /* CefResourceRequestHandler methods end */ diff --git a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h index ec185ded62..b600c40d04 100644 --- a/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h +++ b/ohos_nweb/src/cef_delegate/nweb_handler_delegate.h @@ -404,6 +404,14 @@ class NWebHandlerDelegate : public CefClient, CefRefPtr browser, CefRefPtr frame, CefRefPtr request) override; + + void GetResourceHandlerByIO( + CefRefPtr browser, + CefRefPtr frame, + CefRefPtr request, + CefRefPtr callback, + CefRefPtr scheme_factory, + const CefString& scheme) override; /* CefResourceRequestHandler method end */ /* CefMediaHandler methods begin */ diff --git a/services/network/cors/preflight_controller.cc b/services/network/cors/preflight_controller.cc index 9d658d2e97..b25d2ef02a 100644 --- a/services/network/cors/preflight_controller.cc +++ b/services/network/cors/preflight_controller.cc @@ -39,10 +39,36 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" +#include "base/rand_util.h" +#include "base/atomic_sequence_num.h" + namespace network::cors { namespace { +#if BUILDFLAG(IS_OHOS) +int GetInitialRequestID() { + // Starting with a random number speculatively avoids RDH_INVALID_REQUEST_ID + // which are assumed to have been caused by restarting RequestID at 0 when + // restarting a renderer after a crash - this would cause collisions if + // requests from the previously crashed renderer are still active. See + // https://crbug.com/614281#c61 for more details about this hypothesis. + // + // To avoid increasing the likelihood of overflowing the range of available + // RequestIDs, kMax is set to a relatively low value of 2^20 (rather than + // to something higher like 2^31). + const int kMin = 1 << 20; + const int kMax = 1 << 28; + return base::RandInt(kMin + 1, kMax); +} + +int GenerateRequestId() { + static const int kInitialRequestID = GetInitialRequestID(); + static base::AtomicSequenceNumber sequence; + return kInitialRequestID + sequence.GetNext(); +} +#endif + const char kLowerCaseTrue[] = "true"; int RetrieveCacheFlags(int load_flags) { @@ -412,9 +438,12 @@ class PreflightController::PreflightLoader final { } loader_ = SimpleURLLoader::Create(std::move(preflight_request), annotation_tag); +#if BUILDFLAG(IS_OHOS) + loader_->SetRequestID(GenerateRequestId()); +#endif uint32_t options = mojom::kURLLoadOptionAsCorsPreflight; if (with_trusted_header_client) { - options |= mojom::kURLLoadOptionUseHeaderClient; + options |= mojom::kURLLoadOptionUseHeaderClient; } loader_->SetURLLoaderFactoryOptions(options); -- Gitee