Index: chrome/renderer/chrome_render_frame_observer.cc |
diff --git a/chrome/renderer/chrome_render_frame_observer.cc b/chrome/renderer/chrome_render_frame_observer.cc |
index 9fd19893f6daa9b2a071ad61e512ce34570c44f0..23aafc61a47194873271c98d86ccaae1738b7864 100644 |
--- a/chrome/renderer/chrome_render_frame_observer.cc |
+++ b/chrome/renderer/chrome_render_frame_observer.cc |
@@ -53,6 +53,15 @@ |
using content::SSLStatus; |
using content::RenderFrame; |
+// Delay in milliseconds that we'll wait before capturing the page contents. |
+static const int kDelayForCaptureMs = 500; |
+ |
+// Typically, we capture the page data once the page is loaded. |
+// Sometimes, the page never finishes to load, preventing the page capture |
+// To workaround this problem, we always perform a capture after the following |
+// delay. |
+static const int kDelayForForcedCaptureMs = 6000; |
+ |
// Maximum number of characters in the document to index. |
// Any text beyond this point will be clipped. |
static const size_t kMaxIndexChars = 65535; |
@@ -103,6 +112,7 @@ |
ChromeRenderFrameObserver::ChromeRenderFrameObserver( |
content::RenderFrame* render_frame) |
: content::RenderFrameObserver(render_frame), |
+ capture_timer_(false, false), |
translate_helper_(nullptr), |
phishing_classifier_(nullptr) { |
// Don't do anything for subframes. |
@@ -297,12 +307,16 @@ |
search_provider::AUTODETECTED_PROVIDER)); |
} |
- // TODO(dglazkov): This is only necessary for ChromeRenderViewTests, |
- // since they don't actually pump frames. These tests will need |
- // to be rewritten eventually (there is no ChromeRenderView anymore). |
- if (render_frame()->GetRenderView()->GetContentStateImmediately()) { |
- CapturePageText(PRELIMINARY_CAPTURE); |
- } |
+ // Don't capture pages that have pending redirect or location change. |
+ if (frame->isNavigationScheduled()) |
+ return; |
+ |
+ CapturePageTextLater( |
+ FINAL_CAPTURE, |
+ base::TimeDelta::FromMilliseconds( |
+ render_frame()->GetRenderView()->GetContentStateImmediately() |
+ ? 0 |
+ : kDelayForCaptureMs)); |
} |
void ChromeRenderFrameObserver::DidStartProvisionalLoad() { |
@@ -323,9 +337,17 @@ |
if (frame->parent()) |
return; |
+ // Don't capture pages being not new, with pending redirect, or location |
+ // change. |
+ if (!is_new_navigation || frame->isNavigationScheduled()) |
+ return; |
+ |
base::debug::SetCrashKeyValue( |
crash_keys::kViewCount, |
base::SizeTToString(content::RenderView::GetRenderViewCount())); |
+ |
+ CapturePageTextLater(PRELIMINARY_CAPTURE, base::TimeDelta::FromMilliseconds( |
+ kDelayForForcedCaptureMs)); |
} |
void ChromeRenderFrameObserver::CapturePageText(TextCaptureType capture_type) { |
@@ -333,10 +355,6 @@ |
if (!frame) |
return; |
- // Don't capture pages that have pending redirect or location change. |
- if (frame->isNavigationScheduled()) |
- return; |
- |
// Don't index/capture pages that are in view source mode. |
if (frame->isViewSourceModeEnabled()) |
return; |
@@ -359,9 +377,7 @@ |
UMA_HISTOGRAM_TIMES(kTranslateCaptureText, |
base::TimeTicks::Now() - capture_begin_time); |
- // We should run language detection only once. Parsing finishes before |
- // the page loads, so let's pick that timing. |
- if (translate_helper_ && capture_type == PRELIMINARY_CAPTURE) |
+ if (translate_helper_) |
translate_helper_->PageCaptured(contents); |
TRACE_EVENT0("renderer", "ChromeRenderFrameObserver::CapturePageText"); |
@@ -374,16 +390,10 @@ |
#endif |
} |
-void ChromeRenderFrameObserver::DidMeaningfulLayout( |
- blink::WebMeaningfulLayout layout_type) { |
- switch (layout_type) { |
- case blink::WebMeaningfulLayout::FinishedParsing: |
- CapturePageText(PRELIMINARY_CAPTURE); |
- break; |
- case blink::WebMeaningfulLayout::FinishedLoading: |
- CapturePageText(FINAL_CAPTURE); |
- break; |
- default: |
- break; |
- } |
-} |
+void ChromeRenderFrameObserver::CapturePageTextLater( |
+ TextCaptureType capture_type, |
+ base::TimeDelta delay) { |
+ capture_timer_.Start(FROM_HERE, delay, |
+ base::Bind(&ChromeRenderFrameObserver::CapturePageText, |
+ base::Unretained(this), capture_type)); |
+} |