// Copyright 2017 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_RENDERER_SANDBOX_STATUS_EXTENSION_ANDROID_H_
#define CHROME_RENDERER_SANDBOX_STATUS_EXTENSION_ANDROID_H_
#include <memory>
#include "base/memory/ref_counted.h"
#include "base/values.h"
#include "chrome/common/sandbox_status_extension_android.mojom.h"
#include "content/public/renderer/render_frame_observer.h"
#include "mojo/public/cpp/bindings/associated_receiver.h"
#include "mojo/public/cpp/bindings/pending_associated_receiver.h"
#include "v8/include/v8.h"
namespace gin {
class Arguments;
}
// On Android, this class adds a function chrome.getAndroidSandboxStatus()
// to the chrome://sandbox/ WebUI page. This is done only after the browser
// SandboxInternalsUI sends an IPC mesage blessing this RenderFrame.
class SandboxStatusExtension
: public base::RefCountedThreadSafe<SandboxStatusExtension>,
public content::RenderFrameObserver,
public chrome::mojom::SandboxStatusExtension {
public:
// Creates a new SandboxStatusExtension for the |frame|.
static void Create(content::RenderFrame* frame);
SandboxStatusExtension(const SandboxStatusExtension&) = delete;
SandboxStatusExtension& operator=(const SandboxStatusExtension&) = delete;
// content::RenderFrameObserver:
void OnDestruct() override;
void DidClearWindowObject() override;
protected:
friend class base::RefCountedThreadSafe<SandboxStatusExtension>;
~SandboxStatusExtension() override;
private:
explicit SandboxStatusExtension(content::RenderFrame* frame);
// chrome::mojom::SandboxStatusExtension
void AddSandboxStatusExtension() override;
void OnSandboxStatusExtensionRequest(
mojo::PendingAssociatedReceiver<chrome::mojom::SandboxStatusExtension>
receiver);
// Installs the JavaScript function into the scripting context, if
// should_install_ is true.
void Install();
// Native implementation of chrome.getAndroidSandboxStatus.
void GetSandboxStatus(gin::Arguments* args);
// Called on the blocking pool, this gets the sandbox status of the current
// renderer process and returns a status object as a base::Value::Dict.
base::Value::Dict ReadSandboxStatus();
// Runs the callback argument provided to GetSandboxStatus() with the status
// object computed by ReadSandboxStatus(). This is called back on the thread
// on which GetSandboxStatus() was called originally.
void RunCallback(std::unique_ptr<v8::Global<v8::Function>> callback,
base::Value::Dict status);
// Set to true by AddSandboxStatusExtension().
bool should_install_ = false;
mojo::AssociatedReceiver<chrome::mojom::SandboxStatusExtension> receiver_{
this};
};
#endif // CHROME_RENDERER_SANDBOX_STATUS_EXTENSION_ANDROID_H_