// Copyright 2018 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_MODULES_STORAGE_TESTING_FAKE_AREA_SOURCE_H_
#define THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_TESTING_FAKE_AREA_SOURCE_H_

#include "third_party/blink/public/platform/scheduler/web_scoped_virtual_time_pauser.h"
#include "third_party/blink/renderer/modules/storage/cached_storage_area.h"
#include "third_party/blink/renderer/platform/weborigin/kurl.h"

namespace blink {

class FakeAreaSource : public GarbageCollected<FakeAreaSource>,
                       public CachedStorageArea::Source {
 public:
  explicit FakeAreaSource(const KURL& page_url) : page_url_(page_url) {}

  KURL GetPageUrl() const override { return page_url_; }
  bool EnqueueStorageEvent(const String& key,
                           const String& old_value,
                           const String& new_value,
                           const String& url) override {
    events.push_back(Event{key, old_value, new_value, url});
    return true;
  }

  blink::WebScopedVirtualTimePauser CreateWebScopedVirtualTimePauser(
      const char* name,
      WebScopedVirtualTimePauser::VirtualTaskDuration duration) override {
    return blink::WebScopedVirtualTimePauser();
  }

  struct Event {
    String key, old_value, new_value, url;

    bool operator==(const Event& other) const {
      return std::tie(key, old_value, new_value, url) ==
             std::tie(other.key, other.old_value, other.new_value, other.url);
    }
  };

  Vector<Event> events;

 private:
  KURL page_url_;
};

}  // namespace blink

#endif  // THIRD_PARTY_BLINK_RENDERER_MODULES_STORAGE_TESTING_FAKE_AREA_SOURCE_H_
