Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(250)

Side by Side Diff: third_party/WebKit/Source/core/dom/ScriptRunner.cpp

Issue 2238543002: Instrument parser blocking script execution time. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: address comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 30 matching lines...) Expand all
41 , m_taskRunner(Platform::current()->currentThread()->scheduler()->loadingTas kRunner()) 41 , m_taskRunner(Platform::current()->currentThread()->scheduler()->loadingTas kRunner())
42 , m_numberOfInOrderScriptsWithPendingNotification(0) 42 , m_numberOfInOrderScriptsWithPendingNotification(0)
43 , m_isSuspended(false) 43 , m_isSuspended(false)
44 { 44 {
45 DCHECK(document); 45 DCHECK(document);
46 #ifndef NDEBUG 46 #ifndef NDEBUG
47 m_hasEverBeenSuspended = false; 47 m_hasEverBeenSuspended = false;
48 #endif 48 #endif
49 } 49 }
50 50
51 void ScriptRunner::queueScriptForExecution(ScriptLoader* scriptLoader, Execution Type executionType) 51 void ScriptRunner::queueScriptForExecution(ScriptLoader* scriptLoader, AsyncExec utionType executionType)
52 { 52 {
53 DCHECK(scriptLoader); 53 DCHECK(scriptLoader);
54 m_document->incrementLoadEventDelayCount(); 54 m_document->incrementLoadEventDelayCount();
55 switch (executionType) { 55 switch (executionType) {
56 case ASYNC_EXECUTION: 56 case Async:
57 m_pendingAsyncScripts.add(scriptLoader); 57 m_pendingAsyncScripts.add(scriptLoader);
58 break; 58 break;
59 59
60 case IN_ORDER_EXECUTION: 60 case InOrder:
61 m_pendingInOrderScripts.append(scriptLoader); 61 m_pendingInOrderScripts.append(scriptLoader);
62 m_numberOfInOrderScriptsWithPendingNotification++; 62 m_numberOfInOrderScriptsWithPendingNotification++;
63 break; 63 break;
64 case None:
65 NOTREACHED();
66 break;
64 } 67 }
65 } 68 }
66 69
67 void ScriptRunner::postTask(const WebTraceLocation& webTraceLocation) 70 void ScriptRunner::postTask(const WebTraceLocation& webTraceLocation)
68 { 71 {
69 m_taskRunner->postTask(webTraceLocation, WTF::bind(&ScriptRunner::executeTas k, wrapWeakPersistent(this))); 72 m_taskRunner->postTask(webTraceLocation, WTF::bind(&ScriptRunner::executeTas k, wrapWeakPersistent(this)));
70 } 73 }
71 74
72 void ScriptRunner::suspend() 75 void ScriptRunner::suspend()
73 { 76 {
(...skipping 23 matching lines...) Expand all
97 while (!m_pendingInOrderScripts.isEmpty() && m_pendingInOrderScripts.first() ->isReady()) { 100 while (!m_pendingInOrderScripts.isEmpty() && m_pendingInOrderScripts.first() ->isReady()) {
98 // A ScriptLoader that failed is responsible for cancelling itself 101 // A ScriptLoader that failed is responsible for cancelling itself
99 // notifyScriptLoadError(); it continues this draining of ready scripts. 102 // notifyScriptLoadError(); it continues this draining of ready scripts.
100 if (m_pendingInOrderScripts.first()->errorOccurred()) 103 if (m_pendingInOrderScripts.first()->errorOccurred())
101 break; 104 break;
102 m_inOrderScriptsToExecuteSoon.append(m_pendingInOrderScripts.takeFirst() ); 105 m_inOrderScriptsToExecuteSoon.append(m_pendingInOrderScripts.takeFirst() );
103 postTask(BLINK_FROM_HERE); 106 postTask(BLINK_FROM_HERE);
104 } 107 }
105 } 108 }
106 109
107 void ScriptRunner::notifyScriptReady(ScriptLoader* scriptLoader, ExecutionType e xecutionType) 110 void ScriptRunner::notifyScriptReady(ScriptLoader* scriptLoader, AsyncExecutionT ype executionType)
108 { 111 {
109 SECURITY_CHECK(scriptLoader); 112 SECURITY_CHECK(scriptLoader);
110 switch (executionType) { 113 switch (executionType) {
111 case ASYNC_EXECUTION: 114 case Async:
112 // RELEASE_ASSERT makes us crash in a controlled way in error cases 115 // RELEASE_ASSERT makes us crash in a controlled way in error cases
113 // where the ScriptLoader is associated with the wrong ScriptRunner 116 // where the ScriptLoader is associated with the wrong ScriptRunner
114 // (otherwise we'd cause a use-after-free in ~ScriptRunner when it tries 117 // (otherwise we'd cause a use-after-free in ~ScriptRunner when it tries
115 // to detach). 118 // to detach).
116 SECURITY_CHECK(m_pendingAsyncScripts.contains(scriptLoader)); 119 SECURITY_CHECK(m_pendingAsyncScripts.contains(scriptLoader));
117 120
118 m_pendingAsyncScripts.remove(scriptLoader); 121 m_pendingAsyncScripts.remove(scriptLoader);
119 m_asyncScriptsToExecuteSoon.append(scriptLoader); 122 m_asyncScriptsToExecuteSoon.append(scriptLoader);
120 123
121 postTask(BLINK_FROM_HERE); 124 postTask(BLINK_FROM_HERE);
122 125
123 break; 126 break;
124 127
125 case IN_ORDER_EXECUTION: 128 case InOrder:
126 SECURITY_CHECK(m_numberOfInOrderScriptsWithPendingNotification > 0); 129 SECURITY_CHECK(m_numberOfInOrderScriptsWithPendingNotification > 0);
127 m_numberOfInOrderScriptsWithPendingNotification--; 130 m_numberOfInOrderScriptsWithPendingNotification--;
128 131
129 scheduleReadyInOrderScripts(); 132 scheduleReadyInOrderScripts();
130 133
131 break; 134 break;
135 case None:
136 NOTREACHED();
137 break;
132 } 138 }
133 } 139 }
134 140
135 bool ScriptRunner::removePendingInOrderScript(ScriptLoader* scriptLoader) 141 bool ScriptRunner::removePendingInOrderScript(ScriptLoader* scriptLoader)
136 { 142 {
137 for (auto it = m_pendingInOrderScripts.begin(); it != m_pendingInOrderScript s.end(); ++it) { 143 for (auto it = m_pendingInOrderScripts.begin(); it != m_pendingInOrderScript s.end(); ++it) {
138 if (*it == scriptLoader) { 144 if (*it == scriptLoader) {
139 m_pendingInOrderScripts.remove(it); 145 m_pendingInOrderScripts.remove(it);
140 SECURITY_CHECK(m_numberOfInOrderScriptsWithPendingNotification > 0); 146 SECURITY_CHECK(m_numberOfInOrderScriptsWithPendingNotification > 0);
141 m_numberOfInOrderScriptsWithPendingNotification--; 147 m_numberOfInOrderScriptsWithPendingNotification--;
142 return true; 148 return true;
143 } 149 }
144 } 150 }
145 return false; 151 return false;
146 } 152 }
147 153
148 void ScriptRunner::notifyScriptLoadError(ScriptLoader* scriptLoader, ExecutionTy pe executionType) 154 void ScriptRunner::notifyScriptLoadError(ScriptLoader* scriptLoader, AsyncExecut ionType executionType)
149 { 155 {
150 switch (executionType) { 156 switch (executionType) {
151 case ASYNC_EXECUTION: { 157 case Async: {
152 // SECURITY_CHECK makes us crash in a controlled way in error cases 158 // SECURITY_CHECK makes us crash in a controlled way in error cases
153 // where the ScriptLoader is associated with the wrong ScriptRunner 159 // where the ScriptLoader is associated with the wrong ScriptRunner
154 // (otherwise we'd cause a use-after-free in ~ScriptRunner when it tries 160 // (otherwise we'd cause a use-after-free in ~ScriptRunner when it tries
155 // to detach). 161 // to detach).
156 SECURITY_CHECK(m_pendingAsyncScripts.contains(scriptLoader)); 162 SECURITY_CHECK(m_pendingAsyncScripts.contains(scriptLoader));
157 m_pendingAsyncScripts.remove(scriptLoader); 163 m_pendingAsyncScripts.remove(scriptLoader);
158 break; 164 break;
159 } 165 }
160 case IN_ORDER_EXECUTION: 166 case InOrder:
161 SECURITY_CHECK(removePendingInOrderScript(scriptLoader)); 167 SECURITY_CHECK(removePendingInOrderScript(scriptLoader));
162 scheduleReadyInOrderScripts(); 168 scheduleReadyInOrderScripts();
163 break; 169 break;
170 case None:
171 NOTREACHED();
172 break;
164 } 173 }
165 m_document->decrementLoadEventDelayCount(); 174 m_document->decrementLoadEventDelayCount();
166 } 175 }
167 176
168 void ScriptRunner::movePendingScript(Document& oldDocument, Document& newDocumen t, ScriptLoader* scriptLoader) 177 void ScriptRunner::movePendingScript(Document& oldDocument, Document& newDocumen t, ScriptLoader* scriptLoader)
169 { 178 {
170 Document* newContextDocument = newDocument.contextDocument(); 179 Document* newContextDocument = newDocument.contextDocument();
171 if (!newContextDocument) { 180 if (!newContextDocument) {
172 // Document's contextDocument() method will return no Document if the 181 // Document's contextDocument() method will return no Document if the
173 // following conditions both hold: 182 // following conditions both hold:
(...skipping 13 matching lines...) Expand all
187 DCHECK(!oldDocument.frame()); 196 DCHECK(!oldDocument.frame());
188 oldContextDocument = &oldDocument; 197 oldContextDocument = &oldDocument;
189 } 198 }
190 if (oldContextDocument != newContextDocument) 199 if (oldContextDocument != newContextDocument)
191 oldContextDocument->scriptRunner()->movePendingScript(newContextDocument ->scriptRunner(), scriptLoader); 200 oldContextDocument->scriptRunner()->movePendingScript(newContextDocument ->scriptRunner(), scriptLoader);
192 } 201 }
193 202
194 void ScriptRunner::movePendingScript(ScriptRunner* newRunner, ScriptLoader* scri ptLoader) 203 void ScriptRunner::movePendingScript(ScriptRunner* newRunner, ScriptLoader* scri ptLoader)
195 { 204 {
196 if (m_pendingAsyncScripts.contains(scriptLoader)) { 205 if (m_pendingAsyncScripts.contains(scriptLoader)) {
197 newRunner->queueScriptForExecution(scriptLoader, ASYNC_EXECUTION); 206 newRunner->queueScriptForExecution(scriptLoader, Async);
198 m_pendingAsyncScripts.remove(scriptLoader); 207 m_pendingAsyncScripts.remove(scriptLoader);
199 m_document->decrementLoadEventDelayCount(); 208 m_document->decrementLoadEventDelayCount();
200 return; 209 return;
201 } 210 }
202 if (removePendingInOrderScript(scriptLoader)) { 211 if (removePendingInOrderScript(scriptLoader)) {
203 newRunner->queueScriptForExecution(scriptLoader, IN_ORDER_EXECUTION); 212 newRunner->queueScriptForExecution(scriptLoader, InOrder);
204 m_document->decrementLoadEventDelayCount(); 213 m_document->decrementLoadEventDelayCount();
205 } 214 }
206 } 215 }
207 216
208 // Returns true if task was run, and false otherwise. 217 // Returns true if task was run, and false otherwise.
209 bool ScriptRunner::executeTaskFromQueue(HeapDeque<Member<ScriptLoader>>* taskQue ue) 218 bool ScriptRunner::executeTaskFromQueue(HeapDeque<Member<ScriptLoader>>* taskQue ue)
210 { 219 {
211 if (taskQueue->isEmpty()) 220 if (taskQueue->isEmpty())
212 return false; 221 return false;
213 taskQueue->takeFirst()->execute(); 222 taskQueue->takeFirst()->execute();
(...skipping 22 matching lines...) Expand all
236 DEFINE_TRACE(ScriptRunner) 245 DEFINE_TRACE(ScriptRunner)
237 { 246 {
238 visitor->trace(m_document); 247 visitor->trace(m_document);
239 visitor->trace(m_pendingInOrderScripts); 248 visitor->trace(m_pendingInOrderScripts);
240 visitor->trace(m_pendingAsyncScripts); 249 visitor->trace(m_pendingAsyncScripts);
241 visitor->trace(m_asyncScriptsToExecuteSoon); 250 visitor->trace(m_asyncScriptsToExecuteSoon);
242 visitor->trace(m_inOrderScriptsToExecuteSoon); 251 visitor->trace(m_inOrderScriptsToExecuteSoon);
243 } 252 }
244 253
245 } // namespace blink 254 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/ScriptRunner.h ('k') | third_party/WebKit/Source/core/dom/ScriptRunnerTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698