1// Copyright 2014 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef Headers_h
6#define Headers_h
7
8#include "bindings/core/v8/ScriptWrappable.h"
9#include "modules/serviceworkers/FetchHeaderList.h"
10#include "wtf/Forward.h"
11#include "wtf/PassOwnPtr.h"
12
13namespace blink {
14
15class Dictionary;
16class ExceptionState;
17class HeadersForEachCallback;
18class ScriptValue;
19
20// http://fetch.spec.whatwg.org/#headers-class
21class Headers FINAL : public GarbageCollected<Headers>, public ScriptWrappable {
22    DEFINE_WRAPPERTYPEINFO();
23public:
24    enum Guard { ImmutableGuard, RequestGuard, RequestNoCORSGuard, ResponseGuard, NoneGuard };
25
26    static Headers* create();
27    static Headers* create(ExceptionState&);
28    static Headers* create(const Headers*, ExceptionState&);
29    static Headers* create(const Dictionary&, ExceptionState&);
30
31    // Shares the FetchHeaderList. Called when creating a Request or Response.
32    static Headers* create(FetchHeaderList*);
33
34    Headers* createCopy() const;
35
36    // Headers.idl implementation.
37    void append(const String& name, const String& value, ExceptionState&);
38    void remove(const String& key, ExceptionState&);
39    String get(const String& key, ExceptionState&);
40    Vector<String> getAll(const String& key, ExceptionState&);
41    bool has(const String& key, ExceptionState&);
42    void set(const String& key, const String& value, ExceptionState&);
43    unsigned long size() const;
44    void forEach(HeadersForEachCallback*, const ScriptValue&);
45    void forEach(HeadersForEachCallback*);
46
47    void setGuard(Guard guard) { m_guard = guard; }
48    Guard guard() const { return m_guard; }
49
50    // These methods should only be called when size() would return 0.
51    void fillWith(const Headers*, ExceptionState&);
52    void fillWith(const Dictionary&, ExceptionState&);
53
54    void trace(Visitor*);
55
56private:
57    Headers();
58    // Shares the FetchHeaderList. Called when creating a Request or Response.
59    explicit Headers(FetchHeaderList*);
60    void forEachInternal(HeadersForEachCallback*, const ScriptValue*);
61
62    Member<FetchHeaderList> m_headerList;
63    Guard m_guard;
64};
65
66} // namespace blink
67
68#endif // Headers_h
69