OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2010 Google, Inc. All Rights Reserved. | 2 * Copyright (C) 2010 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 | 5 * modification, are permitted provided that the following conditions |
6 * are met: | 6 * are met: |
7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 } | 237 } |
238 PendingScript first = m_scriptsToExecuteAfterParsing.takeFirst(); | 238 PendingScript first = m_scriptsToExecuteAfterParsing.takeFirst(); |
239 executePendingScriptAndDispatchEvent(first, PendingScriptDeferred); | 239 executePendingScriptAndDispatchEvent(first, PendingScriptDeferred); |
240 // FIXME: What is this m_document check for? | 240 // FIXME: What is this m_document check for? |
241 if (!m_document) | 241 if (!m_document) |
242 return false; | 242 return false; |
243 } | 243 } |
244 return true; | 244 return true; |
245 } | 245 } |
246 | 246 |
247 void HTMLScriptRunner::requestParsingBlockingScript(Element* element) | 247 void HTMLScriptRunner::requestParsingBlockingScript(const ResourcePtr<ScriptReso
urce>& resource, Element* element) |
248 { | 248 { |
249 if (!requestPendingScript(m_parserBlockingScript, element)) | 249 if (!requestPendingScript(resource, m_parserBlockingScript, element)) |
250 return; | 250 return; |
251 | 251 |
252 ASSERT(m_parserBlockingScript.resource()); | 252 ASSERT(m_parserBlockingScript.resource()); |
253 | 253 |
254 // We only care about a load callback if resource is not already | 254 // We only care about a load callback if resource is not already |
255 // in the cache. Callers will attempt to run the m_parserBlockingScript | 255 // in the cache. Callers will attempt to run the m_parserBlockingScript |
256 // if possible before returning control to the parser. | 256 // if possible before returning control to the parser. |
257 if (!m_parserBlockingScript.resource()->isLoaded()) | 257 if (!m_parserBlockingScript.resource()->isLoaded()) |
258 watchForLoad(m_parserBlockingScript); | 258 watchForLoad(m_parserBlockingScript); |
259 } | 259 } |
260 | 260 |
261 void HTMLScriptRunner::requestDeferredScript(Element* element) | 261 void HTMLScriptRunner::requestDeferredScript(const ResourcePtr<ScriptResource>&
resource, Element* element) |
262 { | 262 { |
263 PendingScript pendingScript; | 263 PendingScript pendingScript; |
264 if (!requestPendingScript(pendingScript, element)) | 264 if (!requestPendingScript(resource, pendingScript, element)) |
265 return; | 265 return; |
266 | 266 |
267 ASSERT(pendingScript.resource()); | 267 ASSERT(pendingScript.resource()); |
268 m_scriptsToExecuteAfterParsing.append(pendingScript); | 268 m_scriptsToExecuteAfterParsing.append(pendingScript); |
269 } | 269 } |
270 | 270 |
271 bool HTMLScriptRunner::requestPendingScript(PendingScript& pendingScript, Elemen
t* script) const | 271 bool HTMLScriptRunner::requestPendingScript(const ResourcePtr<ScriptResource>& r
esource, PendingScript& pendingScript, Element* script) const |
272 { | 272 { |
273 ASSERT(!pendingScript.element()); | 273 ASSERT(!pendingScript.element()); |
274 pendingScript.setElement(script); | 274 pendingScript.setElement(script); |
275 // This should correctly return 0 for empty or invalid srcValues. | 275 // This should correctly return 0 for empty or invalid srcValues. |
276 ScriptResource* resource = toScriptLoaderIfPossible(script)->resource().get(
); | |
277 if (!resource) { | 276 if (!resource) { |
278 notImplemented(); // Dispatch error event. | 277 notImplemented(); // Dispatch error event. |
279 return false; | 278 return false; |
280 } | 279 } |
281 pendingScript.setScriptResource(resource); | 280 pendingScript.setScriptResource(resource.get()); |
282 return true; | 281 return true; |
283 } | 282 } |
284 | 283 |
285 // Implements the initial steps for 'An end tag whose tag name is "script"' | 284 // Implements the initial steps for 'An end tag whose tag name is "script"' |
286 // http://whatwg.org/html#scriptEndTag | 285 // http://whatwg.org/html#scriptEndTag |
287 void HTMLScriptRunner::runScript(Element* script, const TextPosition& scriptStar
tPosition) | 286 void HTMLScriptRunner::runScript(Element* script, const TextPosition& scriptStar
tPosition) |
288 { | 287 { |
289 ASSERT(m_document); | 288 ASSERT(m_document); |
290 ASSERT(!hasParserBlockingScript()); | 289 ASSERT(!hasParserBlockingScript()); |
291 { | 290 { |
292 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(script); | 291 ScriptLoader* scriptLoader = toScriptLoaderIfPossible(script); |
293 | 292 |
294 // This contains both and ASSERTION and a null check since we should not | 293 // This contains both and ASSERTION and a null check since we should not |
295 // be getting into the case of a null script element, but seem to be fro
m | 294 // be getting into the case of a null script element, but seem to be fro
m |
296 // time to time. The assertion is left in to help find those cases and | 295 // time to time. The assertion is left in to help find those cases and |
297 // is being tracked by <https://bugs.webkit.org/show_bug.cgi?id=60559>. | 296 // is being tracked by <https://bugs.webkit.org/show_bug.cgi?id=60559>. |
298 ASSERT(scriptLoader); | 297 ASSERT(scriptLoader); |
299 if (!scriptLoader) | 298 if (!scriptLoader) |
300 return; | 299 return; |
301 | 300 |
302 ASSERT(scriptLoader->isParserInserted()); | 301 ASSERT(scriptLoader->isParserInserted()); |
303 | 302 |
304 if (!isExecutingScript()) | 303 if (!isExecutingScript()) |
305 Microtask::performCheckpoint(); | 304 Microtask::performCheckpoint(); |
306 | 305 |
307 InsertionPointRecord insertionPointRecord(m_host->inputStream()); | 306 InsertionPointRecord insertionPointRecord(m_host->inputStream()); |
308 NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); | 307 NestingLevelIncrementer nestingLevelIncrementer(m_scriptNestingLevel); |
309 | 308 |
310 scriptLoader->prepareScript(scriptStartPosition); | 309 ScriptPrep prep = scriptLoader->prepareScript(scriptStartPosition); |
311 | 310 |
312 if (!scriptLoader->willBeParserExecuted()) | 311 if (!scriptLoader->willBeParserExecuted()) |
313 return; | 312 return; |
314 | 313 |
315 if (scriptLoader->willExecuteWhenDocumentFinishedParsing()) { | 314 if (scriptLoader->willExecuteWhenDocumentFinishedParsing()) { |
316 requestDeferredScript(script); | 315 requestDeferredScript(prep.resource(), script); |
317 } else if (scriptLoader->readyToBeParserExecuted()) { | 316 } else if (scriptLoader->readyToBeParserExecuted()) { |
318 if (m_scriptNestingLevel == 1) { | 317 if (m_scriptNestingLevel == 1) { |
319 m_parserBlockingScript.setElement(script); | 318 m_parserBlockingScript.setElement(script); |
320 m_parserBlockingScript.setStartingPosition(scriptStartPosition); | 319 m_parserBlockingScript.setStartingPosition(scriptStartPosition); |
321 } else { | 320 } else { |
322 ScriptSourceCode sourceCode(script->textContent(), documentURLFo
rScriptExecution(m_document), scriptStartPosition); | 321 ScriptSourceCode sourceCode(script->textContent(), documentURLFo
rScriptExecution(m_document), scriptStartPosition); |
323 scriptLoader->executeScript(sourceCode); | 322 scriptLoader->executeScript(sourceCode); |
324 } | 323 } |
325 } else { | 324 } else { |
326 requestParsingBlockingScript(script); | 325 requestParsingBlockingScript(prep.resource(), script); |
327 } | 326 } |
328 } | 327 } |
329 } | 328 } |
330 | 329 |
331 } | 330 } |
OLD | NEW |