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

Side by Side Diff: third_party/WebKit/Source/modules/fetch/ResponseTest.cpp

Issue 1773813007: blink: Rename modules/ method to prefix with get when they collide. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: clash-modules: rebase-fixes Created 4 years, 9 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
1 // Copyright 2014 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "modules/fetch/Response.h" 5 #include "modules/fetch/Response.h"
6 6
7 #include "bindings/core/v8/ExceptionState.h" 7 #include "bindings/core/v8/ExceptionState.h"
8 #include "bindings/core/v8/ScriptState.h" 8 #include "bindings/core/v8/ScriptState.h"
9 #include "core/dom/Document.h" 9 #include "core/dom/Document.h"
10 #include "core/dom/ExceptionCode.h" 10 #include "core/dom/ExceptionCode.h"
(...skipping 29 matching lines...) Expand all
40 for (int i = 0; headers[i].key; ++i) 40 for (int i = 0; headers[i].key; ++i)
41 webResponse->setHeader(WebString::fromUTF8(headers[i].key), WebString::f romUTF8(headers[i].value)); 41 webResponse->setHeader(WebString::fromUTF8(headers[i].key), WebString::f romUTF8(headers[i].value));
42 return webResponse.release(); 42 return webResponse.release();
43 } 43 }
44 44
45 class ServiceWorkerResponseTest : public ::testing::Test { 45 class ServiceWorkerResponseTest : public ::testing::Test {
46 public: 46 public:
47 ServiceWorkerResponseTest() 47 ServiceWorkerResponseTest()
48 : m_page(DummyPageHolder::create(IntSize(1, 1))) { } 48 : m_page(DummyPageHolder::create(IntSize(1, 1))) { }
49 49
50 ScriptState* scriptState() { return ScriptState::forMainWorld(m_page->docume nt().frame()); } 50 ScriptState* getScriptState() { return ScriptState::forMainWorld(m_page->doc ument().frame()); }
51 ExecutionContext* executionContext() { return scriptState()->executionContex t(); } 51 ExecutionContext* getExecutionContext() { return getScriptState()->getExecut ionContext(); }
52 52
53 private: 53 private:
54 OwnPtr<DummyPageHolder> m_page; 54 OwnPtr<DummyPageHolder> m_page;
55 }; 55 };
56 56
57 57
58 TEST_F(ServiceWorkerResponseTest, FromFetchResponseData) 58 TEST_F(ServiceWorkerResponseTest, FromFetchResponseData)
59 { 59 {
60 const KURL url(ParsedURLString, "http://www.response.com"); 60 const KURL url(ParsedURLString, "http://www.response.com");
61 61
62 FetchResponseData* fetchResponseData = FetchResponseData::create(); 62 FetchResponseData* fetchResponseData = FetchResponseData::create();
63 fetchResponseData->setURL(url); 63 fetchResponseData->setURL(url);
64 64
65 Response* response = Response::create(executionContext(), fetchResponseData) ; 65 Response* response = Response::create(getExecutionContext(), fetchResponseDa ta);
66 ASSERT(response); 66 ASSERT(response);
67 EXPECT_EQ(url, response->url()); 67 EXPECT_EQ(url, response->url());
68 } 68 }
69 69
70 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponse) 70 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponse)
71 { 71 {
72 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse(); 72 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse();
73 Response* response = Response::create(executionContext(), *webResponse); 73 Response* response = Response::create(getExecutionContext(), *webResponse);
74 ASSERT(response); 74 ASSERT(response);
75 EXPECT_EQ(webResponse->url(), response->url()); 75 EXPECT_EQ(webResponse->url(), response->url());
76 EXPECT_EQ(webResponse->status(), response->status()); 76 EXPECT_EQ(webResponse->status(), response->status());
77 EXPECT_STREQ(webResponse->statusText().utf8().c_str(), response->statusText( ).utf8().data()); 77 EXPECT_STREQ(webResponse->statusText().utf8().c_str(), response->statusText( ).utf8().data());
78 78
79 Headers* responseHeaders = response->headers(); 79 Headers* responseHeaders = response->headers();
80 80
81 WebVector<WebString> keys = webResponse->getHeaderKeys(); 81 WebVector<WebString> keys = webResponse->getHeaderKeys();
82 EXPECT_EQ(keys.size(), responseHeaders->headerList()->size()); 82 EXPECT_EQ(keys.size(), responseHeaders->headerList()->size());
83 for (size_t i = 0, max = keys.size(); i < max; ++i) { 83 for (size_t i = 0, max = keys.size(); i < max; ++i) {
84 WebString key = keys[i]; 84 WebString key = keys[i];
85 TrackExceptionState exceptionState; 85 TrackExceptionState exceptionState;
86 EXPECT_STREQ(webResponse->getHeader(key).utf8().c_str(), responseHeaders ->get(key, exceptionState).utf8().data()); 86 EXPECT_STREQ(webResponse->getHeader(key).utf8().c_str(), responseHeaders ->get(key, exceptionState).utf8().data());
87 EXPECT_FALSE(exceptionState.hadException()); 87 EXPECT_FALSE(exceptionState.hadException());
88 } 88 }
89 } 89 }
90 90
91 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseDefault) 91 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseDefault)
92 { 92 {
93 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse(); 93 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse();
94 webResponse->setResponseType(WebServiceWorkerResponseTypeDefault); 94 webResponse->setResponseType(WebServiceWorkerResponseTypeDefault);
95 Response* response = Response::create(executionContext(), *webResponse); 95 Response* response = Response::create(getExecutionContext(), *webResponse);
96 96
97 Headers* responseHeaders = response->headers(); 97 Headers* responseHeaders = response->headers();
98 TrackExceptionState exceptionState; 98 TrackExceptionState exceptionState;
99 EXPECT_STREQ("foop", responseHeaders->get("set-cookie", exceptionState).utf8 ().data()); 99 EXPECT_STREQ("foop", responseHeaders->get("set-cookie", exceptionState).utf8 ().data());
100 EXPECT_STREQ("bar", responseHeaders->get("foo", exceptionState).utf8().data( )); 100 EXPECT_STREQ("bar", responseHeaders->get("foo", exceptionState).utf8().data( ));
101 EXPECT_STREQ("no-cache", responseHeaders->get("cache-control", exceptionStat e).utf8().data()); 101 EXPECT_STREQ("no-cache", responseHeaders->get("cache-control", exceptionStat e).utf8().data());
102 EXPECT_FALSE(exceptionState.hadException()); 102 EXPECT_FALSE(exceptionState.hadException());
103 } 103 }
104 104
105 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseBasic) 105 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseBasic)
106 { 106 {
107 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse(); 107 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse();
108 webResponse->setResponseType(WebServiceWorkerResponseTypeBasic); 108 webResponse->setResponseType(WebServiceWorkerResponseTypeBasic);
109 Response* response = Response::create(executionContext(), *webResponse); 109 Response* response = Response::create(getExecutionContext(), *webResponse);
110 110
111 Headers* responseHeaders = response->headers(); 111 Headers* responseHeaders = response->headers();
112 TrackExceptionState exceptionState; 112 TrackExceptionState exceptionState;
113 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d ata()); 113 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d ata());
114 EXPECT_STREQ("bar", responseHeaders->get("foo", exceptionState).utf8().data( )); 114 EXPECT_STREQ("bar", responseHeaders->get("foo", exceptionState).utf8().data( ));
115 EXPECT_STREQ("no-cache", responseHeaders->get("cache-control", exceptionStat e).utf8().data()); 115 EXPECT_STREQ("no-cache", responseHeaders->get("cache-control", exceptionStat e).utf8().data());
116 EXPECT_FALSE(exceptionState.hadException()); 116 EXPECT_FALSE(exceptionState.hadException());
117 } 117 }
118 118
119 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseCORS) 119 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseCORS)
120 { 120 {
121 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse(); 121 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse();
122 webResponse->setResponseType(WebServiceWorkerResponseTypeCORS); 122 webResponse->setResponseType(WebServiceWorkerResponseTypeCORS);
123 Response* response = Response::create(executionContext(), *webResponse); 123 Response* response = Response::create(getExecutionContext(), *webResponse);
124 124
125 Headers* responseHeaders = response->headers(); 125 Headers* responseHeaders = response->headers();
126 TrackExceptionState exceptionState; 126 TrackExceptionState exceptionState;
127 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d ata()); 127 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d ata());
128 EXPECT_STREQ("", responseHeaders->get("foo", exceptionState).utf8().data()); 128 EXPECT_STREQ("", responseHeaders->get("foo", exceptionState).utf8().data());
129 EXPECT_STREQ("no-cache", responseHeaders->get("cache-control", exceptionStat e).utf8().data()); 129 EXPECT_STREQ("no-cache", responseHeaders->get("cache-control", exceptionStat e).utf8().data());
130 EXPECT_FALSE(exceptionState.hadException()); 130 EXPECT_FALSE(exceptionState.hadException());
131 } 131 }
132 132
133 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseOpaque) 133 TEST_F(ServiceWorkerResponseTest, FromWebServiceWorkerResponseOpaque)
134 { 134 {
135 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse(); 135 OwnPtr<WebServiceWorkerResponse> webResponse = createTestWebServiceWorkerRes ponse();
136 webResponse->setResponseType(WebServiceWorkerResponseTypeOpaque); 136 webResponse->setResponseType(WebServiceWorkerResponseTypeOpaque);
137 Response* response = Response::create(executionContext(), *webResponse); 137 Response* response = Response::create(getExecutionContext(), *webResponse);
138 138
139 Headers* responseHeaders = response->headers(); 139 Headers* responseHeaders = response->headers();
140 TrackExceptionState exceptionState; 140 TrackExceptionState exceptionState;
141 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d ata()); 141 EXPECT_STREQ("", responseHeaders->get("set-cookie", exceptionState).utf8().d ata());
142 EXPECT_STREQ("", responseHeaders->get("foo", exceptionState).utf8().data()); 142 EXPECT_STREQ("", responseHeaders->get("foo", exceptionState).utf8().data());
143 EXPECT_STREQ("", responseHeaders->get("cache-control", exceptionState).utf8( ).data()); 143 EXPECT_STREQ("", responseHeaders->get("cache-control", exceptionState).utf8( ).data());
144 EXPECT_FALSE(exceptionState.hadException()); 144 EXPECT_FALSE(exceptionState.hadException());
145 } 145 }
146 146
147 void checkResponseStream(Response* response, bool checkResponseBodyStreamBuffer) 147 void checkResponseStream(Response* response, bool checkResponseBodyStreamBuffer)
(...skipping 25 matching lines...) Expand all
173 EXPECT_EQ(clonedResponse->bodyBuffer(), clonedResponse->internalBodyBuff er()); 173 EXPECT_EQ(clonedResponse->bodyBuffer(), clonedResponse->internalBodyBuff er());
174 } else { 174 } else {
175 EXPECT_FALSE(response->bodyBuffer()); 175 EXPECT_FALSE(response->bodyBuffer());
176 EXPECT_FALSE(clonedResponse->bodyBuffer()); 176 EXPECT_FALSE(clonedResponse->bodyBuffer());
177 } 177 }
178 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client1 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient(); 178 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client1 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient();
179 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client2 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient(); 179 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client2 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient();
180 EXPECT_CALL(*client1, didFetchDataLoadedString(String("Hello, world"))); 180 EXPECT_CALL(*client1, didFetchDataLoadedString(String("Hello, world")));
181 EXPECT_CALL(*client2, didFetchDataLoadedString(String("Hello, world"))); 181 EXPECT_CALL(*client2, didFetchDataLoadedString(String("Hello, world")));
182 182
183 response->internalBodyBuffer()->startLoading(response->executionContext(), F etchDataLoader::createLoaderAsString(), client1); 183 response->internalBodyBuffer()->startLoading(response->getExecutionContext() , FetchDataLoader::createLoaderAsString(), client1);
184 clonedResponse->internalBodyBuffer()->startLoading(response->executionContex t(), FetchDataLoader::createLoaderAsString(), client2); 184 clonedResponse->internalBodyBuffer()->startLoading(response->getExecutionCon text(), FetchDataLoader::createLoaderAsString(), client2);
185 blink::testing::runPendingTasks(); 185 blink::testing::runPendingTasks();
186 } 186 }
187 187
188 BodyStreamBuffer* createHelloWorldBuffer() 188 BodyStreamBuffer* createHelloWorldBuffer()
189 { 189 {
190 using Command = DataConsumerHandleTestUtil::Command; 190 using Command = DataConsumerHandleTestUtil::Command;
191 OwnPtr<DataConsumerHandleTestUtil::ReplayingHandle> src(DataConsumerHandleTe stUtil::ReplayingHandle::create()); 191 OwnPtr<DataConsumerHandleTestUtil::ReplayingHandle> src(DataConsumerHandleTe stUtil::ReplayingHandle::create());
192 src->add(Command(Command::Data, "Hello, ")); 192 src->add(Command(Command::Data, "Hello, "));
193 src->add(Command(Command::Data, "world")); 193 src->add(Command(Command::Data, "world"));
194 src->add(Command(Command::Done)); 194 src->add(Command(Command::Done));
195 return new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(src.r elease())); 195 return new BodyStreamBuffer(createFetchDataConsumerHandleFromWebHandle(src.r elease()));
196 } 196 }
197 197
198 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneDefault) 198 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneDefault)
199 { 199 {
200 BodyStreamBuffer* buffer = createHelloWorldBuffer(); 200 BodyStreamBuffer* buffer = createHelloWorldBuffer();
201 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); 201 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer);
202 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); 202 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com"));
203 Response* response = Response::create(executionContext(), fetchResponseData) ; 203 Response* response = Response::create(getExecutionContext(), fetchResponseDa ta);
204 EXPECT_EQ(response->internalBodyBuffer(), buffer); 204 EXPECT_EQ(response->internalBodyBuffer(), buffer);
205 checkResponseStream(response, true); 205 checkResponseStream(response, true);
206 } 206 }
207 207
208 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneBasic) 208 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneBasic)
209 { 209 {
210 BodyStreamBuffer* buffer = createHelloWorldBuffer(); 210 BodyStreamBuffer* buffer = createHelloWorldBuffer();
211 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); 211 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer);
212 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); 212 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com"));
213 fetchResponseData = fetchResponseData->createBasicFilteredResponse(); 213 fetchResponseData = fetchResponseData->createBasicFilteredResponse();
214 Response* response = Response::create(executionContext(), fetchResponseData) ; 214 Response* response = Response::create(getExecutionContext(), fetchResponseDa ta);
215 EXPECT_EQ(response->internalBodyBuffer(), buffer); 215 EXPECT_EQ(response->internalBodyBuffer(), buffer);
216 checkResponseStream(response, true); 216 checkResponseStream(response, true);
217 } 217 }
218 218
219 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneCORS) 219 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneCORS)
220 { 220 {
221 BodyStreamBuffer* buffer = createHelloWorldBuffer(); 221 BodyStreamBuffer* buffer = createHelloWorldBuffer();
222 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); 222 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer);
223 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); 223 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com"));
224 fetchResponseData = fetchResponseData->createCORSFilteredResponse(); 224 fetchResponseData = fetchResponseData->createCORSFilteredResponse();
225 Response* response = Response::create(executionContext(), fetchResponseData) ; 225 Response* response = Response::create(getExecutionContext(), fetchResponseDa ta);
226 EXPECT_EQ(response->internalBodyBuffer(), buffer); 226 EXPECT_EQ(response->internalBodyBuffer(), buffer);
227 checkResponseStream(response, true); 227 checkResponseStream(response, true);
228 } 228 }
229 229
230 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneOpaque) 230 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneOpaque)
231 { 231 {
232 BodyStreamBuffer* buffer = createHelloWorldBuffer(); 232 BodyStreamBuffer* buffer = createHelloWorldBuffer();
233 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); 233 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer);
234 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); 234 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com"));
235 fetchResponseData = fetchResponseData->createOpaqueFilteredResponse(); 235 fetchResponseData = fetchResponseData->createOpaqueFilteredResponse();
236 Response* response = Response::create(executionContext(), fetchResponseData) ; 236 Response* response = Response::create(getExecutionContext(), fetchResponseDa ta);
237 EXPECT_EQ(response->internalBodyBuffer(), buffer); 237 EXPECT_EQ(response->internalBodyBuffer(), buffer);
238 checkResponseStream(response, false); 238 checkResponseStream(response, false);
239 } 239 }
240 240
241 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneError) 241 TEST_F(ServiceWorkerResponseTest, BodyStreamBufferCloneError)
242 { 242 {
243 BodyStreamBuffer* buffer = new BodyStreamBuffer(createFetchDataConsumerHandl eFromWebHandle(createUnexpectedErrorDataConsumerHandle())); 243 BodyStreamBuffer* buffer = new BodyStreamBuffer(createFetchDataConsumerHandl eFromWebHandle(createUnexpectedErrorDataConsumerHandle()));
244 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer); 244 FetchResponseData* fetchResponseData = FetchResponseData::createWithBuffer(b uffer);
245 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com")); 245 fetchResponseData->setURL(KURL(ParsedURLString, "http://www.response.com"));
246 Response* response = Response::create(executionContext(), fetchResponseData) ; 246 Response* response = Response::create(getExecutionContext(), fetchResponseDa ta);
247 TrackExceptionState exceptionState; 247 TrackExceptionState exceptionState;
248 Response* clonedResponse = response->clone(exceptionState); 248 Response* clonedResponse = response->clone(exceptionState);
249 EXPECT_FALSE(exceptionState.hadException()); 249 EXPECT_FALSE(exceptionState.hadException());
250 250
251 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client1 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient(); 251 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client1 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient();
252 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client2 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient(); 252 DataConsumerHandleTestUtil::MockFetchDataLoaderClient* client2 = new DataCon sumerHandleTestUtil::MockFetchDataLoaderClient();
253 EXPECT_CALL(*client1, didFetchDataLoadFailed()); 253 EXPECT_CALL(*client1, didFetchDataLoadFailed());
254 EXPECT_CALL(*client2, didFetchDataLoadFailed()); 254 EXPECT_CALL(*client2, didFetchDataLoadFailed());
255 255
256 response->internalBodyBuffer()->startLoading(response->executionContext(), F etchDataLoader::createLoaderAsString(), client1); 256 response->internalBodyBuffer()->startLoading(response->getExecutionContext() , FetchDataLoader::createLoaderAsString(), client1);
257 clonedResponse->internalBodyBuffer()->startLoading(response->executionContex t(), FetchDataLoader::createLoaderAsString(), client2); 257 clonedResponse->internalBodyBuffer()->startLoading(response->getExecutionCon text(), FetchDataLoader::createLoaderAsString(), client2);
258 blink::testing::runPendingTasks(); 258 blink::testing::runPendingTasks();
259 } 259 }
260 260
261 } // namespace 261 } // namespace
262 } // namespace blink 262 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/modules/fetch/Response.cpp ('k') | third_party/WebKit/Source/modules/filesystem/DOMFileSystem.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698