summaryrefslogtreecommitdiffstats
path: root/chrome/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/renderer')
-rw-r--r--chrome/renderer/chrome_render_view_observer.cc91
-rw-r--r--chrome/renderer/chrome_render_view_observer.h9
2 files changed, 75 insertions, 25 deletions
diff --git a/chrome/renderer/chrome_render_view_observer.cc b/chrome/renderer/chrome_render_view_observer.cc
index 5b85863..e8d6b5e 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,8 +40,11 @@
#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"
@@ -55,9 +58,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;
@@ -422,18 +428,6 @@ bool ChromeRenderViewObserver::allowWriteToClipboard(WebFrame* frame,
return allowed;
}
-const extensions::Extension* ChromeRenderViewObserver::GetExtension(
- const WebSecurityOrigin& origin) const {
- if (!EqualsASCII(origin.protocol(), extensions::kExtensionScheme))
- return NULL;
-
- const std::string extension_id = origin.host().utf8().data();
- if (!extension_dispatcher_->IsExtensionActive(extension_id))
- return NULL;
-
- return extension_dispatcher_->extensions()->GetByID(extension_id);
-}
-
bool ChromeRenderViewObserver::allowWebComponents(const WebDocument& document,
bool defaultValue) {
if (defaultValue)
@@ -635,12 +629,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()) {
@@ -648,14 +636,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));
}
@@ -680,18 +681,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;
@@ -814,3 +820,42 @@ ExternalHostBindings* ChromeRenderViewObserver::GetExternalHostBindings() {
bool ChromeRenderViewObserver::IsStrictSecurityHost(const std::string& host) {
return (strict_security_hosts_.find(host) != strict_security_hosts_.end());
}
+
+const extensions::Extension* ChromeRenderViewObserver::GetExtension(
+ const WebSecurityOrigin& origin) const {
+ if (!EqualsASCII(origin.protocol(), extensions::kExtensionScheme))
+ return NULL;
+
+ const std::string extension_id = origin.host().utf8().data();
+ if (!extension_dispatcher_->IsExtensionActive(extension_id))
+ return NULL;
+
+ return extension_dispatcher_->extensions()->GetByID(extension_id);
+}
+
+bool ChromeRenderViewObserver::HasRefreshMetaTag(WebFrame* frame) {
+ if (!frame)
+ return false;
+ 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;
+}
diff --git a/chrome/renderer/chrome_render_view_observer.h b/chrome/renderer/chrome_render_view_observer.h
index 20fe6d5..371cf1d 100644
--- a/chrome/renderer/chrome_render_view_observer.h
+++ b/chrome/renderer/chrome_render_view_observer.h
@@ -146,11 +146,13 @@ class ChromeRenderViewObserver : public content::RenderViewObserver,
bool animate);
#endif
- void CapturePageInfoLater(bool preliminary_capture, base::TimeDelta delay);
+ void CapturePageInfoLater(int page_id,
+ bool preliminary_capture,
+ base::TimeDelta delay);
// Captures the thumbnail and text contents for indexing for the given load
// ID. Kicks off analysis of the captured text.
- void CapturePageInfo(bool preliminary_capture);
+ void CapturePageInfo(int page_id, bool preliminary_capture);
// Retrieves the text from the given frame contents, the page text up to the
// maximum amount kMaxIndexChars will be placed into the given buffer.
@@ -166,6 +168,9 @@ class ChromeRenderViewObserver : public content::RenderViewObserver,
const extensions::Extension* GetExtension(
const WebKit::WebSecurityOrigin& origin) const;
+ // Checks if a page contains <meta http-equiv="refresh" ...> tag.
+ bool HasRefreshMetaTag(WebKit::WebFrame* frame);
+
// Save the JavaScript to preload if a ViewMsg_WebUIJavaScript is received.
scoped_ptr<WebUIJavaScript> webui_javascript_;