Index: components/dom_distiller/content/renderer/distillability_agent.cc |
diff --git a/components/dom_distiller/content/renderer/distillability_agent.cc b/components/dom_distiller/content/renderer/distillability_agent.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7422ff371b6bf80c9f930a8385668a0e5213c581 |
--- /dev/null |
+++ b/components/dom_distiller/content/renderer/distillability_agent.cc |
@@ -0,0 +1,113 @@ |
+// Copyright 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "components/dom_distiller/content/common/distiller_messages.h" |
+#include "components/dom_distiller/content/renderer/distillability_agent.h" |
+#include "components/dom_distiller/core/distillable_page_detector.h" |
+#include "components/dom_distiller/core/experiments.h" |
+#include "components/dom_distiller/core/page_features.h" |
+#include "content/public/renderer/render_frame.h" |
+ |
+#include "third_party/WebKit/public/platform/WebDistillability.h" |
+#include "third_party/WebKit/public/web/WebDocument.h" |
+#include "third_party/WebKit/public/web/WebElement.h" |
+#include "third_party/WebKit/public/web/WebLocalFrame.h" |
+#include "third_party/WebKit/public/web/WebNode.h" |
+#include "third_party/WebKit/public/web/WebNodeList.h" |
+ |
+namespace dom_distiller { |
+ |
+using namespace blink; |
+ |
+namespace { |
+ |
+bool needToUpdate(bool is_loaded) { |
+ switch (GetDistillerHeuristicsType()) { |
+ case DistillerHeuristicsType::ALWAYS_TRUE: |
+ return !is_loaded; |
+ case DistillerHeuristicsType::OG_ARTICLE: |
+ return !is_loaded; |
+ case DistillerHeuristicsType::ADABOOST_MODEL: |
+ return true; |
+ case DistillerHeuristicsType::NONE: |
+ default: |
+ return false; |
+ } |
+} |
+ |
+bool isLast(bool is_loaded) { |
mdjones
2015/11/03 02:54:45
Please add some doc for these helpers.
wychen
2015/11/03 07:56:39
Done.
|
+ switch (GetDistillerHeuristicsType()) { |
+ case DistillerHeuristicsType::ALWAYS_TRUE: |
+ return true; |
+ case DistillerHeuristicsType::OG_ARTICLE: |
+ return true; |
+ case DistillerHeuristicsType::ADABOOST_MODEL: |
+ return is_loaded; |
+ case DistillerHeuristicsType::NONE: |
+ default: |
+ return true; |
+ } |
+} |
+ |
+bool IsDistillablePageAdaboost(WebDocument& doc, |
+ const DistillablePageDetector* detector) { |
+ WebDistillabilityFeatures features = doc.distillabilityFeatures(); |
+ GURL parsed_url(doc.url()); |
+ if (!parsed_url.is_valid()) { |
+ return false; |
+ } |
+ return detector->Classify(CalculateDerivedFeatures(features, parsed_url)); |
+} |
+ |
+bool IsDistillablePage(bool is_mobile_optimized, WebDocument& doc) { |
+ switch (GetDistillerHeuristicsType()) { |
+ case DistillerHeuristicsType::ALWAYS_TRUE: |
+ return true; |
+ case DistillerHeuristicsType::OG_ARTICLE: |
+ return doc.distillabilityFeatures().openGraph; |
+ case DistillerHeuristicsType::ADABOOST_MODEL: |
+ // The adaboost model is only applied to non-mobile pages. |
+ if (is_mobile_optimized) { |
+ return false; |
+ } |
+ return IsDistillablePageAdaboost( |
+ doc, DistillablePageDetector::GetDefault()); |
+ case DistillerHeuristicsType::NONE: |
+ default: |
+ return false; |
+ } |
+} |
+ |
+} // namespace |
+ |
+DistillabilityAgent::DistillabilityAgent( |
+ content::RenderFrame* render_frame) |
+ : RenderFrameObserver(render_frame) { |
+} |
+ |
+void DistillabilityAgent::DidMeaningfulLayout( |
+ WebMeaningfulLayout layout_type) { |
+ if (layout_type != WebMeaningfulLayout::FinishedParsing && |
+ layout_type != WebMeaningfulLayout::FinishedLoading) { |
+ return; |
+ } |
+ |
+ DCHECK(render_frame()); |
+ if (!render_frame()->IsMainFrame()) return; |
+ DCHECK(render_frame()->GetWebFrame()); |
+ WebDocument doc = render_frame()->GetWebFrame()->document(); |
+ if (doc.isNull() || doc.body().isNull()) return; |
+ |
+ bool is_loaded = layout_type == WebMeaningfulLayout::FinishedLoading; |
+ if (!needToUpdate(is_loaded)) return; |
+ |
+ bool is_mobile_friendly = doc.isMobileFriendly(); |
+ Send(new FrameHostMsg_Distillability(routing_id(), |
+ IsDistillablePage(is_mobile_friendly, doc), isLast(is_loaded))); |
+} |
+ |
+ |
+DistillabilityAgent::~DistillabilityAgent() {} |
+ |
+} // namespace dom_distiller |