[M108 Migration][VD] Support Hbbtv for CORS from XMLHttpRequest. 75/289575/3
authorfr.fang <fr.fang@samsung.com>
Fri, 10 Mar 2023 01:14:17 +0000 (09:14 +0800)
committerBot Blink <blinkbot@samsung.com>
Mon, 13 Mar 2023 06:47:41 +0000 (06:47 +0000)
This patch support HBBTV CORS from XMLHttpRequest to set the request
header 'origin' to 'hbbtv-carousel://'.

References:
https://review.tizen.org/gerrit/283376

Change-Id: Iba6eb21d66aec06e298c5b790c6dc481ccbf3d1d
Signed-off-by: fr.fang <fr.fang@samsung.com>
services/network/cors/cors_url_loader.cc
third_party/blink/renderer/core/xmlhttprequest/xml_http_request.cc

index a6ce8fe..11d1b2b 100644 (file)
@@ -36,6 +36,9 @@
 #include "services/network/url_loader_factory.h"
 #include "url/scheme_host_port.h"
 #include "url/url_util.h"
+#if BUILDFLAG(IS_TIZEN_TV)
+#include "url/url_constants.h"
+#endif
 
 namespace network::cors {
 
@@ -244,6 +247,18 @@ void RecordNetworkLoaderCompletionTime(const char* suffix,
 
 constexpr const char kTimingAllowOrigin[] = "Timing-Allow-Origin";
 
+#if BUILDFLAG(IS_TIZEN_TV)
+void IgnoreHbbtvCarouselRequestHeader(ResourceRequest& request,
+                                      const base::StringPiece& value) {
+  std::string origin_string;
+  bool has_origin = request.headers.GetHeader("Origin", &origin_string) &&
+                    origin_string != "null";
+  if (!has_origin ||
+      std::string::npos == origin_string.find(url::kHbbTVCarouselScheme))
+    request.headers.SetHeader(net::HttpRequestHeaders::kOrigin, value);
+}
+#endif
+
 class EmptyResolveHostClient : ResolveHostClientBase {
  public:
   EmptyResolveHostClient(const GURL& url,
@@ -732,11 +747,20 @@ void CorsURLLoader::StartRequest() {
        (request_.method != net::HttpRequestHeaders::kGetMethod &&
         request_.method != net::HttpRequestHeaders::kHeadMethod))) {
     if (tainted_) {
+#if BUILDFLAG(IS_TIZEN_TV)
+      IgnoreHbbtvCarouselRequestHeader(request_, url::Origin().Serialize());
+#else
       request_.headers.SetHeader(net::HttpRequestHeaders::kOrigin,
                                  url::Origin().Serialize());
+#endif
     } else {
+#if BUILDFLAG(IS_TIZEN_TV)
+      IgnoreHbbtvCarouselRequestHeader(request_,
+                                       request_.request_initiator->Serialize());
+#else
       request_.headers.SetHeader(net::HttpRequestHeaders::kOrigin,
                                  request_.request_initiator->Serialize());
+#endif
     }
   }
 
index 6185b12..166010c 100644 (file)
 #include "third_party/blink/renderer/platform/wtf/shared_buffer.h"
 #include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
 #include "third_party/blink/renderer/platform/wtf/text/string_builder.h"
+#if BUILDFLAG(IS_TIZEN_TV)
+#include "third_party/blink/public/platform/web_application_type.h"
+#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"
+#include "url/gurl.h"
+#include "url/url_constants.h"
+#include "v8/include/v8.h"
+#endif
 
 namespace blink {
 
@@ -1068,6 +1075,27 @@ void XMLHttpRequest::CreateRequest(scoped_refptr<EncodedFormData> http_body,
     request.SetHttpBody(std::move(http_body));
   }
 
+#if BUILDFLAG(IS_TIZEN_TV)
+  if (IsHbbTV()) {
+    v8::Isolate* isolate = v8::Isolate::GetCurrent();
+    if (isolate) {
+      String set_origin;
+
+      uint32_t number = isolate->GetNumberOfDataSlots();
+      for (uint32_t index = 0; index < number; index++) {
+        set_origin = (const char*)isolate->GetData(index);
+        if (!set_origin.empty() &&
+            set_origin.StartsWith(url::kHbbTVCarouselScheme)) {
+          if (request_headers_.Contains(AtomicString("Origin")))
+            request_headers_.Remove(AtomicString("Origin"));
+          request_headers_.Set(AtomicString("Origin"),
+                               AtomicString(set_origin.Utf8().data()));
+        }
+      }
+    }
+  }
+#endif
+
   if (request_headers_.size() > 0)
     request.AddHTTPHeaderFields(request_headers_);