| 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 25 matching lines...) Expand all Loading... |
| 36 #include "public/platform/WebThread.h" | 36 #include "public/platform/WebThread.h" |
| 37 | 37 |
| 38 namespace blink { | 38 namespace blink { |
| 39 | 39 |
| 40 ScriptRunner::ScriptRunner(Document* document) | 40 ScriptRunner::ScriptRunner(Document* document) |
| 41 : m_document(document) | 41 : m_document(document) |
| 42 , m_taskRunner(Platform::current()->currentThread()->scheduler()->loadingTas
kRunner()) | 42 , m_taskRunner(Platform::current()->currentThread()->scheduler()->loadingTas
kRunner()) |
| 43 , m_numberOfInOrderScriptsWithPendingNotification(0) | 43 , m_numberOfInOrderScriptsWithPendingNotification(0) |
| 44 , m_isSuspended(false) | 44 , m_isSuspended(false) |
| 45 #if !ENABLE(OILPAN) | 45 #if !ENABLE(OILPAN) |
| 46 , m_isDisposed(false) |
| 46 , m_weakPointerFactoryForTasks(this) | 47 , m_weakPointerFactoryForTasks(this) |
| 47 #endif | 48 #endif |
| 48 { | 49 { |
| 49 ASSERT(document); | 50 ASSERT(document); |
| 50 #ifndef NDEBUG | 51 #ifndef NDEBUG |
| 51 m_hasEverBeenSuspended = false; | 52 m_hasEverBeenSuspended = false; |
| 52 #endif | 53 #endif |
| 53 } | 54 } |
| 54 | 55 |
| 55 ScriptRunner::~ScriptRunner() | 56 ScriptRunner::~ScriptRunner() |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 91 scriptLoader->detach(); | 92 scriptLoader->detach(); |
| 92 for (ScriptLoader* scriptLoader : m_inOrderScriptsToExecuteSoon) | 93 for (ScriptLoader* scriptLoader : m_inOrderScriptsToExecuteSoon) |
| 93 scriptLoader->detach(); | 94 scriptLoader->detach(); |
| 94 for (ScriptLoader* scriptLoader : m_asyncScriptsToExecuteSoon) | 95 for (ScriptLoader* scriptLoader : m_asyncScriptsToExecuteSoon) |
| 95 scriptLoader->detach(); | 96 scriptLoader->detach(); |
| 96 | 97 |
| 97 m_pendingInOrderScripts.clear(); | 98 m_pendingInOrderScripts.clear(); |
| 98 m_pendingAsyncScripts.clear(); | 99 m_pendingAsyncScripts.clear(); |
| 99 m_inOrderScriptsToExecuteSoon.clear(); | 100 m_inOrderScriptsToExecuteSoon.clear(); |
| 100 m_asyncScriptsToExecuteSoon.clear(); | 101 m_asyncScriptsToExecuteSoon.clear(); |
| 102 m_isDisposed = true; |
| 101 } | 103 } |
| 102 #endif | 104 #endif |
| 103 | 105 |
| 104 void ScriptRunner::addPendingAsyncScript(ScriptLoader* scriptLoader) | 106 void ScriptRunner::addPendingAsyncScript(ScriptLoader* scriptLoader) |
| 105 { | 107 { |
| 106 m_document->incrementLoadEventDelayCount(); | 108 m_document->incrementLoadEventDelayCount(); |
| 107 m_pendingAsyncScripts.add(scriptLoader); | 109 m_pendingAsyncScripts.add(scriptLoader); |
| 108 } | 110 } |
| 109 | 111 |
| 110 void ScriptRunner::queueScriptForExecution(ScriptLoader* scriptLoader, Execution
Type executionType) | 112 void ScriptRunner::queueScriptForExecution(ScriptLoader* scriptLoader, Execution
Type executionType) |
| (...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 postTask(BLINK_FROM_HERE); | 188 postTask(BLINK_FROM_HERE); |
| 187 } | 189 } |
| 188 | 190 |
| 189 break; | 191 break; |
| 190 } | 192 } |
| 191 } | 193 } |
| 192 | 194 |
| 193 void ScriptRunner::notifyScriptLoadError(ScriptLoader* scriptLoader, ExecutionTy
pe executionType) | 195 void ScriptRunner::notifyScriptLoadError(ScriptLoader* scriptLoader, ExecutionTy
pe executionType) |
| 194 { | 196 { |
| 195 switch (executionType) { | 197 switch (executionType) { |
| 196 case ASYNC_EXECUTION: | 198 case ASYNC_EXECUTION: { |
| 199 bool foundLoader = m_pendingAsyncScripts.contains(scriptLoader); |
| 200 #if !ENABLE(OILPAN) |
| 201 // If the document and ScriptRunner has been disposed of, there's |
| 202 // no bookkeeping to be done here. |
| 203 foundLoader = foundLoader || m_isDisposed; |
| 204 #endif |
| 197 // RELEASE_ASSERT makes us crash in a controlled way in error cases | 205 // RELEASE_ASSERT makes us crash in a controlled way in error cases |
| 198 // where the ScriptLoader is associated with the wrong ScriptRunner | 206 // where the ScriptLoader is associated with the wrong ScriptRunner |
| 199 // (otherwise we'd cause a use-after-free in ~ScriptRunner when it tries | 207 // (otherwise we'd cause a use-after-free in ~ScriptRunner when it tries |
| 200 // to detach). | 208 // to detach). |
| 201 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(m_pendingAsyncScripts.contains(
scriptLoader)); | 209 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(foundLoader); |
| 202 m_pendingAsyncScripts.remove(scriptLoader); | 210 m_pendingAsyncScripts.remove(scriptLoader); |
| 203 break; | 211 break; |
| 204 | 212 } |
| 205 case IN_ORDER_EXECUTION: | 213 case IN_ORDER_EXECUTION: |
| 206 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(m_numberOfInOrderScriptsWithPen
dingNotification > 0); | 214 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(m_numberOfInOrderScriptsWithPen
dingNotification > 0); |
| 207 m_numberOfInOrderScriptsWithPendingNotification--; | 215 m_numberOfInOrderScriptsWithPendingNotification--; |
| 208 | 216 |
| 209 bool foundPendingScript = false; | 217 bool foundPendingScript = false; |
| 210 for (auto it = m_pendingInOrderScripts.begin(); it != m_pendingInOrderSc
ripts.end(); ++it) { | 218 for (auto it = m_pendingInOrderScripts.begin(); it != m_pendingInOrderSc
ripts.end(); ++it) { |
| 211 if (*it == scriptLoader) { | 219 if (*it == scriptLoader) { |
| 212 m_pendingInOrderScripts.remove(it); | 220 m_pendingInOrderScripts.remove(it); |
| 213 foundPendingScript = true; | 221 foundPendingScript = true; |
| 214 break; | 222 break; |
| 215 } | 223 } |
| 216 } | 224 } |
| 225 #if !ENABLE(OILPAN) |
| 226 foundPendingScript = foundPendingScript || m_isDisposed; |
| 227 #endif |
| 217 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(foundPendingScript); | 228 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(foundPendingScript); |
| 218 break; | 229 break; |
| 219 } | 230 } |
| 220 scriptLoader->detach(); | 231 scriptLoader->detach(); |
| 221 m_document->decrementLoadEventDelayCount(); | 232 m_document->decrementLoadEventDelayCount(); |
| 222 } | 233 } |
| 223 | 234 |
| 224 void ScriptRunner::movePendingAsyncScript(Document& oldDocument, Document& newDo
cument, ScriptLoader* scriptLoader) | 235 void ScriptRunner::movePendingAsyncScript(Document& oldDocument, Document& newDo
cument, ScriptLoader* scriptLoader) |
| 225 { | 236 { |
| 226 RefPtrWillBeRawPtr<Document> newContextDocument = newDocument.contextDocumen
t().get(); | 237 RefPtrWillBeRawPtr<Document> newContextDocument = newDocument.contextDocumen
t().get(); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 289 #if ENABLE(OILPAN) | 300 #if ENABLE(OILPAN) |
| 290 visitor->trace(m_document); | 301 visitor->trace(m_document); |
| 291 visitor->trace(m_pendingInOrderScripts); | 302 visitor->trace(m_pendingInOrderScripts); |
| 292 visitor->trace(m_pendingAsyncScripts); | 303 visitor->trace(m_pendingAsyncScripts); |
| 293 visitor->trace(m_asyncScriptsToExecuteSoon); | 304 visitor->trace(m_asyncScriptsToExecuteSoon); |
| 294 visitor->trace(m_inOrderScriptsToExecuteSoon); | 305 visitor->trace(m_inOrderScriptsToExecuteSoon); |
| 295 #endif | 306 #endif |
| 296 } | 307 } |
| 297 | 308 |
| 298 } // namespace blink | 309 } // namespace blink |
| OLD | NEW |