// Copyright 2016 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 "core/frame/Intervention.h"

#include "core/frame/FrameConsole.h"
#include "core/frame/InterventionReport.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/LocalFrameClient.h"
#include "core/frame/Report.h"
#include "core/frame/ReportingContext.h"
#include "core/inspector/ConsoleMessage.h"
#include "public/platform/reporting.mojom-blink.h"
#include "services/service_manager/public/cpp/interface_provider.h"

namespace blink {

// static
void Intervention::GenerateReport(const LocalFrame* frame,
                                  const String& message) {
  if (!frame)
    return;

  // Send the message to the console.
  frame->Console().AddMessage(ConsoleMessage::Create(
      kInterventionMessageSource, kWarningMessageLevel, message));

  if (!frame->Client())
    return;

  Document* document = frame->GetDocument();

  // Construct the intervention report.
  InterventionReport* body =
      new InterventionReport(message, SourceLocation::Capture());
  Report* report =
      new Report("intervention", document->Url().GetString(), body);

  // Send the intervention report to any ReportingObservers.
  ReportingContext* reporting_context = ReportingContext::From(document);
  if (reporting_context->ObserverExists())
    reporting_context->QueueReport(report);

  // Send the intervention report to the Reporting API.
  mojom::blink::ReportingServiceProxyPtr service;
  frame->Client()->GetInterfaceProvider()->GetInterface(&service);
  service->QueueInterventionReport(document->Url(), message, body->sourceFile(),
                                   body->lineNumber());
}

}  // namespace blink
