Index: chrome/renderer/render_view.cc |
diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc |
index 95da38238263431dacd9c411746067adf1a5382c..80dcacfe82857fc2616d81724ffe48f9cceebed6 100644 |
--- a/chrome/renderer/render_view.cc |
+++ b/chrome/renderer/render_view.cc |
@@ -5806,6 +5806,42 @@ bool RenderView::IsNonLocalTopLevelNavigation( |
return false; |
} |
+bool RenderView::IsReadyToPaint() const { |
+ if (!webview() || !webview()->mainFrame()) |
+ return false; |
+ |
+ WebDocument doc = webview()->mainFrame()->document(); |
+ |
+ // There is no way to detect a paint readiness for non-(X)HTML page; |
+ // Just allows to paint. |
+ if (!doc.isHTMLDocument() && !doc.isXHTMLDocument()) |
+ return true; |
+ |
+ // The are some possible strategy to detect readiness: |
+ // - (1) Gets ready when the downloading started, or |
+ // - (2) Gets ready when the <head> contents are loaded, or |
+ // - (3) Gets ready when the whole HTML loaded, or |
+ // - (4) Gets ready when (3) plus whole external CSS loaded |
+ // |
+ // And here is a trade-off. |
+ // - Former can start page rendering earlier. |
+ // - Later can save page reflow and re-styling, thus avoid flickering. |
+ // |
+ // Current choice is (2). |
+ // More intelligent design might be desirable though. |
+ |
+ // If you have <body>, It is expected that preceding <head> contents |
+ // including inline <style> and <script> elements are totally loaded. |
+ // Also note that: |
+ // - WebKit generates <body> for images and plugins. |
+ // - WebKit generates missing <body> for ill-formed HTMLs. |
+ // - A <frameset> can be returned for body(). |
+ if ((doc.isNull() || doc.body().isNull())) |
+ return false; |
+ |
+ return true; |
+} |
+ |
void RenderView::OnOpenFileSystemRequestComplete( |
int request_id, bool accepted, const string16& name, |
const string16& root_path) { |