blob: d9edd070e0daed3deeb6f48d265f03eeffbeda0c [file] [log] [blame]
// Copyright 2020 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.
#ifndef THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_STICKY_AD_DETECTOR_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_STICKY_AD_DETECTOR_H_
#include "base/macros.h"
#include "base/optional.h"
#include "base/time/time.h"
#include "third_party/blink/renderer/core/core_export.h"
#include "third_party/blink/renderer/platform/graphics/dom_node_id.h"
namespace blink {
class LocalFrame;
// Detects large sticky ad at the bottom of the viewport, and record a use
// counter when an instance is found.
//
// Better Ads Standards definition:
// https://www.betterads.org/desktop-large-sticky-ad/
// https://www.betterads.org/mobile-large-sticky-ad/
//
// Heuristic:
// We do hit testing at the bottom center of the browser viewport at regular
// intervals. The top element is a sticky ad candidate if the following
// conditions are met:
// 1) It has a non-default position w.r.t. the viewport.
// 2) It's large in size (> 30% viewport size).
// 3) The main page is not scrollable.
//
// The candidate will be actually counted as a sticky ad instance at a later
// point, when we detect that the main frame scrolling position has changed by a
// distance greater than the height of the candidate, and the candidate is still
// at the bottom center. This allows us to exclude false positives like
// parallax/scroller ads.
class CORE_EXPORT StickyAdDetector {
public:
StickyAdDetector() = default;
~StickyAdDetector() = default;
void MaybeFireDetection(LocalFrame* main_frame);
private:
void OnLargeStickyAdDetected(LocalFrame* main_frame);
base::Optional<base::Time> last_detection_time_;
DOMNodeId candidate_id_;
int candidate_height_;
int candidate_start_main_frame_scroll_offset_;
bool done_detection_ = false;
DISALLOW_COPY_AND_ASSIGN(StickyAdDetector);
};
} // namespace blink
#endif // THIRD_PARTY_BLINK_RENDERER_CORE_FRAME_STICKY_AD_DETECTOR_H_