Chromium Code Reviews| 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 |