// Copyright 2014 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 EXTENSIONS_RENDERER_EXTENSIONS_RENDER_FRAME_OBSERVER_H_
#define EXTENSIONS_RENDERER_EXTENSIONS_RENDER_FRAME_OBSERVER_H_

#include <stdint.h>

#include "base/macros.h"
#include "content/public/renderer/render_frame_observer.h"
#include "extensions/common/mojo/app_window.mojom.h"
#include "mojo/public/cpp/bindings/binding_set.h"
#include "services/service_manager/public/cpp/binder_registry.h"

namespace extensions {

// This class holds the extensions specific parts of RenderFrame, and has the
// same lifetime.
class ExtensionsRenderFrameObserver : public content::RenderFrameObserver,
                                      public mojom::AppWindow {
 public:
  ExtensionsRenderFrameObserver(content::RenderFrame* render_frame,
                                service_manager::BinderRegistry* registry);
  ~ExtensionsRenderFrameObserver() override;

 private:
  void BindAppWindowRequest(mojom::AppWindowRequest request);

  // Toggles visual muting of the render view area. This is on when a
  // constrained window is showing.
  void SetVisuallyDeemphasized(bool deemphasized) override;

  // RenderFrameObserver implementation.
  void DetailedConsoleMessageAdded(const base::string16& message,
                                   const base::string16& source,
                                   const base::string16& stack_trace,
                                   uint32_t line_number,
                                   int32_t severity_level) override;
  void OnDestruct() override;

  // true if webview is overlayed with grey color.
  bool webview_visually_deemphasized_;

  mojo::BindingSet<mojom::AppWindow> bindings_;

  DISALLOW_COPY_AND_ASSIGN(ExtensionsRenderFrameObserver);
};

}  // namespace extensions

#endif  // EXTENSIONS_RENDERER_EXTENSIONS_RENDER_FRAME_OBSERVER_H_

