// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_DOM_MUTATION_OBSERVER_TASK_MANAGER_H_
#define COBALT_DOM_MUTATION_OBSERVER_TASK_MANAGER_H_

#include <utility>

#include "base/hash_tables.h"
#include "base/threading/thread_checker.h"
#include "cobalt/script/tracer.h"

namespace cobalt {
namespace dom {

class MutationObserver;

// The Mutation observer spec describes a sequence of steps to "queue a mutation
// observer compound microtask" and "notify mutation observers". These steps
// are implemented in this helper class, which must outlive all
// MutationObserver instances.
// The spec expects an EventLoop implementation, which Cobalt does not currently
// have.
// https://www.w3.org/TR/dom/#mutation-observers
class MutationObserverTaskManager : public script::Traceable {
 public:
  MutationObserverTaskManager() : task_posted_(false) {}

  // These should be called in the constructor/destructor of the
  // MutationObserver.
  void OnMutationObserverCreated(MutationObserver* observer);
  void OnMutationObserverDestroyed(MutationObserver* observer);

  // Post a task to notify mutation observers, if one is not already posted.
  void QueueMutationObserverMicrotask();

  void TraceMembers(script::Tracer* tracer) override;

 private:
  typedef base::hash_set<MutationObserver*> MutationObserverSet;

  // Notify all mutation observers.
  void NotifyMutationObservers();

  base::ThreadChecker thread_checker_;
  MutationObserverSet observers_;
  bool task_posted_;
};

}  // namespace dom
}  // namespace cobalt

#endif  // COBALT_DOM_MUTATION_OBSERVER_TASK_MANAGER_H_
