// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "ui/webui/examples/renderer/content_renderer_client.h"

#include "components/surface_embed/common/features.h"
#include "components/surface_embed/renderer/create_plugin.h"
#include "content/public/common/url_constants.h"
#include "content/public/renderer/render_frame.h"
#include "third_party/blink/public/platform/web_string.h"
#include "third_party/blink/public/web/web_custom_element.h"
#include "third_party/blink/public/web/web_local_frame.h"
#include "ui/webui/examples/browser/ui/web/browser.h"
#include "ui/webui/examples/renderer/render_frame_observer.h"

namespace webui_examples {

ContentRendererClient::ContentRendererClient() = default;

ContentRendererClient::~ContentRendererClient() = default;

void ContentRendererClient::RenderFrameCreated(
    content::RenderFrame* render_frame) {
  if (!render_frame->IsMainFrame()) {
    return;
  }

  std::unique_ptr<RenderFrameObserver> observer =
      std::make_unique<RenderFrameObserver>(render_frame);
  RenderFrameObserver* observer_ptr = observer.get();
  observer_ptr->SelfOwn(std::move(observer));
}

void ContentRendererClient::RenderThreadStarted() {
  blink::WebCustomElement::AddEmbedderCustomElementName(
      blink::WebString("webview"));
  if (base::FeatureList::IsEnabled(surface_embed::features::kSurfaceEmbed)) {
    blink::WebCustomElement::AddEmbedderCustomElementName(
        blink::WebString("surfaceembed"));
  }
}

bool ContentRendererClient::OverrideCreatePlugin(
    content::RenderFrame* render_frame,
    const blink::WebPluginParams& params,
    blink::WebPlugin** plugin) {
  if (base::FeatureList::IsEnabled(surface_embed::features::kSurfaceEmbed)) {
    GURL url = render_frame->GetWebFrame()->GetDocument().Url();
    if (url.SchemeIs(content::kChromeUIScheme) &&
        url.host() == webui_examples::Browser::kHost) {
      if (surface_embed::MaybeCreatePlugin(render_frame, params, plugin)) {
        return true;
      }
    }
  }
  return false;
}

}  // namespace webui_examples
