File: Body.h

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (106 lines) | stat: -rw-r--r-- 3,297 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// Copyright 2014 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 Body_h
#define Body_h

#include "bindings/core/v8/ScriptPromise.h"
#include "bindings/core/v8/ScriptPromiseResolver.h"
#include "bindings/core/v8/ScriptWrappable.h"
#include "core/dom/ActiveDOMObject.h"
#include "core/fileapi/FileReaderLoader.h"
#include "core/fileapi/FileReaderLoaderClient.h"
#include "core/streams/ReadableStreamImpl.h"
#include "platform/blob/BlobData.h"
#include "platform/heap/Handle.h"
#include "wtf/RefPtr.h"

namespace blink {

class BodyStreamBuffer;
class ScriptState;

class Body
    : public GarbageCollectedFinalized<Body>
    , public ScriptWrappable
    , public ActiveDOMObject
    , public FileReaderLoaderClient {
    DEFINE_WRAPPERTYPEINFO();
    WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(Body);
public:
    explicit Body(ExecutionContext*);
    virtual ~Body() { }
    enum ResponseType {
        ResponseUnknown,
        ResponseAsArrayBuffer,
        ResponseAsBlob,
        ResponseAsFormData,
        ResponseAsJSON,
        ResponseAsText
    };

    ScriptPromise arrayBuffer(ScriptState*);
    ScriptPromise blob(ScriptState*);
    ScriptPromise formData(ScriptState*);
    ScriptPromise json(ScriptState*);
    ScriptPromise text(ScriptState*);
    ReadableStream* body();

    // Sets the bodyUsed flag to true. This signifies that the contents of the
    // body have been consumed and cannot be accessed again.
    void setBodyUsed();
    bool bodyUsed() const;

    bool streamAccessed() const;

    // ActiveDOMObject override.
    virtual void stop() override;
    virtual bool hasPendingActivity() const override;

    virtual void trace(Visitor*) override;

protected:
    // Copy constructor for clone() implementations
    explicit Body(const Body&);

private:
    class ReadableStreamSource;
    class BlobHandleReceiver;

    void pullSource();
    void readAllFromStream(ScriptState*);
    ScriptPromise readAsync(ScriptState*, ResponseType);
    void readAsyncFromBlob(PassRefPtr<BlobDataHandle>);
    void resolveJSON(const String&);

    // FileReaderLoaderClient functions.
    virtual void didStartLoading() override;
    virtual void didReceiveData() override;
    virtual void didFinishLoading() override;
    virtual void didFail(FileError::ErrorCode) override;

    void didBlobHandleReceiveError(PassRefPtrWillBeRawPtr<DOMException>);

    // We use BlobDataHandle or BodyStreamBuffer as data container of the Body.
    // BodyStreamBuffer is used only when the Response object is created by
    // fetch() API.
    // FIXME: We should seek a cleaner way to handle the data.
    virtual PassRefPtr<BlobDataHandle> blobDataHandle() const = 0;
    virtual BodyStreamBuffer* buffer() const = 0;
    virtual String contentTypeForBuffer() const = 0;

    void didFinishLoadingViaStream(DOMArrayBuffer*);

    OwnPtr<FileReaderLoader> m_loader;
    bool m_bodyUsed;
    bool m_streamAccessed;
    ResponseType m_responseType;
    RefPtrWillBeMember<ScriptPromiseResolver> m_resolver;
    Member<ReadableStreamSource> m_streamSource;
    Member<ReadableStreamImpl<ReadableStreamChunkTypeTraits<DOMArrayBuffer>>> m_stream;
};

} // namespace blink

#endif // Body_h