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

#include "content/browser/webui/shared_resources_data_source.h"

#include <set>

#include "build/chromeos_buildflags.h"
#include "content/public/browser/web_ui_data_source.h"
#include "services/network/public/mojom/content_security_policy.mojom.h"
#include "ui/base/webui/web_ui_util.h"
#include "ui/resources/grit/webui_resources.h"
#include "ui/resources/grit/webui_resources_map.h"

#if BUILDFLAG(IS_CHROMEOS_ASH)
#include "ash/webui/grit/ash_webui_common_resources_map.h"
#include "chromeos/ash/grit/ash_resources.h"
#include "chromeos/ash/grit/ash_resources_map.h"
#include "chromeos/grit/chromeos_resources.h"
#include "chromeos/grit/chromeos_resources_map.h"
#include "content/grit/content_resources.h"
#include "content/grit/content_resources_map.h"
#include "mojo/public/js/grit/mojo_bindings_resources.h"
#include "mojo/public/js/grit/mojo_bindings_resources_map.h"
#endif

namespace content {

namespace {

#if BUILDFLAG(IS_CHROMEOS_ASH)
const std::set<int> GetContentResourceIds() {
  return std::set<int>{
      IDR_UNGUESSABLE_TOKEN_MOJO_JS,
      IDR_URL_MOJO_JS,
  };
}

const std::set<int> GetChromeosMojoResourceIds() {
  return std::set<int>{
      IDR_NETWORK_DIAGNOSTICS_MOJOM_LITE_JS,
  };
}

const std::set<int> GetAshMojoResourceIds() {
  return std::set<int>{
      IDR_MULTIDEVICE_DEVICE_SYNC_MOJOM_LITE_JS,
      IDR_MULTIDEVICE_MULTIDEVICE_SETUP_MOJOM_LITE_JS,
      IDR_MULTIDEVICE_MULTIDEVICE_TYPES_MOJOM_LITE_JS,
  };
}

// Adds all resources with IDs in |resource_ids| to |resources_map|.
void AddResources(const std::set<int>& resource_ids,
                  const webui::ResourcePath resources[],
                  size_t resources_size,
                  WebUIDataSource* source) {
  for (size_t i = 0; i < resources_size; ++i) {
    const auto& resource = resources[i];

    const auto it = resource_ids.find(resource.id);
    if (it == resource_ids.end())
      continue;

    source->AddResourcePath(resource.path, resource.id);
  }
}
#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)

}  // namespace

void PopulateSharedResourcesDataSource(WebUIDataSource* source) {
  source->OverrideContentSecurityPolicy(
      network::mojom::CSPDirectiveName::WorkerSrc, "worker-src blob: 'self';");

  // Note: Don't put generated Mojo bindings here. Mojo bindings should be
  // included in the either the ts_library() target for the UI using them (if
  // they are only used by one UI) or in //ui/webui/resources/mojo:build_ts
  // (if used by multiple UIs).
  source->AddResourcePaths(
      base::make_span(kWebuiResources, kWebuiResourcesSize));
#if BUILDFLAG(IS_CHROMEOS_ASH)
  source->AddResourcePaths(
      base::make_span(kAshWebuiCommonResources, kAshWebuiCommonResourcesSize));
  // Deprecated -lite style mojo bindings.
  source->AddResourcePaths(
      base::make_span(kMojoBindingsResources, kMojoBindingsResourcesSize));
  AddResources(GetContentResourceIds(), kContentResources,
               kContentResourcesSize, source);
  AddResources(GetChromeosMojoResourceIds(), kChromeosResources,
               kChromeosResourcesSize, source);
  AddResources(GetAshMojoResourceIds(), kAshResources, kAshResourcesSize,
               source);
#endif  // !BUILDFLAG(IS_CHROMEOS_ASH)
}

}  // namespace content
