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

Side by Side Diff: Source/core/dom/Document.cpp

Issue 20140002: Remove minimumLayoutDelay() and associated machinery (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: another fix Created 7 years, 5 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 | Annotate | Revision Log
OLDNEW
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 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 using namespace Unicode; 177 using namespace Unicode;
178 178
179 namespace WebCore { 179 namespace WebCore {
180 180
181 using namespace HTMLNames; 181 using namespace HTMLNames;
182 182
183 static const double cDefaultIncrementalRenderingSuppressionTimeoutInSeconds = 5; 183 static const double cDefaultIncrementalRenderingSuppressionTimeoutInSeconds = 5;
184 184
185 static const unsigned cMaxWriteRecursionDepth = 21; 185 static const unsigned cMaxWriteRecursionDepth = 21;
186 186
187 // This amount of time must have elapsed before we will even consider scheduling a layout without a delay.
188 // FIXME: For faster machines this value can really be lowered to 200. 250 is a dequate, but a little high
189 // for dual G5s. :)
190 static const int cLayoutScheduleThreshold = 250;
191 187
192 // DOM Level 2 says (letters added): 188 // DOM Level 2 says (letters added):
193 // 189 //
194 // a) Name start characters must have one of the categories Ll, Lu, Lo, Lt, Nl. 190 // a) Name start characters must have one of the categories Ll, Lu, Lo, Lt, Nl.
195 // b) Name characters other than Name-start characters must have one of the cate gories Mc, Me, Mn, Lm, or Nd. 191 // b) Name characters other than Name-start characters must have one of the cate gories Mc, Me, Mn, Lm, or Nd.
196 // c) Characters in the compatibility area (i.e. with character code greater tha n #xF900 and less than #xFFFE) are not allowed in XML names. 192 // c) Characters in the compatibility area (i.e. with character code greater tha n #xF900 and less than #xFFFE) are not allowed in XML names.
197 // d) Characters which have a font or compatibility decomposition (i.e. those wi th a "compatibility formatting tag" in field 5 of the database -- marked by fiel d 5 beginning with a "<") are not allowed. 193 // d) Characters which have a font or compatibility decomposition (i.e. those wi th a "compatibility formatting tag" in field 5 of the database -- marked by fiel d 5 beginning with a "<") are not allowed.
198 // e) The following characters are treated as name-start characters rather than name characters, because the property file classifies them as Alphabetic: [#x02B B-#x02C1], #x0559, #x06E5, #x06E6. 194 // e) The following characters are treated as name-start characters rather than name characters, because the property file classifies them as Alphabetic: [#x02B B-#x02C1], #x0559, #x06E5, #x06E6.
199 // f) Characters #x20DD-#x20E0 are excluded (in accordance with Unicode, section 5.14). 195 // f) Characters #x20DD-#x20E0 are excluded (in accordance with Unicode, section 5.14).
200 // g) Character #x00B7 is classified as an extender, because the property list s o identifies it. 196 // g) Character #x00B7 is classified as an extender, because the property list s o identifies it.
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 , m_gotoAnchorNeededAfterStylesheetsLoad(false) 396 , m_gotoAnchorNeededAfterStylesheetsLoad(false)
401 , m_containsValidityStyleRules(false) 397 , m_containsValidityStyleRules(false)
402 , m_updateFocusAppearanceRestoresSelection(false) 398 , m_updateFocusAppearanceRestoresSelection(false)
403 , m_ignoreDestructiveWriteCount(0) 399 , m_ignoreDestructiveWriteCount(0)
404 , m_titleSetExplicitly(false) 400 , m_titleSetExplicitly(false)
405 , m_markers(adoptPtr(new DocumentMarkerController)) 401 , m_markers(adoptPtr(new DocumentMarkerController))
406 , m_updateFocusAppearanceTimer(this, &Document::updateFocusAppearanceTimerFi red) 402 , m_updateFocusAppearanceTimer(this, &Document::updateFocusAppearanceTimerFi red)
407 , m_cssTarget(0) 403 , m_cssTarget(0)
408 , m_processingLoadEvent(false) 404 , m_processingLoadEvent(false)
409 , m_loadEventFinished(false) 405 , m_loadEventFinished(false)
410 , m_startTime(currentTime())
411 , m_overMinimumLayoutThreshold(false)
412 , m_scriptRunner(ScriptRunner::create(this)) 406 , m_scriptRunner(ScriptRunner::create(this))
413 , m_xmlVersion("1.0") 407 , m_xmlVersion(ASCIILiteral("1.0"))
414 , m_xmlStandalone(StandaloneUnspecified) 408 , m_xmlStandalone(StandaloneUnspecified)
415 , m_hasXMLDeclaration(0) 409 , m_hasXMLDeclaration(0)
416 , m_designMode(inherit) 410 , m_designMode(inherit)
417 , m_hasAnnotatedRegions(false) 411 , m_hasAnnotatedRegions(false)
418 , m_annotatedRegionsDirty(false) 412 , m_annotatedRegionsDirty(false)
419 , m_useSecureKeyboardEntryWhenActive(false) 413 , m_useSecureKeyboardEntryWhenActive(false)
420 , m_documentClasses(documentClasses) 414 , m_documentClasses(documentClasses)
421 , m_isViewSource(false) 415 , m_isViewSource(false)
422 , m_sawElementsInKnownNamespaces(false) 416 , m_sawElementsInKnownNamespaces(false)
423 , m_isSrcdocDocument(false) 417 , m_isSrcdocDocument(false)
(...skipping 743 matching lines...) Expand 10 before | Expand all | Expand 10 after
1167 1161
1168 void Document::setContent(const String& content) 1162 void Document::setContent(const String& content)
1169 { 1163 {
1170 open(); 1164 open();
1171 // FIXME: This should probably use insert(), but that's (intentionally) 1165 // FIXME: This should probably use insert(), but that's (intentionally)
1172 // not implemented for the XML parser as it's normally synonymous with 1166 // not implemented for the XML parser as it's normally synonymous with
1173 // document.write(). append() will end up yielding, but close() will 1167 // document.write(). append() will end up yielding, but close() will
1174 // pump the tokenizer syncrhonously and finish the parse. 1168 // pump the tokenizer syncrhonously and finish the parse.
1175 m_parser->pinToMainThread(); 1169 m_parser->pinToMainThread();
1176 m_parser->append(content.impl()); 1170 m_parser->append(content.impl());
1171 // FIXME: Append may yield for script execution. Unclear if close()
1172 // will wait for the parse to complete before returning or not.
1177 close(); 1173 close();
1178 } 1174 }
1179 1175
1180 String Document::suggestedMIMEType() const 1176 String Document::suggestedMIMEType() const
1181 { 1177 {
1182 if (isXHTMLDocument()) 1178 if (isXHTMLDocument())
1183 return "application/xhtml+xml"; 1179 return "application/xhtml+xml";
1184 if (isSVGDocument()) 1180 if (isSVGDocument())
1185 return "image/svg+xml"; 1181 return "image/svg+xml";
1186 if (xmlStandalone()) 1182 if (xmlStandalone())
(...skipping 1048 matching lines...) Expand 10 before | Expand all | Expand 10 after
2235 2231
2236 if (f) 2232 if (f)
2237 f->loader()->handledOnloadEvents(); 2233 f->loader()->handledOnloadEvents();
2238 2234
2239 // An event handler may have removed the frame 2235 // An event handler may have removed the frame
2240 if (!frame()) { 2236 if (!frame()) {
2241 m_processingLoadEvent = false; 2237 m_processingLoadEvent = false;
2242 return; 2238 return;
2243 } 2239 }
2244 2240
2245 // Make sure both the initial layout and reflow happen after the onload
2246 // fires. This will improve onload scores, and other browsers do it.
2247 // If they wanna cheat, we can too. -dwh
2248
2249 if (frame()->navigationScheduler()->locationChangePending() && elapsedTime() < cLayoutScheduleThreshold) {
2250 // Just bail out. Before or during the onload we were shifted to another page.
2251 // The old i-Bench suite does this. When this happens don't bother paint ing or laying out.
2252 m_processingLoadEvent = false;
2253 view()->unscheduleRelayout();
2254 return;
2255 }
2256
2257 frame()->loader()->checkCallImplicitClose(); 2241 frame()->loader()->checkCallImplicitClose();
2258 RenderObject* renderObject = renderer(); 2242 RenderObject* renderObject = renderer();
2259 2243
2260 // We used to force a synchronous display and flush here. This really isn't 2244 // We used to force a synchronous display and flush here. This really isn't
2261 // necessary and can in fact be actively harmful if pages are loading at a r ate of > 60fps 2245 // necessary and can in fact be actively harmful if pages are loading at a r ate of > 60fps
2262 // (if your platform is syncing flushes and limiting them to 60fps). 2246 // (if your platform is syncing flushes and limiting them to 60fps).
2263 m_overMinimumLayoutThreshold = true;
2264 if (!ownerElement() || (ownerElement()->renderer() && !ownerElement()->rende rer()->needsLayout())) { 2247 if (!ownerElement() || (ownerElement()->renderer() && !ownerElement()->rende rer()->needsLayout())) {
2265 updateStyleIfNeeded(); 2248 updateStyleIfNeeded();
2266 2249
2267 // Always do a layout after loading if needed. 2250 // Always do a layout after loading if needed.
2268 if (view() && renderObject && (!renderObject->firstChild() || renderObje ct->needsLayout())) 2251 if (view() && renderObject && (!renderObject->firstChild() || renderObje ct->needsLayout()))
2269 view()->layout(); 2252 view()->layout();
2270 } 2253 }
2271 2254
2272 m_processingLoadEvent = false; 2255 m_processingLoadEvent = false;
2273 2256
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
2308 // This function will only be called when FrameView thinks a layout is neede d. 2291 // This function will only be called when FrameView thinks a layout is neede d.
2309 // This enforces a couple extra rules. 2292 // This enforces a couple extra rules.
2310 // 2293 //
2311 // (a) Only schedule a layout once the stylesheets are loaded. 2294 // (a) Only schedule a layout once the stylesheets are loaded.
2312 // (b) Only schedule layout once we have a body element. 2295 // (b) Only schedule layout once we have a body element.
2313 2296
2314 return (haveStylesheetsLoaded() && body()) 2297 return (haveStylesheetsLoaded() && body())
2315 || (documentElement() && !isHTMLHtmlElement(documentElement())); 2298 || (documentElement() && !isHTMLHtmlElement(documentElement()));
2316 } 2299 }
2317 2300
2318 bool Document::isLayoutTimerActive() 2301 bool Document::parserShouldYieldAgressivelyBeforeFirstLayout()
2319 { 2302 {
2320 return view() && view()->layoutPending() && !minimumLayoutDelay(); 2303 return view() && view()->layoutPending();
2321 }
2322
2323 int Document::minimumLayoutDelay()
2324 {
2325 if (m_overMinimumLayoutThreshold)
2326 return 0;
2327
2328 int elapsed = elapsedTime();
2329 m_overMinimumLayoutThreshold = elapsed > cLayoutScheduleThreshold;
2330
2331 // We'll want to schedule the timer to fire at the minimum layout threshold.
2332 return max(0, cLayoutScheduleThreshold - elapsed);
2333 }
2334
2335 int Document::elapsedTime() const
2336 {
2337 return static_cast<int>((currentTime() - m_startTime) * 1000);
2338 } 2304 }
2339 2305
2340 void Document::write(const SegmentedString& text, Document* ownerDocument) 2306 void Document::write(const SegmentedString& text, Document* ownerDocument)
2341 { 2307 {
2342 NestingLevelIncrementer nestingLevelIncrementer(m_writeRecursionDepth); 2308 NestingLevelIncrementer nestingLevelIncrementer(m_writeRecursionDepth);
2343 2309
2344 m_writeRecursionIsTooDeep = (m_writeRecursionDepth > 1) && m_writeRecursionI sTooDeep; 2310 m_writeRecursionIsTooDeep = (m_writeRecursionDepth > 1) && m_writeRecursionI sTooDeep;
2345 m_writeRecursionIsTooDeep = (m_writeRecursionDepth > cMaxWriteRecursionDepth ) || m_writeRecursionIsTooDeep; 2311 m_writeRecursionIsTooDeep = (m_writeRecursionDepth > cMaxWriteRecursionDepth ) || m_writeRecursionIsTooDeep;
2346 2312
2347 if (m_writeRecursionIsTooDeep) 2313 if (m_writeRecursionIsTooDeep)
(...skipping 2737 matching lines...) Expand 10 before | Expand all | Expand 10 after
5085 { 5051 {
5086 return DocumentLifecycleNotifier::create(this); 5052 return DocumentLifecycleNotifier::create(this);
5087 } 5053 }
5088 5054
5089 DocumentLifecycleNotifier* Document::lifecycleNotifier() 5055 DocumentLifecycleNotifier* Document::lifecycleNotifier()
5090 { 5056 {
5091 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier()); 5057 return static_cast<DocumentLifecycleNotifier*>(ScriptExecutionContext::lifec ycleNotifier());
5092 } 5058 }
5093 5059
5094 } // namespace WebCore 5060 } // namespace WebCore
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698