Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(305)

Side by Side Diff: Source/bindings/core/v8/ScriptStreamer.h

Issue 368283002: Stream scripts to V8 as they load - Blink side. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: cleanup Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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 ScriptStreamer_h
6 #define ScriptStreamer_h
7
8 #include "wtf/RefCounted.h"
9
10 #include <v8.h>
11
12 namespace blink {
13
14 class PendingScript;
15 class ScriptResource;
16 class ScriptResourceClient;
17 class SourceStream;
18
19 // ScriptStreamer streams incomplete script data to V8 so that it can be parsed
20 // while it's loaded. PendingScript holds a reference to ScriptStreamer. At the
21 // moment, ScriptStreamer is only used for parser blocking scripts; this means
22 // that the Document stays stable and no other scripts are executing while we're
23 // streaming. It is possible, though, that Document and the PendingScript are
24 // destroyed while the streaming is in progress, and ScriptStreamer handles it
25 // gracefully.
26 class ScriptStreamer : public RefCounted<ScriptStreamer> {
27 public:
28 // Launches a task (on a background thread) which will stream the given
29 // PendingScript into V8 as it loads. It's also possible that V8 cannot
30 // stream the given script; in that case this function returns
31 // false. Internally, this constructs a ScriptStreamer and attaches it to
32 // the PendingScript. Use ScriptStreamer::addClient to get notified when the
33 // streaming finishes.
34 static bool startStreaming(PendingScript&);
35
36 bool streamingInProgress() const { return !m_loadingFinished || !m_v8Done; }
37
38 v8::ScriptCompiler::StreamedSource* source() { return &m_source; }
39 ScriptResource* resource() const { return m_resource; }
40
41 // Called when the upper layer doesn't need the streamed PendingScript any
42 // more. After calling cancel, the upper layer (PendingScript) can drop its
haraken 2014/09/10 05:57:51 This comment is a bit confusing, though I know wha
marja 2014/09/11 09:15:37 Clarified this: // Called when the script is
43 // reference to ScriptStreamer, and ScriptStreamer takes care of eventually
44 // deleting itself (after the V8 side has finished too).
45 void cancel();
46
47 // When the streaming is suppressed, the data is not given to V8, but
48 // ScriptStreamer still watches the resource load and notifies the upper
49 // layers when loading is finished. It is used in situations when we have
50 // started streaming but then we detect we don't want to stream (e.g., when
51 // we have the code cache for the script) and we still want to parse and
52 // execute it when it has finished loading.
53 void suppressStreaming() { m_streamingSuppressed = true; }
54 bool streamingSuppressed() const { return m_streamingSuppressed; }
55
56 unsigned cachedDataDataType() const { return m_cachedDataDataType; }
57
58 void addClient(ScriptResourceClient* client)
59 {
60 ASSERT(!m_client);
61 m_client = client;
62 }
63
64 void removeClient(ScriptResourceClient* client)
65 {
66 ASSERT(m_client == client);
67 m_client = 0;
68 }
69
70 // Called by PendingScript when data arrives from the network.
71 void notifyAppendData();
72 void notifyFinished();
73
74 // Called by ScriptStreamingTask when it has streamed all data to V8 and V8
75 // has processed it.
76 void streamingComplete();
77
78 private:
79 ScriptStreamer(ScriptResource*, v8::ScriptCompiler::StreamedSource::Encoding );
80
81 void notifyFinishedToClient();
82
83 // This pointer is weak. If PendingScript and its Resource are deleted
84 // before ScriptStreamer, PendingScript will notify ScriptStreamer of its
85 // deletion by calling cancel().
86 ScriptResource* m_resource;
haraken 2014/09/10 05:57:51 Can we avoid adding the m_resource member to Scrip
marja 2014/09/11 09:15:37 We need it in e.g., notifyFinishedToClient which m
87
88 SourceStream* m_stream;
89 v8::ScriptCompiler::StreamedSource m_source;
90 ScriptResourceClient* m_client;
91 bool m_loadingFinished; // Whether loading from the network is done.
92 bool m_v8Done; // Whether the V8 side processing is done.
haraken 2014/09/10 05:57:51 m_v8Done => m_parsingFinished ? (for consistency w
marja 2014/09/11 09:15:37 Done.
93
94 // Whether the script source code should be retrieved from the Resource
95 // instead of the ScriptStreamer.
96 bool m_streamingSuppressed;
97
98 // What kind of cached data V8 produces during streaming.
99 unsigned m_cachedDataDataType;
haraken 2014/09/10 05:57:51 m_cachedDataDataType => m_cachedDataType ?
marja 2014/09/11 09:15:37 Done.
100 };
101
102 } // namespace blink
103
104 #endif // ScriptStreamer_h
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698