Chromium Code Reviews| Index: chrome/renderer/chrome_render_view_observer.cc |
| diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc |
| index 1e8144cc67b097c0bbc0dc924fc4fb0c1f1f3393..bd018d66acc089eea6ee4dcfd8736184d8bbbf1b 100644 |
| --- a/chrome/renderer/chrome_render_view_observer.cc |
| +++ b/chrome/renderer/chrome_render_view_observer.cc |
| @@ -10,7 +10,7 @@ |
| #include "base/debug/trace_event.h" |
| #include "base/message_loop.h" |
| #include "base/metrics/histogram.h" |
| -#include "base/string_util.h" |
| +#include "base/utf_string_conversions.h" |
| #include "chrome/common/chrome_constants.h" |
| #include "chrome/common/chrome_switches.h" |
| #include "chrome/common/prerender_messages.h" |
| @@ -40,14 +40,18 @@ |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebAccessibilityObject.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebDataSource.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebElement.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h" |
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebNodeList.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h" |
| #include "ui/base/ui_base_switches_util.h" |
| #include "ui/gfx/favicon_size.h" |
| #include "ui/gfx/size.h" |
| #include "ui/gfx/skbitmap_operations.h" |
| #include "v8/include/v8-testing.h" |
| +#include "webkit/glue/dom_operations.h" |
| #include "webkit/glue/image_decoder.h" |
| #include "webkit/glue/multi_resolution_image_resource_fetcher.h" |
| #include "webkit/glue/webkit_glue.h" |
| @@ -56,9 +60,12 @@ using WebKit::WebAccessibilityObject; |
| using WebKit::WebCString; |
| using WebKit::WebDataSource; |
| using WebKit::WebDocument; |
| +using WebKit::WebElement; |
| using WebKit::WebFrame; |
| using WebKit::WebGestureEvent; |
| using WebKit::WebIconURL; |
| +using WebKit::WebNode; |
| +using WebKit::WebNodeList; |
| using WebKit::WebRect; |
| using WebKit::WebSecurityOrigin; |
| using WebKit::WebSize; |
| @@ -191,6 +198,34 @@ ChromeRenderViewObserver::ChromeRenderViewObserver( |
| ChromeRenderViewObserver::~ChromeRenderViewObserver() { |
| } |
| +// static |
| +bool ChromeRenderViewObserver::HasRefreshMetaTag(WebFrame* frame) { |
| + if (!frame) |
| + return false; |
|
Takashi Toyoshima
2013/05/14 14:38:29
webkit_glue::GetMetaElementsWithAttribute is remov
|
| + WebElement head = frame->document().head(); |
| + if (head.isNull() || !head.hasChildNodes()) |
| + return false; |
| + |
| + const WebString tag_name(ASCIIToUTF16("meta")); |
| + const WebString attribute_name(ASCIIToUTF16("http-equiv")); |
| + const WebString attribute_value(ASCIIToUTF16("refresh")); |
| + |
| + WebNodeList children = head.childNodes(); |
| + for (size_t i = 0; i < children.length(); ++i) { |
| + WebNode node = children.item(i); |
| + if (!node.isElementNode()) |
| + continue; |
| + WebElement element = node.to<WebElement>(); |
| + if (!element.hasTagName(tag_name)) |
| + continue; |
| + WebString value = element.getAttribute(attribute_name); |
| + if (value.isNull() || value != attribute_value) |
| + continue; |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| bool ChromeRenderViewObserver::OnMessageReceived(const IPC::Message& message) { |
| bool handled = true; |
| IPC_BEGIN_MESSAGE_MAP(ChromeRenderViewObserver, message) |
| @@ -624,12 +659,6 @@ void ChromeRenderViewObserver::DidStartLoading() { |
| } |
| void ChromeRenderViewObserver::DidStopLoading() { |
| - CapturePageInfoLater( |
| - false, // preliminary_capture |
| - base::TimeDelta::FromMilliseconds( |
| - render_view()->GetContentStateImmediately() ? |
| - 0 : kDelayForCaptureMs)); |
| - |
| WebFrame* main_frame = render_view()->GetWebView()->mainFrame(); |
| GURL osd_url = main_frame->document().openSearchDescriptionURL(); |
| if (!osd_url.is_empty()) { |
| @@ -637,14 +666,27 @@ void ChromeRenderViewObserver::DidStopLoading() { |
| routing_id(), render_view()->GetPageId(), osd_url, |
| search_provider::AUTODETECTED_PROVIDER)); |
| } |
| + |
| + // Don't capture pages including refresh meta tag. |
| + if (HasRefreshMetaTag(main_frame)) |
| + return; |
| + |
| + CapturePageInfoLater( |
| + render_view()->GetPageId(), |
| + false, // preliminary_capture |
| + base::TimeDelta::FromMilliseconds( |
| + render_view()->GetContentStateImmediately() ? |
| + 0 : kDelayForCaptureMs)); |
| } |
| void ChromeRenderViewObserver::DidCommitProvisionalLoad( |
| WebFrame* frame, bool is_new_navigation) { |
| - if (!is_new_navigation) |
| + // Don't capture pages being not new, or including refresh meta tag. |
| + if (!is_new_navigation || HasRefreshMetaTag(frame)) |
| return; |
| CapturePageInfoLater( |
| + render_view()->GetPageId(), |
| true, // preliminary_capture |
| base::TimeDelta::FromMilliseconds(kDelayForForcedCaptureMs)); |
| } |
| @@ -669,18 +711,23 @@ void ChromeRenderViewObserver::DidHandleGestureEvent( |
| text_input_type != WebKit::WebTextInputTypeNone)); |
| } |
| -void ChromeRenderViewObserver::CapturePageInfoLater(bool preliminary_capture, |
| +void ChromeRenderViewObserver::CapturePageInfoLater(int page_id, |
| + bool preliminary_capture, |
| base::TimeDelta delay) { |
| capture_timer_.Start( |
| FROM_HERE, |
| delay, |
| base::Bind(&ChromeRenderViewObserver::CapturePageInfo, |
| base::Unretained(this), |
| + page_id, |
| preliminary_capture)); |
| } |
| -void ChromeRenderViewObserver::CapturePageInfo(bool preliminary_capture) { |
| - int page_id = render_view()->GetPageId(); |
| +void ChromeRenderViewObserver::CapturePageInfo(int page_id, |
| + bool preliminary_capture) { |
| + // If |page_id| is obsolete, we should stop indexing and capturing a page. |
| + if (render_view()->GetPageId() != page_id) |
| + return; |
| if (!render_view()->GetWebView()) |
| return; |