Index: third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
index aab6e32f909db869ae8dbc90db1b6bae95c83f27..11bcc449806780366fda38b4e0eb900beb300375 100644 |
--- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
+++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp |
@@ -2,7 +2,8 @@ |
Copyright (C) 1998 Lars Knoll (knoll@mpi-hd.mpg.de) |
Copyright (C) 2001 Dirk Mueller (mueller@kde.org) |
Copyright (C) 2002 Waldo Bastian (bastian@kde.org) |
- Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. |
+ Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All |
+ rights reserved. |
Copyright (C) 2009 Torch Mobile Inc. http://www.torchmobile.com/ |
This library is free software; you can redistribute it and/or |
@@ -20,8 +21,8 @@ |
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, |
Boston, MA 02110-1301, USA. |
- This class provides all functionality needed for loading images, style sheets and html |
- pages from the web. It has a memory cache for these objects. |
+ This class provides all functionality needed for loading images, style |
+ sheets and html pages from the web. It has a memory cache for these objects. |
*/ |
#include "core/fetch/ResourceFetcher.h" |
@@ -120,7 +121,8 @@ static ResourceLoadPriority typeToPriority(Resource::Type type) { |
// Also visible resources/images (set explicitly in loadPriority) |
return ResourceLoadPriorityHigh; |
case Resource::Manifest: |
- // Also late-body scripts discovered by the preload scanner (set explicitly in loadPriority) |
+ // Also late-body scripts discovered by the preload scanner (set |
+ // explicitly in loadPriority) |
return ResourceLoadPriorityMedium; |
case Resource::Image: |
case Resource::TextTrack: |
@@ -146,10 +148,11 @@ ResourceLoadPriority ResourceFetcher::computeLoadPriority( |
if (visibility == ResourcePriority::Visible) |
priority = ResourceLoadPriorityHigh; |
- // Resources before the first image are considered "early" in the document |
- // and resources after the first image are "late" in the document. Important to |
+ // Resources before the first image are considered "early" in the document and |
+ // resources after the first image are "late" in the document. Important to |
// note that this is based on when the preload scanner discovers a resource |
- // for the most part so the main parser may not have reached the image element yet. |
+ // for the most part so the main parser may not have reached the image element |
+ // yet. |
if (type == Resource::Image) |
m_imageFetched = true; |
@@ -157,7 +160,8 @@ ResourceLoadPriority ResourceFetcher::computeLoadPriority( |
priority = ResourceLoadPriorityVeryLow; |
} else if (type == Resource::Script) { |
// Special handling for scripts. |
- // Default/Parser-Blocking/Preload early in document: High (set in typeToPriority) |
+ // Default/Parser-Blocking/Preload early in document: High (set in |
+ // typeToPriority) |
// Async/Defer: Low Priority (applies to both preload and parser-inserted) |
// Preload late in document: Medium |
if (FetchRequest::LazyLoad == request.defer()) |
@@ -168,10 +172,11 @@ ResourceLoadPriority ResourceFetcher::computeLoadPriority( |
priority = ResourceLoadPriorityVeryLow; |
} |
- // A manually set priority acts as a floor. This is used to ensure that synchronous requests |
- // are always given the highest possible priority, as well as to ensure that there isn't priority |
- // churn if images move in and out of the viewport, or is displayed more than once, both in and out |
- // of the viewport. |
+ // A manually set priority acts as a floor. This is used to ensure that |
+ // synchronous requests are always given the highest possible priority, as |
+ // well as to ensure that there isn't priority churn if images move in and out |
+ // of the viewport, or is displayed more than once, both in and out of the |
+ // viewport. |
return std::max(context().modifyPriorityForExperiments(priority), |
request.resourceRequest().priority()); |
} |
@@ -189,7 +194,8 @@ static WebURLRequest::RequestContext requestContextFromType( |
case Resource::MainResource: |
if (!isMainFrame) |
return WebURLRequest::RequestContextIframe; |
- // FIXME: Change this to a context frame type (once we introduce them): http://fetch.spec.whatwg.org/#concept-request-context-frame-type |
+ // FIXME: Change this to a context frame type (once we introduce them): |
+ // http://fetch.spec.whatwg.org/#concept-request-context-frame-type |
return WebURLRequest::RequestContextHyperlink; |
case Resource::XSLStyleSheet: |
DCHECK(RuntimeEnabledFeatures::xsltEnabled()); |
@@ -258,7 +264,8 @@ bool ResourceFetcher::canAccessResponse( |
if (sourceOrigin->canRequestNoSuborigin(response.url())) |
return true; |
- // Use the original response instead of the 304 response for a successful revaldiation. |
+ // Use the original response instead of the 304 response for a successful |
+ // revaldiation. |
const ResourceResponse& responseForAccessControl = |
(resource->isCacheValidator() && response.httpStatusCode() == 304) |
? resource->response() |
@@ -318,7 +325,8 @@ void ResourceFetcher::requestLoadStarted(unsigned long identifier, |
if (type == ResourceLoadingFromCache && !resource->stillNeedsLoad() && |
!m_validatedURLs.contains(request.resourceRequest().url())) { |
- // Resources loaded from memory cache should be reported the first time they're used. |
+ // Resources loaded from memory cache should be reported the first time |
+ // they're used. |
std::unique_ptr<ResourceTimingInfo> info = ResourceTimingInfo::create( |
request.options().initiatorInfo.name, monotonicallyIncreasingTime(), |
resource->getType() == Resource::MainResource); |
@@ -349,10 +357,12 @@ Resource* ResourceFetcher::resourceForStaticData( |
const KURL& url = request.resourceRequest().url(); |
DCHECK(url.protocolIsData() || substituteData.isValid() || m_archive); |
- // TODO(japhet): We only send main resource data: urls through WebURLLoader for the benefit of |
- // a service worker test (RenderViewImplTest.ServiceWorkerNetworkProviderSetup), which is at a |
- // layer where it isn't easy to mock out a network load. It uses data: urls to emulate the |
- // behavior it wants to test, which would otherwise be reserved for network loads. |
+ // TODO(japhet): We only send main resource data: urls through WebURLLoader |
+ // for the benefit of a service worker test |
+ // (RenderViewImplTest.ServiceWorkerNetworkProviderSetup), which is at a layer |
+ // where it isn't easy to mock out a network load. It uses data: urls to |
+ // emulate the behavior it wants to test, which would otherwise be reserved |
+ // for network loads. |
if (!m_archive && !substituteData.isValid() && |
(factory.type() == Resource::MainResource || |
factory.type() == Resource::Raw)) |
@@ -361,7 +371,8 @@ Resource* ResourceFetcher::resourceForStaticData( |
const String cacheIdentifier = getCacheIdentifier(); |
if (Resource* oldResource = |
memoryCache()->resourceForURL(url, cacheIdentifier)) { |
- // There's no reason to re-parse if we saved the data from the previous parse. |
+ // There's no reason to re-parse if we saved the data from the previous |
+ // parse. |
if (request.options().dataBufferingPolicy != DoNotBufferData) |
return oldResource; |
memoryCache()->remove(oldResource); |
@@ -415,7 +426,8 @@ Resource* ResourceFetcher::resourceForStaticData( |
void ResourceFetcher::moveCachedNonBlockingResourceToBlocking( |
Resource* resource, |
const FetchRequest& request) { |
- // TODO(yoav): Test that non-blocking resources (video/audio/track) continue to not-block even after being preloaded and discovered. |
+ // TODO(yoav): Test that non-blocking resources (video/audio/track) continue |
+ // to not-block even after being preloaded and discovered. |
if (resource && resource->loader() && |
resource->isLoadEventBlockingResourceType() && |
resource->isLinkPreload() && !request.forPreload()) { |
@@ -438,10 +450,10 @@ void ResourceFetcher::updateMemoryCacheStats(Resource* resource, |
DEFINE_RESOURCE_HISTOGRAM(""); |
} |
- // Aims to count Resource only referenced from MemoryCache (i.e. what |
- // would be dead if MemoryCache holds weak references to Resource). |
- // Currently we check references to Resource from ResourceClient and |
- // |m_preloads| only, because they are major sources of references. |
+ // Aims to count Resource only referenced from MemoryCache (i.e. what would be |
+ // dead if MemoryCache holds weak references to Resource). Currently we check |
+ // references to Resource from ResourceClient and |m_preloads| only, because |
+ // they are major sources of references. |
if (resource && !resource->isAlive() && |
(!m_preloads || !m_preloads->contains(resource))) { |
DEFINE_RESOURCE_HISTOGRAM("Dead."); |
@@ -511,10 +523,10 @@ Resource* ResourceFetcher::requestResource( |
Resource* resource(nullptr); |
if (isStaticData) { |
resource = resourceForStaticData(request, factory, substituteData); |
- // Abort the request if the archive doesn't contain the resource, except |
- // in the case of data URLs which might have resources such as fonts |
- // that need to be decoded only on demand. These data URLs are allowed |
- // to be processed using the normal ResourceFetcher machinery. |
+ // Abort the request if the archive doesn't contain the resource, except in |
+ // the case of data URLs which might have resources such as fonts that need |
+ // to be decoded only on demand. These data URLs are allowed to be |
+ // processed using the normal ResourceFetcher machinery. |
if (!resource && !isDataUrl && m_archive) |
return nullptr; |
} |
@@ -522,7 +534,8 @@ Resource* ResourceFetcher::requestResource( |
resource = |
memoryCache()->resourceForURL(request.url(), getCacheIdentifier()); |
- // See if we can use an existing resource from the cache. If so, we need to move it to be load blocking. |
+ // See if we can use an existing resource from the cache. If so, we need to |
+ // move it to be load blocking. |
moveCachedNonBlockingResourceToBlocking(resource, request); |
const RevalidationPolicy policy = determineRevalidationPolicy( |
@@ -566,11 +579,12 @@ Resource* ResourceFetcher::requestResource( |
resource->setIdentifier(identifier); |
if (!request.forPreload() || policy != Use) { |
- // When issuing another request for a resource that is already in-flight make |
- // sure to not demote the priority of the in-flight request. If the new request |
- // isn't at the same priority as the in-flight request, only allow promotions. |
- // This can happen when a visible image's priority is increased and then another |
- // reference to the image is parsed (which would be at a lower priority). |
+ // When issuing another request for a resource that is already in-flight |
+ // make sure to not demote the priority of the in-flight request. If the new |
+ // request isn't at the same priority as the in-flight request, only allow |
+ // promotions. This can happen when a visible image's priority is increased |
+ // and then another reference to the image is parsed (which would be at a |
+ // lower priority). |
if (request.resourceRequest().priority() > |
resource->resourceRequest().priority()) |
resource->didChangePriority(request.resourceRequest().priority(), 0); |
@@ -586,9 +600,9 @@ Resource* ResourceFetcher::requestResource( |
MemoryCache::removeFragmentIdentifierIfNeeded(request.url()), resource); |
// Returns with an existing resource if the resource does not need to start |
- // loading immediately. |
- // If revalidation policy was determined as |Revalidate|, the resource was |
- // already initialized for the revalidation here, but won't start loading. |
+ // loading immediately. If revalidation policy was determined as |Revalidate|, |
+ // the resource was already initialized for the revalidation here, but won't |
+ // start loading. |
if (!resourceNeedsLoad(resource, request, policy)) |
return resource; |
@@ -736,20 +750,19 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
// Checks if the resource has an explicit policy about integrity metadata. |
// Currently only applies to ScriptResources. |
// |
- // This is necessary because ScriptResource objects do not keep the raw |
- // data around after the source is accessed once, so if the resource is |
- // accessed from the MemoryCache for a second time, there is no way to redo |
- // an integrity check. |
+ // This is necessary because ScriptResource objects do not keep the raw data |
+ // around after the source is accessed once, so if the resource is accessed |
+ // from the MemoryCache for a second time, there is no way to redo an |
+ // integrity check. |
// |
- // Thus, Blink implements a scheme where it caches the integrity |
- // information for a ScriptResource after the first time it is checked, and |
- // if there is another request for that resource, with the same integrity |
- // metadata, Blink skips the integrity calculation. However, if the |
- // integrity metadata is a mismatch, the MemoryCache must be skipped here, |
- // and a new request for the resource must be made to get the raw data. |
- // This is expected to be an uncommon case, however, as it implies two |
- // same-origin requests to the same resource, but with different integrity |
- // metadata. |
+ // Thus, Blink implements a scheme where it caches the integrity information |
+ // for a ScriptResource after the first time it is checked, and if there is |
+ // another request for that resource, with the same integrity metadata, Blink |
+ // skips the integrity calculation. However, if the integrity metadata is a |
+ // mismatch, the MemoryCache must be skipped here, and a new request for the |
+ // resource must be made to get the raw data. This is expected to be an |
+ // uncommon case, however, as it implies two same-origin requests to the same |
+ // resource, but with different integrity metadata. |
RecordSriResourceIntegrityMismatchEvent(CheckingForIntegrityMismatch); |
if (existingResource->mustRefetchDueToIntegrityMetadata(fetchRequest)) { |
RecordSriResourceIntegrityMismatchEvent(RefetchDueToIntegrityMismatch); |
@@ -775,30 +788,31 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
return Reload; |
} |
- // Do not load from cache if images are not enabled. |
- // There are two general cases: |
- // 1. Images are disabled. Don't ever load images, even if the image is |
- // cached or it is a data: url. In this case, we "Reload" the image, |
- // then defer it with resourceNeedsLoad() so that it never actually |
- // goes to the network. |
- // 2. Images are enabled, but not loaded automatically. In this case, we |
- // will Use cached resources or data: urls, but will similarly fall back |
- // to a deferred network load if we don't have the data available |
- // without a network request. We check allowImage() here, which is |
- // affected by m_imagesEnabled but not m_autoLoadImages, in order to |
- // allow for this differing behavior. |
+ // Do not load from cache if images are not enabled. There are two general |
+ // cases: |
+ // |
+ // 1. Images are disabled. Don't ever load images, even if the image is cached |
+ // or it is a data: url. In this case, we "Reload" the image, then defer it |
+ // with resourceNeedsLoad() so that it never actually goes to the network. |
+ // |
+ // 2. Images are enabled, but not loaded automatically. In this case, we will |
+ // Use cached resources or data: urls, but will similarly fall back to a |
+ // deferred network load if we don't have the data available without a network |
+ // request. We check allowImage() here, which is affected by m_imagesEnabled |
+ // but not m_autoLoadImages, in order to allow for this differing behavior. |
+ // |
// TODO(japhet): Can we get rid of one of these settings? |
if (existingResource->isImage() && |
!context().allowImage(m_imagesEnabled, existingResource->url())) |
return Reload; |
- // Never use cache entries for downloadToFile / useStreamOnResponse |
- // requests. The data will be delivered through other paths. |
+ // Never use cache entries for downloadToFile / useStreamOnResponse requests. |
+ // The data will be delivered through other paths. |
if (request.downloadToFile() || request.useStreamOnResponse()) |
return Reload; |
- // Never reuse opaque responses from a service worker for requests that |
- // are not no-cors. https://crbug.com/625575 |
+ // Never reuse opaque responses from a service worker for requests that are |
+ // not no-cors. https://crbug.com/625575 |
if (existingResource->response().wasFetchedViaServiceWorker() && |
existingResource->response().serviceWorkerResponseType() == |
WebServiceWorkerResponseTypeOpaque && |
@@ -812,17 +826,17 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
if (!existingResource->canReuse(request)) |
return Reload; |
- // Certain requests (e.g., XHRs) might have manually set headers that require revalidation. |
- // In theory, this should be a Revalidate case. In practice, the MemoryCache revalidation path assumes a whole bunch |
- // of things about how revalidation works that manual headers violate, so punt to Reload instead. |
+ // Certain requests (e.g., XHRs) might have manually set headers that require |
+ // revalidation. In theory, this should be a Revalidate case. In practice, the |
+ // MemoryCache revalidation path assumes a whole bunch of things about how |
+ // revalidation works that manual headers violate, so punt to Reload instead. |
// |
- // Similarly, a request with manually added revalidation headers can lead |
- // to a 304 response for a request that wasn't flagged as a revalidation |
- // attempt. Normally, successful revalidation will maintain the original |
- // response's status code, but for a manual revalidation the response code |
- // remains 304. In this case, the Resource likely has insufficient context |
- // to provide a useful cache hit or revalidation. |
- // See http://crbug.com/643659 |
+ // Similarly, a request with manually added revalidation headers can lead to a |
+ // 304 response for a request that wasn't flagged as a revalidation attempt. |
+ // Normally, successful revalidation will maintain the original response's |
+ // status code, but for a manual revalidation the response code remains 304. |
+ // In this case, the Resource likely has insufficient context to provide a |
+ // useful cache hit or revalidation. See http://crbug.com/643659 |
if (request.isConditional() || |
existingResource->response().httpStatusCode() == 304) |
return Reload; |
@@ -855,12 +869,12 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
return Reload; |
} |
- // If credentials were sent with the previous request and won't be |
- // with this one, or vice versa, re-fetch the resource. |
+ // If credentials were sent with the previous request and won't be with this |
+ // one, or vice versa, re-fetch the resource. |
// |
// This helps with the case where the server sends back |
- // "Access-Control-Allow-Origin: *" all the time, but some of the |
- // client's requests are made without CORS and some with. |
+ // "Access-Control-Allow-Origin: *" all the time, but some of the client's |
+ // requests are made without CORS and some with. |
if (existingResource->resourceRequest().allowStoredCredentials() != |
request.allowStoredCredentials()) { |
RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " |
@@ -869,11 +883,11 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
return Reload; |
} |
- // During the initial load, avoid loading the same resource multiple times for a single document, |
- // even if the cache policies would tell us to. |
- // We also group loads of the same resource together. |
- // Raw resources are exempted, as XHRs fall into this category and may have user-set Cache-Control: |
- // headers or other factors that require separate requests. |
+ // During the initial load, avoid loading the same resource multiple times for |
+ // a single document, even if the cache policies would tell us to. We also |
+ // group loads of the same resource together. Raw resources are exempted, as |
+ // XHRs fall into this category and may have user-set Cache-Control: headers |
+ // or other factors that require separate requests. |
if (type != Resource::Raw) { |
if (!context().isLoadComplete() && |
m_validatedURLs.contains(existingResource->url())) |
@@ -900,8 +914,9 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
return Reload; |
} |
- // List of available images logic allows images to be re-used without cache validation. We restrict this only to images |
- // from memory cache which are the same as the version in the current document. |
+ // List of available images logic allows images to be re-used without cache |
+ // validation. We restrict this only to images from memory cache which are the |
+ // same as the version in the current document. |
if (type == Resource::Image && |
existingResource == cachedResource(request.url())) |
return Use; |
@@ -910,23 +925,27 @@ ResourceFetcher::determineRevalidationPolicy(Resource::Type type, |
if (existingResource->hasVaryHeader()) |
return Reload; |
- // If any of the redirects in the chain to loading the resource were not cacheable, we cannot reuse our cached resource. |
+ // If any of the redirects in the chain to loading the resource were not |
+ // cacheable, we cannot reuse our cached resource. |
if (!existingResource->canReuseRedirectChain()) { |
RESOURCE_LOADING_DVLOG(1) << "ResourceFetcher::determineRevalidationPolicy " |
"reloading due to an uncacheable redirect"; |
return Reload; |
} |
- // Check if the cache headers requires us to revalidate (cache expiration for example). |
+ // Check if the cache headers requires us to revalidate (cache expiration for |
+ // example). |
if (cachePolicy == CachePolicyRevalidate || |
existingResource->mustRevalidateDueToCacheHeaders() || |
request.cacheControlContainsNoCache()) { |
- // See if the resource has usable ETag or Last-modified headers. |
- // If the page is controlled by the ServiceWorker, we choose the Reload policy because the revalidation headers should not be exposed to the ServiceWorker.(crbug.com/429570) |
+ // See if the resource has usable ETag or Last-modified headers. If the page |
+ // is controlled by the ServiceWorker, we choose the Reload policy because |
+ // the revalidation headers should not be exposed to the |
+ // ServiceWorker.(crbug.com/429570) |
if (existingResource->canUseCacheValidator() && |
!context().isControlledByServiceWorker()) { |
- // If the resource is already a cache validator but not started yet, |
- // the |Use| policy should be applied to subsequent requests. |
+ // If the resource is already a cache validator but not started yet, the |
+ // |Use| policy should be applied to subsequent requests. |
if (existingResource->isCacheValidator()) { |
DCHECK(existingResource->stillNeedsLoad()); |
return Use; |
@@ -1072,8 +1091,8 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
TRACE_EVENT_ASYNC_END0("blink.net", "Resource", resource->identifier()); |
DCHECK(resource); |
- // When loading a multipart resource, make the loader non-block when |
- // finishing loading the first part. |
+ // When loading a multipart resource, make the loader non-block when finishing |
+ // loading the first part. |
if (finishReason == DidFinishFirstPartInMultipart) |
moveResourceLoaderToNonBlocking(resource->loader()); |
else |
@@ -1090,8 +1109,8 @@ void ResourceFetcher::didFinishLoading(Resource* resource, |
info->setLoadFinishTime(finishTime); |
// encodedDataLength == -1 means "not available". |
// TODO(ricea): Find cases where it is not available but the |
- // PerformanceResourceTiming spec requires it to be available and |
- // fix them. |
+ // PerformanceResourceTiming spec requires it to be available and fix |
+ // them. |
info->addFinalTransferSize(encodedDataLength == -1 ? 0 |
: encodedDataLength); |
if (resource->options().requestInitiatorContext == DocumentContext) |
@@ -1131,10 +1150,10 @@ void ResourceFetcher::didReceiveResponse(Resource* resource, |
DCHECK_EQ(request.skipServiceWorker(), |
WebURLRequest::SkipServiceWorker::None); |
// This code handles the case when a regular controlling service worker |
- // doesn't handle a cross origin request. When this happens we still |
- // want to give foreign fetch a chance to handle the request, so |
- // only skip the controlling service worker for the fallback request. |
- // This is currently safe because of http://crbug.com/604084 the |
+ // doesn't handle a cross origin request. When this happens we still want |
+ // to give foreign fetch a chance to handle the request, so only skip the |
+ // controlling service worker for the fallback request. This is currently |
+ // safe because of http://crbug.com/604084 the |
// wasFallbackRequiredByServiceWorker flag is never set when foreign fetch |
// handled a request. |
request.setSkipServiceWorker( |
@@ -1143,8 +1162,9 @@ void ResourceFetcher::didReceiveResponse(Resource* resource, |
return; |
} |
- // If the response is fetched via ServiceWorker, the original URL of the response could be different from the URL of the request. |
- // We check the URL not to load the resources which are forbidden by the page CSP. |
+ // If the response is fetched via ServiceWorker, the original URL of the |
+ // response could be different from the URL of the request. We check the URL |
+ // not to load the resources which are forbidden by the page CSP. |
// https://w3c.github.io/webappsec-csp/#should-block-response |
const KURL& originalURL = response.originalURLViaServiceWorker(); |
if (!originalURL.isEmpty() && |
@@ -1212,9 +1232,9 @@ bool ResourceFetcher::startLoad(Resource* resource) { |
willSendRequest(resource->identifier(), request, ResourceResponse(), |
resource->options()); |
- // Resource requests from suborigins should not be intercepted by the |
- // service worker of the physical origin. This has the effect that, for |
- // now, suborigins do not work with service workers. See |
+ // Resource requests from suborigins should not be intercepted by the service |
+ // worker of the physical origin. This has the effect that, for now, |
+ // suborigins do not work with service workers. See |
// https://w3c.github.io/webappsec-suborigins/. |
SecurityOrigin* sourceOrigin = context().getSecurityOrigin(); |
if (sourceOrigin && sourceOrigin->hasSuborigin()) |