Index: chrome/test/chrome_plugin/test_chrome_plugin.cc |
diff --git a/chrome/test/chrome_plugin/test_chrome_plugin.cc b/chrome/test/chrome_plugin/test_chrome_plugin.cc |
deleted file mode 100644 |
index 751a9c244f7e5e082e9053ef71bba34d0ff97818..0000000000000000000000000000000000000000 |
--- a/chrome/test/chrome_plugin/test_chrome_plugin.cc |
+++ /dev/null |
@@ -1,383 +0,0 @@ |
-// Copyright (c) 2006-2008 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. |
- |
-#include "chrome/test/chrome_plugin/test_chrome_plugin.h" |
- |
-#include "base/at_exit.h" |
-#include "base/basictypes.h" |
-#include "base/logging.h" |
-#include "base/message_loop.h" |
-#include "base/string_util.h" |
-#include "chrome/common/chrome_plugin_api.h" |
-#include "googleurl/src/gurl.h" |
- |
-static CPID g_cpid; |
-static CPBrowserFuncs g_cpbrowser_funcs; |
-static CPRequestFuncs g_cprequest_funcs; |
-static CPResponseFuncs g_cpresponse_funcs; |
-static TestFuncParams::BrowserFuncs g_cptest_funcs; |
- |
-// Create a global AtExitManager so that our code can use code from base that |
-// uses Singletons, for example. We don't care about static constructors here. |
-static base::AtExitManager global_at_exit_manager; |
- |
-const TestResponsePayload* FindPayload(const char* url) { |
- for (size_t i = 0; i < arraysize(kChromeTestPluginPayloads); ++i) { |
- if (strcmp(kChromeTestPluginPayloads[i].url, url) == 0) |
- return &kChromeTestPluginPayloads[i]; |
- } |
- return NULL; |
-} |
- |
-std::string GetPayloadHeaders(const TestResponsePayload* payload) { |
- return StringPrintf( |
- "HTTP/1.1 200 OK%c" |
- "Content-type: %s%c" |
- "%c", 0, payload->mime_type, 0, 0); |
-} |
- |
-void STDCALL InvokeLaterCallback(void* data) { |
- Task* task = static_cast<Task*>(data); |
- task->Run(); |
- delete task; |
-} |
- |
-// ResponseStream: Manages the streaming of the payload data. |
- |
-class ResponseStream : public base::RefCounted<ResponseStream> { |
- public: |
- ResponseStream(const TestResponsePayload* payload, CPRequest* request); |
- |
- void Init(); |
- int GetResponseInfo(CPResponseInfoType type, void* buf, uint32 buf_size); |
- int ReadData(void* buf, uint32 buf_size); |
- |
- private: |
- friend class base::RefCounted<ResponseStream>; |
- |
- ~ResponseStream() { |
- request_->pdata = NULL; |
- } |
- |
- // Called asynchronously via InvokeLater. |
- void ResponseStarted(); |
- int ReadCompleted(void* buf, uint32 buf_size); |
- |
- enum ReadyStates { |
- READY_INVALID = 0, |
- READY_WAITING = 1, |
- READY_GOT_HEADERS = 2, |
- READY_GOT_DATA = 3, |
- }; |
- const TestResponsePayload* payload_; |
- uint32 offset_; |
- int ready_state_; |
- CPRequest* request_; |
-}; |
- |
-ResponseStream::ResponseStream(const TestResponsePayload* payload, |
- CPRequest* request) |
- : payload_(payload), offset_(0), ready_state_(READY_INVALID), |
- request_(request) { |
-} |
- |
-void ResponseStream::Init() { |
- if (payload_->async) { |
- // simulate an asynchronous start complete |
- ready_state_ = READY_WAITING; |
- g_cptest_funcs.invoke_later( |
- InvokeLaterCallback, |
- // downcast to Task before void, since we upcast from void to Task. |
- static_cast<Task*>( |
- NewRunnableMethod(this, &ResponseStream::ResponseStarted)), |
- 500); |
- } else { |
- ready_state_ = READY_GOT_DATA; |
- } |
-} |
- |
-int ResponseStream::GetResponseInfo(CPResponseInfoType type, void* buf, |
- uint32 buf_size) { |
- if (ready_state_ < READY_GOT_HEADERS) |
- return CPERR_FAILURE; |
- |
- switch (type) { |
- case CPRESPONSEINFO_HTTP_STATUS: |
- if (buf) |
- memcpy(buf, &payload_->status, buf_size); |
- break; |
- case CPRESPONSEINFO_HTTP_RAW_HEADERS: { |
- std::string headers = GetPayloadHeaders(payload_); |
- if (buf_size < headers.size()+1) |
- return static_cast<int>(headers.size()+1); |
- if (buf) |
- memcpy(buf, headers.c_str(), headers.size()+1); |
- break; |
- } |
- default: |
- return CPERR_INVALID_VERSION; |
- } |
- |
- return CPERR_SUCCESS; |
-} |
- |
-int ResponseStream::ReadData(void* buf, uint32 buf_size) { |
- if (ready_state_ < READY_GOT_DATA) { |
- // simulate an asynchronous read complete |
- g_cptest_funcs.invoke_later( |
- InvokeLaterCallback, |
- // downcast to Task before void, since we upcast from void to Task. |
- static_cast<Task*>( |
- NewRunnableMethod(this, &ResponseStream::ReadCompleted, |
- buf, buf_size)), |
- 500); |
- return CPERR_IO_PENDING; |
- } |
- |
- // synchronously complete the read |
- return ReadCompleted(buf, buf_size); |
-} |
- |
-void ResponseStream::ResponseStarted() { |
- ready_state_ = READY_GOT_HEADERS; |
- g_cpresponse_funcs.start_completed(request_, CPERR_SUCCESS); |
-} |
- |
-int ResponseStream::ReadCompleted(void* buf, uint32 buf_size) { |
- uint32 size = static_cast<uint32>(strlen(payload_->body)); |
- uint32 avail = size - offset_; |
- uint32 count = buf_size; |
- if (count > avail) |
- count = avail; |
- |
- if (count) { |
- memcpy(buf, payload_->body + offset_, count); |
- } |
- |
- offset_ += count; |
- |
- if (ready_state_ < READY_GOT_DATA) { |
- ready_state_ = READY_GOT_DATA; |
- g_cpresponse_funcs.read_completed(request_, static_cast<int>(count)); |
- } |
- |
- return count; |
-} |
- |
-// CPP Funcs |
- |
-CPError STDCALL CPP_Shutdown() { |
- return CPERR_SUCCESS; |
-} |
- |
-CPBool STDCALL CPP_ShouldInterceptRequest(CPRequest* request) { |
- DCHECK(base::strncasecmp(request->url, kChromeTestPluginProtocol, |
- arraysize(kChromeTestPluginProtocol) - 1) == 0); |
- return FindPayload(request->url) != NULL; |
-} |
- |
-CPError STDCALL CPR_StartRequest(CPRequest* request) { |
- const TestResponsePayload* payload = FindPayload(request->url); |
- DCHECK(payload); |
- ResponseStream* stream = new ResponseStream(payload, request); |
- stream->AddRef(); // Released in CPR_EndRequest |
- stream->Init(); |
- request->pdata = stream; |
- return payload->async ? CPERR_IO_PENDING : CPERR_SUCCESS; |
-} |
- |
-void STDCALL CPR_EndRequest(CPRequest* request, CPError reason) { |
- ResponseStream* stream = static_cast<ResponseStream*>(request->pdata); |
- request->pdata = NULL; |
- stream->Release(); // balances AddRef in CPR_StartRequest |
-} |
- |
-void STDCALL CPR_SetExtraRequestHeaders(CPRequest* request, |
- const char* headers) { |
- // doesn't affect us |
-} |
- |
-void STDCALL CPR_SetRequestLoadFlags(CPRequest* request, uint32 flags) { |
- // doesn't affect us |
-} |
- |
-void STDCALL CPR_AppendDataToUpload(CPRequest* request, const char* bytes, |
- int bytes_len) { |
- // doesn't affect us |
-} |
- |
-CPError STDCALL CPR_AppendFileToUpload(CPRequest* request, const char* filepath, |
- uint64 offset, uint64 length) { |
- // doesn't affect us |
- return CPERR_FAILURE; |
-} |
- |
-int STDCALL CPR_GetResponseInfo(CPRequest* request, CPResponseInfoType type, |
- void* buf, uint32 buf_size) { |
- ResponseStream* stream = static_cast<ResponseStream*>(request->pdata); |
- return stream->GetResponseInfo(type, buf, buf_size); |
-} |
- |
-int STDCALL CPR_Read(CPRequest* request, void* buf, uint32 buf_size) { |
- ResponseStream* stream = static_cast<ResponseStream*>(request->pdata); |
- return stream->ReadData(buf, buf_size); |
-} |
- |
-// RequestResponse: manages the retrieval of response data from the host |
- |
-class RequestResponse { |
- public: |
- explicit RequestResponse(const std::string& raw_headers) |
- : raw_headers_(raw_headers), offset_(0) {} |
- void StartReading(CPRequest* request); |
- void ReadCompleted(CPRequest* request, int bytes_read); |
- |
- private: |
- std::string raw_headers_; |
- std::string body_; |
- int offset_; |
-}; |
- |
-void RequestResponse::StartReading(CPRequest* request) { |
- int rv = 0; |
- const uint32 kReadSize = 4096; |
- do { |
- body_.resize(offset_ + kReadSize); |
- rv = g_cprequest_funcs.read(request, &body_[offset_], kReadSize); |
- if (rv > 0) |
- offset_ += rv; |
- } while (rv > 0); |
- |
- if (rv != CPERR_IO_PENDING) { |
- // Either an error occurred, or we are done. |
- ReadCompleted(request, rv); |
- } |
-} |
- |
-void RequestResponse::ReadCompleted(CPRequest* request, int bytes_read) { |
- if (bytes_read > 0) { |
- offset_ += bytes_read; |
- StartReading(request); |
- return; |
- } |
- |
- body_.resize(offset_); |
- bool success = (bytes_read == 0); |
- g_cptest_funcs.test_complete(request, success, raw_headers_, body_); |
- g_cprequest_funcs.end_request(request, CPERR_CANCELLED); |
- delete this; |
-} |
- |
-void STDCALL CPRR_ReceivedRedirect(CPRequest* request, const char* new_url) { |
-} |
- |
-void STDCALL CPRR_StartCompleted(CPRequest* request, CPError result) { |
- DCHECK(!request->pdata); |
- |
- std::string raw_headers; |
- int size = g_cprequest_funcs.get_response_info( |
- request, CPRESPONSEINFO_HTTP_RAW_HEADERS, NULL, 0); |
- int rv = size < 0 ? size : g_cprequest_funcs.get_response_info( |
- request, CPRESPONSEINFO_HTTP_RAW_HEADERS, |
- WriteInto(&raw_headers, size+1), size); |
- if (rv != CPERR_SUCCESS) { |
- g_cptest_funcs.test_complete(request, false, std::string(), std::string()); |
- g_cprequest_funcs.end_request(request, CPERR_CANCELLED); |
- return; |
- } |
- |
- RequestResponse* response = new RequestResponse(raw_headers); |
- request->pdata = response; |
- response->StartReading(request); |
-} |
- |
-void STDCALL CPRR_ReadCompleted(CPRequest* request, int bytes_read) { |
- RequestResponse* response = |
- reinterpret_cast<RequestResponse*>(request->pdata); |
- response->ReadCompleted(request, bytes_read); |
-} |
- |
-int STDCALL CPT_MakeRequest(const char* method, const GURL& url) { |
- CPRequest* request = NULL; |
- if (g_cpbrowser_funcs.create_request(g_cpid, NULL, method, url.spec().c_str(), |
- &request) != CPERR_SUCCESS || |
- !request) { |
- return CPERR_FAILURE; |
- } |
- |
- g_cprequest_funcs.set_request_load_flags(request, |
- CPREQUESTLOAD_DISABLE_INTERCEPT); |
- |
- if (strcmp(method, "POST") == 0) { |
- g_cprequest_funcs.set_extra_request_headers( |
- request, "Content-Type: text/plain"); |
- g_cprequest_funcs.append_data_to_upload( |
- request, kChromeTestPluginPostData, |
- arraysize(kChromeTestPluginPostData) - 1); |
- } |
- |
- int rv = g_cprequest_funcs.start_request(request); |
- if (rv == CPERR_SUCCESS) { |
- CPRR_StartCompleted(request, CPERR_SUCCESS); |
- } else if (rv != CPERR_IO_PENDING) { |
- g_cprequest_funcs.end_request(request, CPERR_CANCELLED); |
- return CPERR_FAILURE; |
- } |
- |
- return CPERR_SUCCESS; |
-} |
- |
-// DLL entry points |
- |
-CPError STDCALL CP_Initialize(CPID id, const CPBrowserFuncs* bfuncs, |
- CPPluginFuncs* pfuncs) { |
- if (bfuncs == NULL || pfuncs == NULL) |
- return CPERR_FAILURE; |
- |
- if (CP_GET_MAJOR_VERSION(bfuncs->version) > CP_MAJOR_VERSION) |
- return CPERR_INVALID_VERSION; |
- |
- if (bfuncs->size < sizeof(CPBrowserFuncs) || |
- pfuncs->size < sizeof(CPPluginFuncs)) |
- return CPERR_INVALID_VERSION; |
- |
- pfuncs->version = CP_VERSION; |
- pfuncs->shutdown = CPP_Shutdown; |
- pfuncs->should_intercept_request = CPP_ShouldInterceptRequest; |
- |
- static CPRequestFuncs request_funcs; |
- request_funcs.start_request = CPR_StartRequest; |
- request_funcs.end_request = CPR_EndRequest; |
- request_funcs.set_extra_request_headers = CPR_SetExtraRequestHeaders; |
- request_funcs.set_request_load_flags = CPR_SetRequestLoadFlags; |
- request_funcs.append_data_to_upload = CPR_AppendDataToUpload; |
- request_funcs.get_response_info = CPR_GetResponseInfo; |
- request_funcs.read = CPR_Read; |
- request_funcs.append_file_to_upload = CPR_AppendFileToUpload; |
- pfuncs->request_funcs = &request_funcs; |
- |
- static CPResponseFuncs response_funcs; |
- response_funcs.received_redirect = CPRR_ReceivedRedirect; |
- response_funcs.start_completed = CPRR_StartCompleted; |
- response_funcs.read_completed = CPRR_ReadCompleted; |
- pfuncs->response_funcs = &response_funcs; |
- |
- g_cpid = id; |
- g_cpbrowser_funcs = *bfuncs; |
- g_cprequest_funcs = *bfuncs->request_funcs; |
- g_cpresponse_funcs = *bfuncs->response_funcs; |
- g_cpbrowser_funcs = *bfuncs; |
- |
- const char* protocols[] = {kChromeTestPluginProtocol}; |
- g_cpbrowser_funcs.enable_request_intercept(g_cpid, protocols, 1); |
- return CPERR_SUCCESS; |
-} |
- |
-int STDCALL CP_Test(void* vparam) { |
- TestFuncParams* param = reinterpret_cast<TestFuncParams*>(vparam); |
- param->pfuncs.test_make_request = CPT_MakeRequest; |
- |
- g_cptest_funcs = param->bfuncs; |
- return CPERR_SUCCESS; |
-} |