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

Side by Side Diff: content/browser/streams/chrome_stream.cc

Issue 12212031: Add support for redirecting ResourceHandlers to a blob: URL (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Rebase Created 7 years, 10 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
OLDNEW
(Empty)
1 // Copyright (c) 2013 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 #include "content/browser/streams/chrome_stream.h"
6
7 #include "net/base/io_buffer.h"
8
9 namespace {
10 // Start throttling the connection at about 1MB
11 const size_t kDeferSizeThreshold = 40 * 32768;
12 }
13
14 namespace content {
15
16 ChromeStream::ChromeStream(const GURL& security_origin)
17 : current_size_(0),
18 bytes_read_(0),
19 complete_(false),
20 should_defer_(false),
21 security_origin_(security_origin) {
22 }
23
24 ChromeStream::~ChromeStream() {
25 }
26
27 void ChromeStream::AddObserver(ChromeStreamObserver* observer) {
28 observers_.AddObserver(observer);
29 }
30
31 void ChromeStream::RemoveObserver(ChromeStreamObserver* observer) {
32 observers_.RemoveObserver(observer);
33 }
34
35 void ChromeStream::AddData(scoped_refptr<net::IOBuffer> buffer, size_t size) {
36 buffer_.push_back(std::make_pair(buffer, size));
37 current_size_ += size;
38 if (current_size_ > kDeferSizeThreshold) {
39 should_defer_ = true;
40 }
41
42 FOR_EACH_OBSERVER(ChromeStreamObserver, observers_, OnDataAvailable(this));
43 }
44
45 void ChromeStream::MarkComplete() {
46 complete_ = true;
47
48 MaybeNotifyComplete();
49 }
50
51 bool ChromeStream::ReadRawData(net::IOBuffer* buf,
52 int buf_size,
darin (slow to review) 2013/02/13 09:18:12 it feels like there is some redundancy here with B
Zachary Kuznia 2013/02/13 16:37:14 Modified this class to use ByteStream.
53 int* bytes_read) {
54 if (buffer_.empty()) {
55 return complete_;
56 }
57
58 size_t current_buffer_size = buffer_.front().second;
59 size_t remaining_bytes = current_buffer_size - bytes_read_;
60 size_t to_read =
61 (size_t)buf_size < remaining_bytes ? buf_size : remaining_bytes;
62 scoped_refptr<net::IOBuffer> source = buffer_.front().first;
63
64 memcpy(buf->data(), source->data() + bytes_read_, to_read);
65
66 bytes_read_ += to_read;
67
68 if (bytes_read_ >= current_buffer_size) {
69 current_size_ -= current_buffer_size;
70 bytes_read_ = 0;
71 buffer_.pop_front();
72
73 if (should_defer_ && current_size_ < kDeferSizeThreshold) {
74 should_defer_ = false;
75 FOR_EACH_OBSERVER(ChromeStreamObserver,
76 observers_,
77 OnBufferAvailable(this));
78 }
79 }
80
81 *bytes_read = to_read;
82
83 MaybeNotifyComplete();
84
85 return true;
86 }
87
88 void ChromeStream::MaybeNotifyComplete() {
89 if (complete_ && buffer_.empty()) {
90 FOR_EACH_OBSERVER(ChromeStreamObserver, observers_, OnStreamComplete(this));
91 }
92 }
93
94 } // namespace content
95
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698