blob: 87b0e6181eb2ce238c3c8e4474e591123c67997c [file] [log] [blame]
// Copyright 2017 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 CHROME_BROWSER_SAFE_BROWSING_NOTIFICATION_IMAGE_REPORTER_H_
#define CHROME_BROWSER_SAFE_BROWSING_NOTIFICATION_IMAGE_REPORTER_H_
#include <memory>
#include "base/containers/queue.h"
#include "base/macros.h"
#include "base/memory/ref_counted.h"
#include "base/memory/weak_ptr.h"
#include "base/time/time.h"
class GURL;
class Profile;
class SkBitmap;
namespace base {
class RefCountedMemory;
} // namespace base
namespace gfx {
class Size;
} // namespace gfx
namespace net {
class ReportSender;
class URLRequestContext;
} // namespace net
namespace safe_browsing {
class SafeBrowsingDatabaseManager;
// Provides functionality for building and sending reports about notification
// content images to the Safe Browsing CSD server.
class NotificationImageReporter {
public:
// CSD server URL to which notification image reports are sent.
static const char kReportingUploadUrl[];
explicit NotificationImageReporter(net::URLRequestContext* request_context);
virtual ~NotificationImageReporter();
// Report notification content image to SafeBrowsing CSD server if the user
// has opted in, the origin is not whitelisted, and it is randomly sampled.
// Can only be called on IO thread.
void ReportNotificationImageOnIO(
Profile* profile,
const scoped_refptr<SafeBrowsingDatabaseManager>& database_manager,
const GURL& origin,
const SkBitmap& image);
protected:
explicit NotificationImageReporter(
std::unique_ptr<net::ReportSender> report_sender);
// Get the percentage of images that should be reported from Finch.
virtual double GetReportChance() const;
// Tests may wish to override this to find out if reports are skipped. Called
// on the IO thread.
virtual void SkippedReporting();
private:
// Report notification content image to SafeBrowsing CSD server if necessary,
// by invoking DownscaleNotificationImageOnBlockingPool. This should be
// called on the IO thread and will invoke a member function on the IO thread
// using the IO-based WeapPtr.
static void ReportNotificationImageOnUI(
const base::WeakPtr<NotificationImageReporter>& weak_this_on_io,
Profile* profile,
const GURL& origin,
const SkBitmap& image);
// Downscales image to fit within 512x512 if necessary, and encodes as it PNG,
// then invokes SendReportOnIO. This should be called on a blocking pool
// thread and will invoke a member function on the IO thread using the
// IO-based WeakPtr.
static void DownscaleNotificationImageOnBlockingPool(
const base::WeakPtr<NotificationImageReporter>& weak_this_on_io,
const GURL& origin,
const SkBitmap& image);
// Serializes report using NotificationImageReportRequest protobuf defined in
// chrome/common/safe_browsing/csd.proto and sends it to CSD server.
void SendReportOnIO(const GURL& origin,
scoped_refptr<base::RefCountedMemory> data,
const gfx::Size& dimensions,
const gfx::Size& original_dimensions);
// Called when the asynchronous CSD whitelist check completes.
void OnWhitelistCheckDoneOnIO(Profile* profile,
const GURL& origin,
const SkBitmap& image,
bool match_whitelist);
std::unique_ptr<net::ReportSender> report_sender_;
// Timestamps of when we sent notification images. Used to limit the number
// of requests that we send in a day. Only access on the IO thread.
// TODO(johnme): Serialize this so that it doesn't reset on browser restart.
base::queue<base::Time> report_times_;
// Keep this last. Only dereference these pointers on the IO thread.
base::WeakPtrFactory<NotificationImageReporter> weak_factory_on_io_;
DISALLOW_COPY_AND_ASSIGN(NotificationImageReporter);
};
} // namespace safe_browsing
#endif // CHROME_BROWSER_SAFE_BROWSING_NOTIFICATION_IMAGE_REPORTER_H_