// Copyright 2019 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 THIRD_PARTY_BLINK_RENDERER_CORE_EXECUTION_CONTEXT_WINDOW_AGENT_FACTORY_H_
#define THIRD_PARTY_BLINK_RENDERER_CORE_EXECUTION_CONTEXT_WINDOW_AGENT_FACTORY_H_

#include <utility>

#include "base/memory/scoped_refptr.h"
#include "third_party/blink/renderer/platform/heap/heap.h"
#include "third_party/blink/renderer/platform/heap/heap_allocator.h"
#include "third_party/blink/renderer/platform/heap/member.h"
#include "third_party/blink/renderer/platform/weborigin/security_origin_hash.h"
#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h"

namespace v8 {
class Isolate;
}

namespace blink {

class SecurityOrigin;
class WindowAgent;

// This is a helper class to assign WindowAgent to Document.
// The instance should be created for each group of Documents that are mutually
// reachable via `window.opener`, `window.frames` or others. These Documents
// may have different origins.
//
// The instance is intended to have the same granularity to the group of
// browsing context, that contains auxiliary browsing contexts.
// https://html.spec.whatwg.org/C#tlbc-group
// https://html.spec.whatwg.org/C#auxiliary-browsing-context
class WindowAgentFactory final : public GarbageCollected<WindowAgentFactory> {
 public:
  WindowAgentFactory();

  // Returns an instance of WindowAgent for |origin|.
  // This returns the same instance for origin A and origin B if either:
  //  - |has_potential_universal_access_privilege| is true,
  //  - both A and B have `file:` scheme,
  //  - or, they have the same scheme and the same registrable origin.
  // If |is_origin_agent_cluster| is true though, then the same instance will
  // only return the same instance for an exact match (scheme, host, port) to
  // |origin|.
  //
  // Set |has_potential_universal_access_privilege| if an agent may be able to
  // access all other agents synchronously.
  // I.e. pass true to if either:
  //   * --disable-web-security is set,
  //   * --run-web-tests is set,
  //   * or, the Blink instance is running for Android WebView.
  WindowAgent* GetAgentForOrigin(bool has_potential_universal_access_privilege,
                                 v8::Isolate* isolate,
                                 const SecurityOrigin* origin,
                                 bool is_origin_agent_cluster);

  void Trace(Visitor*) const;

 private:
  struct SchemeAndRegistrableDomain {
    String scheme;
    String registrable_domain;

    SchemeAndRegistrableDomain(const String& scheme,
                               const String& registrable_domain)
        : scheme(scheme), registrable_domain(registrable_domain) {}
  };

  struct SchemeAndRegistrableDomainHash {
    STATIC_ONLY(SchemeAndRegistrableDomainHash);
    static const bool safe_to_compare_to_empty_or_deleted = false;

    static unsigned GetHash(const SchemeAndRegistrableDomain&);
    static bool Equal(const SchemeAndRegistrableDomain&,
                      const SchemeAndRegistrableDomain&);
  };

  struct SchemeAndRegistrableDomainTraits
      : SimpleClassHashTraits<SchemeAndRegistrableDomain> {
    STATIC_ONLY(SchemeAndRegistrableDomainTraits);
    static const bool kHasIsEmptyValueFunction = true;

    static bool IsEmptyValue(const SchemeAndRegistrableDomain&);
    static bool IsDeletedValue(const SchemeAndRegistrableDomain& value);
    static void ConstructDeletedValue(SchemeAndRegistrableDomain& slot,
                                      bool zero_value);
  };

  // Use a shared instance of Agent for all frames if a frame may have the
  // universal access privilege.
  WeakMember<WindowAgent> universal_access_agent_;

  // `file:` scheme URLs are hard for tracking the equality. Use a shared
  // Agent for them.
  WeakMember<WindowAgent> file_url_agent_;

  // Use the SecurityOrigin itself as the key for opaque origins.
  HeapHashMap<scoped_refptr<const SecurityOrigin>,
              WeakMember<WindowAgent>,
              SecurityOriginHash>
      opaque_origin_agents_;

  // Use the SecurityOrigin itself as the key for origin-keyed origins.
  // TODO(wjmaclean,domenic): In future when logical cross-origin-isolation
  // (COI) is implemented, we should unify it with logical-OAC so that all the
  // origin-keyed isolation relies on a single mechanism.
  HeapHashMap<scoped_refptr<const SecurityOrigin>,
              WeakMember<WindowAgent>,
              SecurityOriginHash>
      origin_keyed_agent_cluster_agents_;

  // Use registerable domain as the key for general tuple origins.
  using TupleOriginAgents = HeapHashMap<SchemeAndRegistrableDomain,
                                        WeakMember<WindowAgent>,
                                        SchemeAndRegistrableDomainHash,
                                        SchemeAndRegistrableDomainTraits>;
  TupleOriginAgents tuple_origin_agents_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_CORE_EXECUTION_CONTEXT_WINDOW_AGENT_FACTORY_H_
