| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
| 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
| 4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
| 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
| 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2011, 2012 Apple Inc. All r
ights reserved. |
| 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) | 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t
orchmobile.com/) |
| 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. | 8 * Copyright (C) 2008, 2009, 2011, 2012 Google Inc. All rights reserved. |
| 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 9 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
| 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. | 10 * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved. |
| (...skipping 350 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 361 return; | 361 return; |
| 362 if (document->childNeedsStyleRecalc()) | 362 if (document->childNeedsStyleRecalc()) |
| 363 return; | 363 return; |
| 364 if (document->focusedNode()->renderer() && document->focusedNode()->rend
erer()->needsLayout()) | 364 if (document->focusedNode()->renderer() && document->focusedNode()->rend
erer()->needsLayout()) |
| 365 return; | 365 return; |
| 366 if (!document->focusedNode()->isFocusable()) | 366 if (!document->focusedNode()->isFocusable()) |
| 367 document->setFocusedElement(0); | 367 document->setFocusedElement(0); |
| 368 } | 368 } |
| 369 }; | 369 }; |
| 370 | 370 |
| 371 Document::Document(Frame* frame, const KURL& url, DocumentClassFlags documentCla
sses) | 371 Document::Document(const DocumentInit& initializer, DocumentClassFlags documentC
lasses) |
| 372 : ContainerNode(0, CreateDocument) | 372 : ContainerNode(0, CreateDocument) |
| 373 , TreeScope(this) | 373 , TreeScope(this) |
| 374 , m_styleResolverThrowawayTimer(this, &Document::styleResolverThrowawayTimer
Fired) | 374 , m_styleResolverThrowawayTimer(this, &Document::styleResolverThrowawayTimer
Fired) |
| 375 , m_lastStyleResolverAccessTime(0) | 375 , m_lastStyleResolverAccessTime(0) |
| 376 , m_didCalculateStyleResolver(false) | 376 , m_didCalculateStyleResolver(false) |
| 377 , m_ignorePendingStylesheets(false) | 377 , m_ignorePendingStylesheets(false) |
| 378 , m_needsNotifyRemoveAllPendingStylesheet(false) | 378 , m_needsNotifyRemoveAllPendingStylesheet(false) |
| 379 , m_hasNodesWithPlaceholderStyle(false) | 379 , m_hasNodesWithPlaceholderStyle(false) |
| 380 , m_pendingSheetLayout(NoLayoutWithPendingSheets) | 380 , m_pendingSheetLayout(NoLayoutWithPendingSheets) |
| 381 , m_frame(frame) | 381 , m_frame(initializer.frame()) |
| 382 , m_domWindow(0) | 382 , m_domWindow(0) |
| 383 , m_import(initializer.import()) |
| 383 , m_activeParserCount(0) | 384 , m_activeParserCount(0) |
| 384 , m_contextFeatures(ContextFeatures::defaultSwitch()) | 385 , m_contextFeatures(ContextFeatures::defaultSwitch()) |
| 385 , m_wellFormed(false) | 386 , m_wellFormed(false) |
| 386 , m_printing(false) | 387 , m_printing(false) |
| 387 , m_paginatedForScreen(false) | 388 , m_paginatedForScreen(false) |
| 388 , m_ignoreAutofocus(false) | 389 , m_ignoreAutofocus(false) |
| 389 , m_compatibilityMode(NoQuirksMode) | 390 , m_compatibilityMode(NoQuirksMode) |
| 390 , m_compatibilityModeLocked(false) | 391 , m_compatibilityModeLocked(false) |
| 391 , m_didPostCheckFocusedNodeTask(false) | 392 , m_didPostCheckFocusedNodeTask(false) |
| 392 , m_domTreeVersion(++s_globalTreeVersion) | 393 , m_domTreeVersion(++s_globalTreeVersion) |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 435 , m_referrerPolicy(ReferrerPolicyDefault) | 436 , m_referrerPolicy(ReferrerPolicyDefault) |
| 436 , m_directionSetOnDocumentElement(false) | 437 , m_directionSetOnDocumentElement(false) |
| 437 , m_writingModeSetOnDocumentElement(false) | 438 , m_writingModeSetOnDocumentElement(false) |
| 438 , m_writeRecursionIsTooDeep(false) | 439 , m_writeRecursionIsTooDeep(false) |
| 439 , m_writeRecursionDepth(0) | 440 , m_writeRecursionDepth(0) |
| 440 , m_wheelEventHandlerCount(0) | 441 , m_wheelEventHandlerCount(0) |
| 441 , m_lastHandledUserGestureTimestamp(0) | 442 , m_lastHandledUserGestureTimestamp(0) |
| 442 , m_prerenderer(Prerenderer::create(this)) | 443 , m_prerenderer(Prerenderer::create(this)) |
| 443 , m_textAutosizer(TextAutosizer::create(this)) | 444 , m_textAutosizer(TextAutosizer::create(this)) |
| 444 , m_pendingTasksTimer(this, &Document::pendingTasksTimerFired) | 445 , m_pendingTasksTimer(this, &Document::pendingTasksTimerFired) |
| 445 , m_import(0) | |
| 446 , m_scheduledTasksAreSuspended(false) | 446 , m_scheduledTasksAreSuspended(false) |
| 447 , m_sharedObjectPoolClearTimer(this, &Document::sharedObjectPoolClearTimerFi
red) | 447 , m_sharedObjectPoolClearTimer(this, &Document::sharedObjectPoolClearTimerFi
red) |
| 448 #ifndef NDEBUG | 448 #ifndef NDEBUG |
| 449 , m_didDispatchViewportPropertiesChanged(false) | 449 , m_didDispatchViewportPropertiesChanged(false) |
| 450 #endif | 450 #endif |
| 451 , m_timeline(DocumentTimeline::create(this)) | 451 , m_timeline(DocumentTimeline::create(this)) |
| 452 , m_templateDocumentHost(0) | 452 , m_templateDocumentHost(0) |
| 453 , m_fontloader(0) | 453 , m_fontloader(0) |
| 454 , m_didAssociateFormControlsTimer(this, &Document::didAssociateFormControlsT
imerFired) | 454 , m_didAssociateFormControlsTimer(this, &Document::didAssociateFormControlsT
imerFired) |
| 455 { | 455 { |
| 456 ScriptWrappable::init(this); | 456 ScriptWrappable::init(this); |
| 457 | 457 |
| 458 if (m_frame) { | 458 if (m_frame) { |
| 459 provideContextFeaturesToDocumentFrom(this, m_frame->page()); | 459 provideContextFeaturesToDocumentFrom(this, m_frame->page()); |
| 460 | 460 |
| 461 m_cachedResourceLoader = m_frame->loader()->activeDocumentLoader()->cach
edResourceLoader(); | 461 m_cachedResourceLoader = m_frame->loader()->activeDocumentLoader()->cach
edResourceLoader(); |
| 462 } | 462 } |
| 463 | 463 |
| 464 if (!m_cachedResourceLoader) | 464 if (!m_cachedResourceLoader) |
| 465 m_cachedResourceLoader = CachedResourceLoader::create(0); | 465 m_cachedResourceLoader = CachedResourceLoader::create(0); |
| 466 m_cachedResourceLoader->setDocument(this); | 466 m_cachedResourceLoader->setDocument(this); |
| 467 | 467 |
| 468 // We depend on the url getting immediately set in subframes, but we | 468 // We depend on the url getting immediately set in subframes, but we |
| 469 // also depend on the url NOT getting immediately set in opened windows. | 469 // also depend on the url NOT getting immediately set in opened windows. |
| 470 // See fast/dom/early-frame-url.html | 470 // See fast/dom/early-frame-url.html |
| 471 // and fast/dom/location-new-window-no-crash.html, respectively. | 471 // and fast/dom/location-new-window-no-crash.html, respectively. |
| 472 // FIXME: Can/should we unify this behavior? | 472 // FIXME: Can/should we unify this behavior? |
| 473 if ((m_frame && m_frame->ownerElement()) || !url.isEmpty()) | 473 if (initializer.shouldSetURL()) |
| 474 setURL(url); | 474 setURL(initializer.url()); |
| 475 | 475 |
| 476 initSecurityContext(); | 476 initSecurityContext(initializer); |
| 477 initDNSPrefetch(); | 477 initDNSPrefetch(); |
| 478 | 478 |
| 479 for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++) | 479 for (unsigned i = 0; i < WTF_ARRAY_LENGTH(m_nodeListCounts); i++) |
| 480 m_nodeListCounts[i] = 0; | 480 m_nodeListCounts[i] = 0; |
| 481 | 481 |
| 482 InspectorCounters::incrementCounter(InspectorCounters::DocumentCounter); | 482 InspectorCounters::incrementCounter(InspectorCounters::DocumentCounter); |
| 483 | 483 |
| 484 bool shouldProcessCustomElements = | 484 bool shouldProcessCustomElements = |
| 485 (isHTMLDocument() || isXHTMLDocument()) | 485 (isHTMLDocument() || isXHTMLDocument()) |
| 486 && RuntimeEnabledFeatures::customDOMElementsEnabled(); | 486 && RuntimeEnabledFeatures::customDOMElementsEnabled(); |
| (...skipping 3691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4178 return false; | 4178 return false; |
| 4179 if (child->isSrcdocDocument()) | 4179 if (child->isSrcdocDocument()) |
| 4180 return true; | 4180 return true; |
| 4181 if (parent->securityOrigin()->canAccess(child->securityOrigin())) | 4181 if (parent->securityOrigin()->canAccess(child->securityOrigin())) |
| 4182 return true; | 4182 return true; |
| 4183 return parent->securityOrigin()->canRequest(child->url()); | 4183 return parent->securityOrigin()->canRequest(child->url()); |
| 4184 } | 4184 } |
| 4185 | 4185 |
| 4186 void Document::initSecurityContext() | 4186 void Document::initSecurityContext() |
| 4187 { | 4187 { |
| 4188 initSecurityContext(DocumentInit(m_url, m_frame, m_import)); |
| 4189 } |
| 4190 |
| 4191 void Document::initSecurityContext(const DocumentInit& initializer) |
| 4192 { |
| 4188 if (haveInitializedSecurityOrigin()) { | 4193 if (haveInitializedSecurityOrigin()) { |
| 4189 ASSERT(securityOrigin()); | 4194 ASSERT(securityOrigin()); |
| 4190 return; | 4195 return; |
| 4191 } | 4196 } |
| 4192 | 4197 |
| 4193 if (!m_frame) { | 4198 if (!initializer.frame()) { |
| 4194 // No source for a security context. | 4199 // No source for a security context. |
| 4195 // This can occur via document.implementation.createDocument(). | 4200 // This can occur via document.implementation.createDocument(). |
| 4196 m_cookieURL = KURL(ParsedURLString, emptyString()); | 4201 m_cookieURL = KURL(ParsedURLString, emptyString()); |
| 4197 setSecurityOrigin(SecurityOrigin::createUnique()); | 4202 setSecurityOrigin(SecurityOrigin::createUnique()); |
| 4198 setContentSecurityPolicy(ContentSecurityPolicy::create(this)); | 4203 setContentSecurityPolicy(ContentSecurityPolicy::create(this)); |
| 4199 return; | 4204 return; |
| 4200 } | 4205 } |
| 4201 | 4206 |
| 4202 // In the common case, create the security context from the currently | 4207 // In the common case, create the security context from the currently |
| 4203 // loading URL with a fresh content security policy. | 4208 // loading URL with a fresh content security policy. |
| 4204 m_cookieURL = m_url; | 4209 m_cookieURL = m_url; |
| 4205 enforceSandboxFlags(m_frame->loader()->effectiveSandboxFlags()); | 4210 enforceSandboxFlags(initializer.sandboxFlags()); |
| 4206 setSecurityOrigin(isSandboxed(SandboxOrigin) ? SecurityOrigin::createUnique(
) : SecurityOrigin::create(m_url)); | 4211 setSecurityOrigin(isSandboxed(SandboxOrigin) ? SecurityOrigin::createUnique(
) : SecurityOrigin::create(m_url)); |
| 4207 setContentSecurityPolicy(ContentSecurityPolicy::create(this)); | 4212 setContentSecurityPolicy(ContentSecurityPolicy::create(this)); |
| 4208 | 4213 |
| 4209 if (Settings* settings = this->settings()) { | 4214 if (Settings* settings = initializer.settings()) { |
| 4210 if (!settings->webSecurityEnabled()) { | 4215 if (!settings->webSecurityEnabled()) { |
| 4211 // Web security is turned off. We should let this document access ev
ery other document. This is used primary by testing | 4216 // Web security is turned off. We should let this document access ev
ery other document. This is used primary by testing |
| 4212 // harnesses for web sites. | 4217 // harnesses for web sites. |
| 4213 securityOrigin()->grantUniversalAccess(); | 4218 securityOrigin()->grantUniversalAccess(); |
| 4214 } else if (securityOrigin()->isLocal()) { | 4219 } else if (securityOrigin()->isLocal()) { |
| 4215 if (settings->allowUniversalAccessFromFileURLs()) { | 4220 if (settings->allowUniversalAccessFromFileURLs()) { |
| 4216 // Some clients want local URLs to have universal access, but th
at setting is dangerous for other clients. | 4221 // Some clients want local URLs to have universal access, but th
at setting is dangerous for other clients. |
| 4217 securityOrigin()->grantUniversalAccess(); | 4222 securityOrigin()->grantUniversalAccess(); |
| 4218 } else if (!settings->allowFileAccessFromFileURLs()) { | 4223 } else if (!settings->allowFileAccessFromFileURLs()) { |
| 4219 // Some clients want local URLs to have even tighter restriction
s by default, and not be able to access other local files. | 4224 // Some clients want local URLs to have even tighter restriction
s by default, and not be able to access other local files. |
| 4220 // FIXME 81578: The naming of this is confusing. Files with rest
ricted access to other local files | 4225 // FIXME 81578: The naming of this is confusing. Files with rest
ricted access to other local files |
| 4221 // still can have other privileges that can be remembered, there
by not making them unique origins. | 4226 // still can have other privileges that can be remembered, there
by not making them unique origins. |
| 4222 securityOrigin()->enforceFilePathSeparation(); | 4227 securityOrigin()->enforceFilePathSeparation(); |
| 4223 } | 4228 } |
| 4224 } | 4229 } |
| 4225 } | 4230 } |
| 4226 | 4231 |
| 4227 Document* parentDocument = ownerElement() ? ownerElement()->document() : 0; | 4232 Document* parentDocument = ownerElement() ? ownerElement()->document() : 0; |
| 4228 if (parentDocument && m_frame->loader()->shouldTreatURLAsSrcdocDocument(url(
))) { | 4233 if (parentDocument && initializer.shouldTreatURLAsSrcdocDocument()) { |
| 4229 m_isSrcdocDocument = true; | 4234 m_isSrcdocDocument = true; |
| 4230 setBaseURLOverride(parentDocument->baseURL()); | 4235 setBaseURLOverride(parentDocument->baseURL()); |
| 4231 } | 4236 } |
| 4232 | 4237 |
| 4233 // FIXME: What happens if we inherit the security origin? This check may nee
d to be later. | 4238 // FIXME: What happens if we inherit the security origin? This check may nee
d to be later. |
| 4234 // <iframe seamless src="about:blank"> likely won't work as-is. | 4239 // <iframe seamless src="about:blank"> likely won't work as-is. |
| 4235 m_mayDisplaySeamlesslyWithParent = isEligibleForSeamless(parentDocument, thi
s); | 4240 m_mayDisplaySeamlesslyWithParent = isEligibleForSeamless(parentDocument, thi
s); |
| 4236 | 4241 |
| 4237 if (!shouldInheritSecurityOriginFromOwner(m_url)) | 4242 if (!shouldInheritSecurityOriginFromOwner(m_url)) |
| 4238 return; | 4243 return; |
| 4239 | 4244 |
| 4240 // If we do not obtain a meaningful origin from the URL, then we try to | 4245 // If we do not obtain a meaningful origin from the URL, then we try to |
| 4241 // find one via the frame hierarchy. | 4246 // find one via the frame hierarchy. |
| 4242 | 4247 |
| 4243 Frame* ownerFrame = m_frame->tree()->parent(); | 4248 Frame* ownerFrame = initializer.ownerFrame(); |
| 4244 if (!ownerFrame) | |
| 4245 ownerFrame = m_frame->loader()->opener(); | |
| 4246 | |
| 4247 if (!ownerFrame) { | 4249 if (!ownerFrame) { |
| 4248 didFailToInitializeSecurityOrigin(); | 4250 didFailToInitializeSecurityOrigin(); |
| 4249 return; | 4251 return; |
| 4250 } | 4252 } |
| 4251 | 4253 |
| 4252 if (isSandboxed(SandboxOrigin)) { | 4254 if (isSandboxed(SandboxOrigin)) { |
| 4253 // If we're supposed to inherit our security origin from our owner, | 4255 // If we're supposed to inherit our security origin from our owner, |
| 4254 // but we're also sandboxed, the only thing we inherit is the ability | 4256 // but we're also sandboxed, the only thing we inherit is the ability |
| 4255 // to load local resources. This lets about:blank iframes in file:// | 4257 // to load local resources. This lets about:blank iframes in file:// |
| 4256 // URL documents load images and other resources from the file system. | 4258 // URL documents load images and other resources from the file system. |
| (...skipping 853 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5110 result.iterator->value = Locale::create(localeKey); | 5112 result.iterator->value = Locale::create(localeKey); |
| 5111 return *(result.iterator->value); | 5113 return *(result.iterator->value); |
| 5112 } | 5114 } |
| 5113 | 5115 |
| 5114 Document* Document::ensureTemplateDocument() | 5116 Document* Document::ensureTemplateDocument() |
| 5115 { | 5117 { |
| 5116 if (const Document* document = templateDocument()) | 5118 if (const Document* document = templateDocument()) |
| 5117 return const_cast<Document*>(document); | 5119 return const_cast<Document*>(document); |
| 5118 | 5120 |
| 5119 if (isHTMLDocument()) | 5121 if (isHTMLDocument()) |
| 5120 m_templateDocument = HTMLDocument::create(0, blankURL()); | 5122 m_templateDocument = HTMLDocument::create(DocumentInit(blankURL())); |
| 5121 else | 5123 else |
| 5122 m_templateDocument = Document::create(0, blankURL()); | 5124 m_templateDocument = Document::create(DocumentInit(blankURL())); |
| 5123 | 5125 |
| 5124 m_templateDocument->setTemplateDocumentHost(this); // balanced in dtor. | 5126 m_templateDocument->setTemplateDocumentHost(this); // balanced in dtor. |
| 5125 | 5127 |
| 5126 return m_templateDocument.get(); | 5128 return m_templateDocument.get(); |
| 5127 } | 5129 } |
| 5128 | 5130 |
| 5129 PassRefPtr<FontLoader> Document::fontloader() | 5131 PassRefPtr<FontLoader> Document::fontloader() |
| 5130 { | 5132 { |
| 5131 if (!m_fontloader) | 5133 if (!m_fontloader) |
| 5132 m_fontloader = FontLoader::create(this); | 5134 m_fontloader = FontLoader::create(this); |
| (...skipping 26 matching lines...) Expand all Loading... |
| 5159 { | 5161 { |
| 5160 return DocumentLifecycleNotifier::create(this); | 5162 return DocumentLifecycleNotifier::create(this); |
| 5161 } | 5163 } |
| 5162 | 5164 |
| 5163 DocumentLifecycleNotifier* Document::lifecycleNotifier() | 5165 DocumentLifecycleNotifier* Document::lifecycleNotifier() |
| 5164 { | 5166 { |
| 5165 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec
ycleNotifier()); | 5167 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec
ycleNotifier()); |
| 5166 } | 5168 } |
| 5167 | 5169 |
| 5168 } // namespace WebCore | 5170 } // namespace WebCore |
| OLD | NEW |