| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 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 "chrome/common/chrome_plugin_util.h" | |
| 6 | |
| 7 #include <algorithm> | |
| 8 | |
| 9 #include "base/command_line.h" | |
| 10 #include "base/file_util.h" | |
| 11 #include "base/message_loop.h" | |
| 12 #include "base/string_util.h" | |
| 13 #include "base/utf_string_conversions.h" | |
| 14 #include "chrome/common/chrome_plugin_lib.h" | |
| 15 #include "chrome/common/chrome_switches.h" | |
| 16 #include "content/common/notification_service.h" | |
| 17 #include "net/base/load_flags.h" | |
| 18 #include "net/http/http_response_headers.h" | |
| 19 | |
| 20 // | |
| 21 // ScopableCPRequest | |
| 22 // | |
| 23 | |
| 24 ScopableCPRequest::ScopableCPRequest(const char* u, const char* m, | |
| 25 CPBrowsingContext c) { | |
| 26 pdata = NULL; | |
| 27 data = NULL; | |
| 28 #if defined(OS_WIN) | |
| 29 url = _strdup(u); | |
| 30 method = _strdup(m); | |
| 31 #else | |
| 32 url = strdup(u); | |
| 33 method = strdup(m); | |
| 34 #endif | |
| 35 context = c; | |
| 36 } | |
| 37 | |
| 38 ScopableCPRequest::~ScopableCPRequest() { | |
| 39 pdata = NULL; | |
| 40 data = NULL; | |
| 41 free(const_cast<char*>(url)); | |
| 42 free(const_cast<char*>(method)); | |
| 43 } | |
| 44 | |
| 45 // | |
| 46 // PluginHelper | |
| 47 // | |
| 48 | |
| 49 // static | |
| 50 void PluginHelper::DestroyAllHelpersForPlugin(ChromePluginLib* plugin) { | |
| 51 NotificationService::current()->Notify( | |
| 52 NotificationType::CHROME_PLUGIN_UNLOADED, | |
| 53 Source<ChromePluginLib>(plugin), | |
| 54 NotificationService::NoDetails()); | |
| 55 } | |
| 56 | |
| 57 PluginHelper::PluginHelper(ChromePluginLib* plugin) : plugin_(plugin) { | |
| 58 DCHECK(CalledOnValidThread()); | |
| 59 registrar_.Add(this, NotificationType::CHROME_PLUGIN_UNLOADED, | |
| 60 Source<ChromePluginLib>(plugin_)); | |
| 61 } | |
| 62 | |
| 63 PluginHelper::~PluginHelper() { | |
| 64 DCHECK(CalledOnValidThread()); | |
| 65 } | |
| 66 | |
| 67 void PluginHelper::Observe(NotificationType type, | |
| 68 const NotificationSource& source, | |
| 69 const NotificationDetails& details) { | |
| 70 DCHECK(CalledOnValidThread()); | |
| 71 DCHECK(type == NotificationType::CHROME_PLUGIN_UNLOADED); | |
| 72 DCHECK(plugin_ == Source<ChromePluginLib>(source).ptr()); | |
| 73 | |
| 74 delete this; | |
| 75 } | |
| 76 | |
| 77 // | |
| 78 // PluginResponseUtils | |
| 79 // | |
| 80 | |
| 81 uint32 PluginResponseUtils::CPLoadFlagsToNetFlags(uint32 flags) { | |
| 82 uint32 net_flags = 0; | |
| 83 #define HANDLE_FLAG(name) \ | |
| 84 if (flags & CPREQUEST##name) \ | |
| 85 net_flags |= net::name | |
| 86 | |
| 87 HANDLE_FLAG(LOAD_VALIDATE_CACHE); | |
| 88 HANDLE_FLAG(LOAD_BYPASS_CACHE); | |
| 89 HANDLE_FLAG(LOAD_PREFERRING_CACHE); | |
| 90 HANDLE_FLAG(LOAD_ONLY_FROM_CACHE); | |
| 91 HANDLE_FLAG(LOAD_DISABLE_CACHE); | |
| 92 HANDLE_FLAG(LOAD_DISABLE_INTERCEPT); | |
| 93 | |
| 94 net_flags |= net::LOAD_ENABLE_UPLOAD_PROGRESS; | |
| 95 | |
| 96 return net_flags; | |
| 97 } | |
| 98 | |
| 99 int PluginResponseUtils::GetResponseInfo( | |
| 100 const net::HttpResponseHeaders* response_headers, | |
| 101 CPResponseInfoType type, void* buf, size_t buf_size) { | |
| 102 if (!response_headers) | |
| 103 return CPERR_FAILURE; | |
| 104 | |
| 105 switch (type) { | |
| 106 case CPRESPONSEINFO_HTTP_STATUS: | |
| 107 if (buf && buf_size) { | |
| 108 int status = response_headers->response_code(); | |
| 109 memcpy(buf, &status, std::min(buf_size, sizeof(status))); | |
| 110 } | |
| 111 break; | |
| 112 case CPRESPONSEINFO_HTTP_RAW_HEADERS: { | |
| 113 const std::string& headers = response_headers->raw_headers(); | |
| 114 if (buf_size < headers.size()+1) | |
| 115 return static_cast<int>(headers.size()+1); | |
| 116 if (buf) | |
| 117 memcpy(buf, headers.c_str(), headers.size()+1); | |
| 118 break; | |
| 119 } | |
| 120 default: | |
| 121 return CPERR_INVALID_VERSION; | |
| 122 } | |
| 123 | |
| 124 return CPERR_SUCCESS; | |
| 125 } | |
| 126 | |
| 127 CPError CPB_GetCommandLineArgumentsCommon(const char* url, | |
| 128 std::string* arguments) { | |
| 129 // TODO(aa): all of this code is only used by Gears, which we are removing. | |
| 130 #if defined(OS_WIN) | |
| 131 const CommandLine cmd = *CommandLine::ForCurrentProcess(); | |
| 132 std::wstring arguments_w; | |
| 133 | |
| 134 // Use the same UserDataDir for new launches that we currently have set. | |
| 135 FilePath user_data_dir = cmd.GetSwitchValuePath(switches::kUserDataDir); | |
| 136 if (!user_data_dir.empty()) { | |
| 137 // Make sure user_data_dir is an absolute path. | |
| 138 if (file_util::AbsolutePath(&user_data_dir) && | |
| 139 file_util::PathExists(user_data_dir)) { | |
| 140 // TODO(evanm): use CommandLine APIs instead of this. | |
| 141 arguments_w += std::wstring(L"--") + ASCIIToWide(switches::kUserDataDir) + | |
| 142 L"=\"" + user_data_dir.value() + L"\" "; | |
| 143 } | |
| 144 } | |
| 145 | |
| 146 // Use '--app=url' instead of just 'url' to launch the browser with minimal | |
| 147 // chrome. | |
| 148 // Note: Do not change this flag! Old Gears shortcuts will break if you do! | |
| 149 std::string url_string(url); | |
| 150 ReplaceSubstringsAfterOffset(&url_string, 0, "\\", "%5C"); | |
| 151 ReplaceSubstringsAfterOffset(&url_string, 0, "\"", "%22"); | |
| 152 ReplaceSubstringsAfterOffset(&url_string, 0, ";", "%3B"); | |
| 153 ReplaceSubstringsAfterOffset(&url_string, 0, "$", "%24"); | |
| 154 // Windows shortcuts can't escape % so we use \x instead. | |
| 155 ReplaceSubstringsAfterOffset(&url_string, 0, "%", "\\x"); | |
| 156 std::wstring url_w = UTF8ToWide(url_string); | |
| 157 // TODO(evanm): use CommandLine APIs instead of this. | |
| 158 arguments_w += std::wstring(L"--") + ASCIIToWide(switches::kApp) + | |
| 159 L"=\"" + url_w + L"\""; | |
| 160 | |
| 161 *arguments = WideToUTF8(arguments_w); | |
| 162 #else | |
| 163 // None of this code is used on non-Windows platforms. | |
| 164 NOTREACHED(); | |
| 165 #endif | |
| 166 | |
| 167 return CPERR_SUCCESS; | |
| 168 } | |
| 169 | |
| 170 // | |
| 171 // Host functions shared by browser and plugin processes | |
| 172 // | |
| 173 | |
| 174 void* STDCALL CPB_Alloc(uint32 size) { | |
| 175 return malloc(size); | |
| 176 } | |
| 177 | |
| 178 void STDCALL CPB_Free(void* memory) { | |
| 179 free(memory); | |
| 180 } | |
| OLD | NEW |