| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 #include "public/platform/WebViewScheduler.h" | 82 #include "public/platform/WebViewScheduler.h" |
| 83 #include "wtf/Vector.h" | 83 #include "wtf/Vector.h" |
| 84 #include <algorithm> | 84 #include <algorithm> |
| 85 #include <memory> | 85 #include <memory> |
| 86 | 86 |
| 87 namespace blink { | 87 namespace blink { |
| 88 | 88 |
| 89 namespace { | 89 namespace { |
| 90 | 90 |
| 91 void emitWarningForDocWriteScripts(const String& url, Document& document) { | 91 void emitWarningForDocWriteScripts(const String& url, Document& document) { |
| 92 String message = "A Parser-blocking, cross-origin script, " + url + | 92 String message = |
| 93 ", is invoked via document.write. This may be blocked by " | 93 "A Parser-blocking, cross site (i.e. different eTLD+1) script, " + url + |
| 94 "the browser if the device has poor network connectivity. " | 94 ", is invoked via document.write. This may be blocked by " |
| 95 "See https://www.chromestatus.com/feature/5718547946799104 " | 95 "the browser if the device has poor network connectivity. " |
| 96 "for more details."; | 96 "See https://www.chromestatus.com/feature/5718547946799104 " |
| 97 "for more details."; |
| 97 document.addConsoleMessage( | 98 document.addConsoleMessage( |
| 98 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); | 99 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, message)); |
| 99 WTFLogAlways("%s", message.utf8().data()); | 100 WTFLogAlways("%s", message.utf8().data()); |
| 100 } | 101 } |
| 101 | 102 |
| 102 bool isConnectionEffectively2G(WebEffectiveConnectionType effectiveType) { | 103 bool isConnectionEffectively2G(WebEffectiveConnectionType effectiveType) { |
| 103 switch (effectiveType) { | 104 switch (effectiveType) { |
| 104 case WebEffectiveConnectionType::TypeSlow2G: | 105 case WebEffectiveConnectionType::TypeSlow2G: |
| 105 case WebEffectiveConnectionType::Type2G: | 106 case WebEffectiveConnectionType::Type2G: |
| 106 return true; | 107 return true; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 135 PerformanceMonitor::documentWriteFetchScript(&document); | 136 PerformanceMonitor::documentWriteFetchScript(&document); |
| 136 | 137 |
| 137 if (!request.url().protocolIsInHTTPFamily()) | 138 if (!request.url().protocolIsInHTTPFamily()) |
| 138 return false; | 139 return false; |
| 139 | 140 |
| 140 // Avoid blocking same origin scripts, as they may be used to render main | 141 // Avoid blocking same origin scripts, as they may be used to render main |
| 141 // page content, whereas cross-origin scripts inserted via document.write | 142 // page content, whereas cross-origin scripts inserted via document.write |
| 142 // are likely to be third party content. | 143 // are likely to be third party content. |
| 143 String requestHost = request.url().host(); | 144 String requestHost = request.url().host(); |
| 144 String documentHost = document.getSecurityOrigin()->domain(); | 145 String documentHost = document.getSecurityOrigin()->domain(); |
| 146 |
| 147 bool sameSite = false; |
| 145 if (requestHost == documentHost) | 148 if (requestHost == documentHost) |
| 146 return false; | 149 sameSite = true; |
| 147 | 150 |
| 148 // If the hosts didn't match, then see if the domains match. For example, if | 151 // If the hosts didn't match, then see if the domains match. For example, if |
| 149 // a script is served from static.example.com for a document served from | 152 // a script is served from static.example.com for a document served from |
| 150 // www.example.com, we consider that a first party script and allow it. | 153 // www.example.com, we consider that a first party script and allow it. |
| 151 String requestDomain = NetworkUtils::getDomainAndRegistry( | 154 String requestDomain = NetworkUtils::getDomainAndRegistry( |
| 152 requestHost, NetworkUtils::IncludePrivateRegistries); | 155 requestHost, NetworkUtils::IncludePrivateRegistries); |
| 153 String documentDomain = NetworkUtils::getDomainAndRegistry( | 156 String documentDomain = NetworkUtils::getDomainAndRegistry( |
| 154 documentHost, NetworkUtils::IncludePrivateRegistries); | 157 documentHost, NetworkUtils::IncludePrivateRegistries); |
| 155 // getDomainAndRegistry will return the empty string for domains that are | 158 // getDomainAndRegistry will return the empty string for domains that are |
| 156 // already top-level, such as localhost. Thus we only compare domains if we | 159 // already top-level, such as localhost. Thus we only compare domains if we |
| 157 // get non-empty results back from getDomainAndRegistry. | 160 // get non-empty results back from getDomainAndRegistry. |
| 158 if (!requestDomain.isEmpty() && !documentDomain.isEmpty() && | 161 if (!requestDomain.isEmpty() && !documentDomain.isEmpty() && |
| 159 requestDomain == documentDomain) | 162 requestDomain == documentDomain) |
| 163 sameSite = true; |
| 164 |
| 165 if (sameSite) { |
| 166 // This histogram is introduced to help decide whether we should also check |
| 167 // same scheme while deciding whether or not to block the script as is done |
| 168 // in other cases of "same site" usage. On the other hand we do not want to |
| 169 // block more scripts than necessary. |
| 170 if (request.url().protocol() != document.getSecurityOrigin()->protocol()) { |
| 171 document.loader()->didObserveLoadingBehavior( |
| 172 WebLoadingBehaviorFlag:: |
| 173 WebLoadingBehaviorDocumentWriteBlockDifferentScheme); |
| 174 } |
| 160 return false; | 175 return false; |
| 176 } |
| 161 | 177 |
| 162 emitWarningForDocWriteScripts(request.url().getString(), document); | 178 emitWarningForDocWriteScripts(request.url().getString(), document); |
| 163 request.setHTTPHeaderField("Intervention", | 179 request.setHTTPHeaderField("Intervention", |
| 164 "<https://www.chromestatus.com/feature/" | 180 "<https://www.chromestatus.com/feature/" |
| 165 "5718547946799104>; level=\"warning\""); | 181 "5718547946799104>; level=\"warning\""); |
| 166 | 182 |
| 167 // Do not block scripts if it is a page reload. This is to enable pages to | 183 // Do not block scripts if it is a page reload. This is to enable pages to |
| 168 // recover if blocking of a script is leading to a page break and the user | 184 // recover if blocking of a script is leading to a page break and the user |
| 169 // reloads the page. | 185 // reloads the page. |
| 170 const FrameLoadType loadType = document.frame()->loader().loadType(); | 186 const FrameLoadType loadType = document.frame()->loader().loadType(); |
| (...skipping 887 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1058 response); | 1074 response); |
| 1059 } | 1075 } |
| 1060 | 1076 |
| 1061 DEFINE_TRACE(FrameFetchContext) { | 1077 DEFINE_TRACE(FrameFetchContext) { |
| 1062 visitor->trace(m_document); | 1078 visitor->trace(m_document); |
| 1063 visitor->trace(m_documentLoader); | 1079 visitor->trace(m_documentLoader); |
| 1064 FetchContext::trace(visitor); | 1080 FetchContext::trace(visitor); |
| 1065 } | 1081 } |
| 1066 | 1082 |
| 1067 } // namespace blink | 1083 } // namespace blink |
| OLD | NEW |