OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010. Adam Barth. All rights reserved. | 2 * Copyright (C) 2010. Adam Barth. 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * | 7 * |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. 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 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
60 , m_encodingWasChosenByUser(false) | 60 , m_encodingWasChosenByUser(false) |
61 { | 61 { |
62 } | 62 } |
63 | 63 |
64 // This is only called by ScriptController::executeIfJavaScriptURL | 64 // This is only called by ScriptController::executeIfJavaScriptURL |
65 // and always contains the result of evaluating a javascript: url. | 65 // and always contains the result of evaluating a javascript: url. |
66 // This is the <iframe src="javascript:'html'"> case. | 66 // This is the <iframe src="javascript:'html'"> case. |
67 void DocumentWriter::replaceDocument(const String& source) | 67 void DocumentWriter::replaceDocument(const String& source) |
68 { | 68 { |
69 m_frame->loader()->stopAllLoaders(); | 69 m_frame->loader()->stopAllLoaders(); |
70 begin(m_frame->document()->url(), true, m_frame->document()->securityOrigin(
)); | 70 begin(m_frame->document()->url(), true, InheritSecurityOrigin); |
71 | 71 |
72 if (!source.isNull()) { | 72 if (!source.isNull()) { |
73 if (!m_hasReceivedSomeData) { | 73 if (!m_hasReceivedSomeData) { |
74 m_hasReceivedSomeData = true; | 74 m_hasReceivedSomeData = true; |
75 m_frame->document()->setCompatibilityMode(Document::NoQuirksMode); | 75 m_frame->document()->setCompatibilityMode(Document::NoQuirksMode); |
76 } | 76 } |
77 | 77 |
78 // FIXME: This should call DocumentParser::appendBytes instead of append | 78 // FIXME: This should call DocumentParser::appendBytes instead of append |
79 // to support RawDataDocumentParsers. | 79 // to support RawDataDocumentParsers. |
80 if (DocumentParser* parser = m_frame->document()->parser()) | 80 if (DocumentParser* parser = m_frame->document()->parser()) |
(...skipping 18 matching lines...) Expand all Loading... |
99 | 99 |
100 PassRefPtr<Document> DocumentWriter::createDocument(const KURL& url) | 100 PassRefPtr<Document> DocumentWriter::createDocument(const KURL& url) |
101 { | 101 { |
102 if (!m_frame->loader()->stateMachine()->isDisplayingInitialEmptyDocument() &
& m_frame->loader()->client()->shouldUsePluginDocument(m_mimeType)) | 102 if (!m_frame->loader()->stateMachine()->isDisplayingInitialEmptyDocument() &
& m_frame->loader()->client()->shouldUsePluginDocument(m_mimeType)) |
103 return PluginDocument::create(m_frame, url); | 103 return PluginDocument::create(m_frame, url); |
104 if (!m_frame->loader()->client()->hasHTMLView()) | 104 if (!m_frame->loader()->client()->hasHTMLView()) |
105 return PlaceholderDocument::create(m_frame, url); | 105 return PlaceholderDocument::create(m_frame, url); |
106 return DOMImplementation::createDocument(m_mimeType, m_frame, url, m_frame->
inViewSourceMode()); | 106 return DOMImplementation::createDocument(m_mimeType, m_frame, url, m_frame->
inViewSourceMode()); |
107 } | 107 } |
108 | 108 |
109 void DocumentWriter::begin(const KURL& urlReference, bool dispatch, SecurityOrig
in* origin) | 109 void DocumentWriter::begin(const KURL& urlReference, bool dispatch, SecurityOrig
inSource originSource) |
110 { | 110 { |
111 // We need to take a reference to the security origin because |clear| | 111 RefPtr<Document> oldDocument = m_frame->document(); |
112 // might destroy the document that owns it. | |
113 RefPtr<SecurityOrigin> forcedSecurityOrigin = origin; | |
114 | 112 |
115 // We grab a local copy of the URL because it's easy for callers to supply | 113 // We grab a local copy of the URL because it's easy for callers to supply |
116 // a URL that will be deallocated during the execution of this function. | 114 // a URL that will be deallocated during the execution of this function. |
117 // For example, see <https://bugs.webkit.org/show_bug.cgi?id=66360>. | 115 // For example, see <https://bugs.webkit.org/show_bug.cgi?id=66360>. |
118 KURL url = urlReference; | 116 KURL url = urlReference; |
119 | 117 |
120 // Create a new document before clearing the frame, because it may need to | 118 // Create a new document before clearing the frame, because it may need to |
121 // inherit an aliased security context. | 119 // inherit an aliased security context. |
122 RefPtr<Document> document = createDocument(url); | 120 RefPtr<Document> document = createDocument(url); |
123 | 121 |
124 // If the new document is for a Plugin but we're supposed to be sandboxed fr
om Plugins, | 122 // If the new document is for a Plugin but we're supposed to be sandboxed fr
om Plugins, |
125 // then replace the document with one whose parser will ignore the incoming
data (bug 39323) | 123 // then replace the document with one whose parser will ignore the incoming
data (bug 39323) |
126 if (document->isPluginDocument() && m_frame->loader()->isSandboxed(SandboxPl
ugins)) | 124 if (document->isPluginDocument() && m_frame->loader()->isSandboxed(SandboxPl
ugins)) |
127 document = SinkDocument::create(m_frame, url); | 125 document = SinkDocument::create(m_frame, url); |
128 | 126 |
129 // FIXME: Do we need to consult the content security policy here about block
ed plug-ins? | 127 // FIXME: Do we need to consult the content security policy here about block
ed plug-ins? |
130 | 128 |
131 bool resetScripting = !(m_frame->loader()->stateMachine()->isDisplayingIniti
alEmptyDocument() && m_frame->document()->securityOrigin()->isSecureTransitionTo
(url)); | 129 bool resetScripting = !(m_frame->loader()->stateMachine()->isDisplayingIniti
alEmptyDocument() && m_frame->document()->securityOrigin()->isSecureTransitionTo
(url)); |
132 m_frame->loader()->clear(resetScripting, resetScripting); | 130 m_frame->loader()->clear(resetScripting, resetScripting); |
133 clear(); | 131 clear(); |
134 if (resetScripting) | 132 if (resetScripting) |
135 m_frame->script()->updatePlatformScriptObjects(); | 133 m_frame->script()->updatePlatformScriptObjects(); |
136 | 134 |
137 m_frame->loader()->setOutgoingReferrer(url); | 135 m_frame->loader()->setOutgoingReferrer(url); |
138 m_frame->setDocument(document); | 136 m_frame->setDocument(document); |
139 | 137 |
140 if (m_decoder) | 138 if (m_decoder) |
141 document->setDecoder(m_decoder.get()); | 139 document->setDecoder(m_decoder.get()); |
142 if (forcedSecurityOrigin) | 140 if (originSource == InheritSecurityOrigin) { |
143 document->setSecurityOrigin(forcedSecurityOrigin.get()); | 141 document->setCookieURL(oldDocument->cookieURL()); |
| 142 document->setSecurityOrigin(oldDocument->securityOrigin()); |
| 143 } |
144 | 144 |
145 m_frame->domWindow()->setURL(document->url()); | 145 m_frame->domWindow()->setURL(document->url()); |
146 m_frame->domWindow()->setSecurityOrigin(document->securityOrigin()); | 146 m_frame->domWindow()->setSecurityOrigin(document->securityOrigin()); |
147 | 147 |
148 m_frame->loader()->didBeginDocument(dispatch); | 148 m_frame->loader()->didBeginDocument(dispatch); |
149 | 149 |
150 document->implicitOpen(); | 150 document->implicitOpen(); |
151 | 151 |
152 // We grab a reference to the parser so that we'll always send data to the | 152 // We grab a reference to the parser so that we'll always send data to the |
153 // original parser, even if the document acquires a new parser (e.g., via | 153 // original parser, even if the document acquires a new parser (e.g., via |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 return m_frame->document()->url().isEmpty() ? m_encoding : encoding(); | 263 return m_frame->document()->url().isEmpty() ? m_encoding : encoding(); |
264 } | 264 } |
265 | 265 |
266 void DocumentWriter::setDocumentWasLoadedAsPartOfNavigation() | 266 void DocumentWriter::setDocumentWasLoadedAsPartOfNavigation() |
267 { | 267 { |
268 ASSERT(!m_parser->isStopped()); | 268 ASSERT(!m_parser->isStopped()); |
269 m_parser->setDocumentWasLoadedAsPartOfNavigation(); | 269 m_parser->setDocumentWasLoadedAsPartOfNavigation(); |
270 } | 270 } |
271 | 271 |
272 } // namespace WebCore | 272 } // namespace WebCore |
OLD | NEW |