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

Side by Side Diff: net/BUILD.gn

Issue 1287893005: Reland: Make separate net and url GN targets with and without ICU (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased Created 5 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
« no previous file with comments | « no previous file | net/net.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 # Copyright (c) 2013 The Chromium Authors. All rights reserved. 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 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 import("//build/config/crypto.gni") 5 import("//build/config/crypto.gni")
6 import("//build/config/features.gni") 6 import("//build/config/features.gni")
7 import("//build/config/ui.gni") 7 import("//build/config/ui.gni")
8 import("//build/module_args/v8.gni") 8 import("//build/module_args/v8.gni")
9 import("//url/config.gni")
10 import("//testing/test.gni") 9 import("//testing/test.gni")
11 import("//third_party/icu/config.gni") 10 import("//third_party/icu/config.gni")
12 import("//third_party/protobuf/proto_library.gni") 11 import("//third_party/protobuf/proto_library.gni")
13 12
14 # TODO(cjhopman): //build/config/android/rules.gni also imports grit_rule.gni. 13 # TODO(cjhopman): //build/config/android/rules.gni also imports grit_rule.gni.
15 # Currently, that file can't be imported multiple times. Make this always 14 # Currently, that file can't be imported multiple times. Make this always
16 # imported when http://crbug.com/393704 is fixed. 15 # imported when http://crbug.com/393704 is fixed.
17 if (!is_android) { 16 if (!is_android) {
18 import("//tools/grit/grit_rule.gni") 17 import("//tools/grit/grit_rule.gni")
19 } 18 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
56 config("net_config") { 55 config("net_config") {
57 defines = [] 56 defines = []
58 if (posix_avoid_mmap) { 57 if (posix_avoid_mmap) {
59 defines += [ "POSIX_AVOID_MMAP" ] 58 defines += [ "POSIX_AVOID_MMAP" ]
60 } 59 }
61 if (disable_file_support) { 60 if (disable_file_support) {
62 defines += [ "DISABLE_FILE_SUPPORT" ] 61 defines += [ "DISABLE_FILE_SUPPORT" ]
63 } 62 }
64 } 63 }
65 64
66 component("net") { 65 # net_internal_config is shared with net and net_small.
67 sources = 66 config("net_internal_config") {
68 gypi_values.net_nacl_common_sources + gypi_values.net_non_nacl_sources
69
70 cflags = []
71 defines = [ 67 defines = [
72 # TODO(GYP) Note that the GYP file supports linux_link_kerberos (defaults to 68 # TODO(GYP) Note that the GYP file supports linux_link_kerberos (defaults to
73 # 0) which implies that we run pkg_config on kerberos and link to that 69 # 0) which implies that we run pkg_config on kerberos and link to that
74 # rather than setting this define which will dynamically open it. That 70 # rather than setting this define which will dynamically open it. That
75 # doesn't seem to be set in the regular builds, so we're skipping this 71 # doesn't seem to be set in the regular builds, so we're skipping this
76 # capability here. 72 # capability here.
77 "DLOPEN_KERBEROS", 73 "DLOPEN_KERBEROS",
78 "NET_IMPLEMENTATION", 74 "NET_IMPLEMENTATION",
79 ] 75 ]
80 76
81 configs += [
82 "//build/config:precompiled_headers",
83
84 # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
85 "//build/config/compiler:no_size_t_to_int_warning",
86 ]
87 public_configs = [ ":net_config" ]
88 include_dirs = []
89
90 public_deps = [
91 ":net_quic_proto",
92 "//crypto",
93 "//crypto:platform",
94 "//url",
95 ]
96 deps = [
97 ":net_resources",
98 "//base",
99 "//base:prefs",
100 "//base/third_party/dynamic_annotations",
101 "//net/base/registry_controlled_domains",
102 "//sdch",
103 "//third_party/protobuf:protobuf_lite",
104 "//third_party/zlib",
105 "//url",
106 ]
107
108 if (use_kerberos) { 77 if (use_kerberos) {
109 defines += [ "USE_KERBEROS" ] 78 defines += [ "USE_KERBEROS" ]
110 if (is_android) { 79 if (is_android) {
111 include_dirs += [ "/usr/include/kerberosV" ] 80 include_dirs = [ "/usr/include/kerberosV" ]
112 } 81 }
113 } else {
114 sources -= [
115 "http/http_auth_gssapi_posix.cc",
116 "http/http_auth_gssapi_posix.h",
117 "http/http_auth_handler_negotiate.cc",
118 "http/http_auth_handler_negotiate.h",
119 ]
120 }
121
122 if (is_posix) {
123 if (posix_avoid_mmap) {
124 sources -= [ "disk_cache/blockfile/mapped_file_posix.cc" ]
125 } else {
126 sources -= [ "disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc" ]
127 }
128 }
129
130 if (disable_file_support) {
131 sources -= [
132 "base/directory_lister.cc",
133 "base/directory_lister.h",
134 "url_request/file_protocol_handler.cc",
135 "url_request/file_protocol_handler.h",
136 "url_request/url_request_file_dir_job.cc",
137 "url_request/url_request_file_dir_job.h",
138 "url_request/url_request_file_job.cc",
139 "url_request/url_request_file_job.h",
140 ]
141 }
142
143 if (disable_ftp_support) {
144 sources -= [
145 "ftp/ftp_auth_cache.cc",
146 "ftp/ftp_auth_cache.h",
147 "ftp/ftp_ctrl_response_buffer.cc",
148 "ftp/ftp_ctrl_response_buffer.h",
149 "ftp/ftp_directory_listing_parser.cc",
150 "ftp/ftp_directory_listing_parser.h",
151 "ftp/ftp_directory_listing_parser_ls.cc",
152 "ftp/ftp_directory_listing_parser_ls.h",
153 "ftp/ftp_directory_listing_parser_netware.cc",
154 "ftp/ftp_directory_listing_parser_netware.h",
155 "ftp/ftp_directory_listing_parser_os2.cc",
156 "ftp/ftp_directory_listing_parser_os2.h",
157 "ftp/ftp_directory_listing_parser_vms.cc",
158 "ftp/ftp_directory_listing_parser_vms.h",
159 "ftp/ftp_directory_listing_parser_windows.cc",
160 "ftp/ftp_directory_listing_parser_windows.h",
161 "ftp/ftp_network_layer.cc",
162 "ftp/ftp_network_layer.h",
163 "ftp/ftp_network_session.cc",
164 "ftp/ftp_network_session.h",
165 "ftp/ftp_network_transaction.cc",
166 "ftp/ftp_network_transaction.h",
167 "ftp/ftp_request_info.h",
168 "ftp/ftp_response_info.cc",
169 "ftp/ftp_response_info.h",
170 "ftp/ftp_server_type_histograms.cc",
171 "ftp/ftp_server_type_histograms.h",
172 "ftp/ftp_transaction.h",
173 "ftp/ftp_transaction_factory.h",
174 "ftp/ftp_util.cc",
175 "ftp/ftp_util.h",
176 "url_request/ftp_protocol_handler.cc",
177 "url_request/ftp_protocol_handler.h",
178 "url_request/url_request_ftp_job.cc",
179 "url_request/url_request_ftp_job.h",
180 ]
181 } 82 }
182 83
183 if (enable_built_in_dns) { 84 if (enable_built_in_dns) {
184 defines += [ "ENABLE_BUILT_IN_DNS" ] 85 defines += [ "ENABLE_BUILT_IN_DNS" ]
86 }
87 }
88
89 # net_shared_* are settings shared between net and net_small
90 net_shared_sources =
91 gypi_values.net_nacl_common_sources + gypi_values.net_non_nacl_sources
92
93 net_shared_unfiltered_sources = []
94
95 net_shared_configs = [
96 ":net_internal_config",
97 "//build/config:precompiled_headers",
98
99 # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
100 "//build/config/compiler:no_size_t_to_int_warning",
101 ]
102
103 net_shared_public_deps = [
104 ":net_quic_proto",
105 "//crypto",
106 "//crypto:platform",
107 ]
108
109 net_shared_deps = [
110 ":net_resources",
111 "//base",
112 "//base:prefs",
113 "//base/third_party/dynamic_annotations",
114 "//net/base/registry_controlled_domains",
115 "//sdch",
116 "//third_party/protobuf:protobuf_lite",
117 "//third_party/zlib",
118 ]
119
120 if (!use_kerberos) {
121 net_shared_sources -= [
122 "http/http_auth_gssapi_posix.cc",
123 "http/http_auth_gssapi_posix.h",
124 "http/http_auth_handler_negotiate.cc",
125 "http/http_auth_handler_negotiate.h",
126 ]
127 }
128
129 if (is_posix) {
130 if (posix_avoid_mmap) {
131 net_shared_sources -= [ "disk_cache/blockfile/mapped_file_posix.cc" ]
185 } else { 132 } else {
186 sources -= [ 133 net_shared_sources -=
187 "dns/address_sorter_posix.cc", 134 [ "disk_cache/blockfile/mapped_file_avoid_mmap_posix.cc" ]
188 "dns/address_sorter_posix.h", 135 }
189 "dns/dns_client.cc", 136 }
190 ] 137
191 } 138 if (!enable_built_in_dns) {
192 139 net_shared_sources -= [
193 if (use_openssl) { 140 "dns/address_sorter_posix.cc",
194 sources -= [ 141 "dns/address_sorter_posix.h",
195 "base/nss_memio.c", 142 "dns/dns_client.cc",
196 "base/nss_memio.h", 143 ]
197 "cert/ct_log_verifier_nss.cc", 144 }
198 "cert/ct_objects_extractor_nss.cc", 145
199 "cert/jwk_serializer_nss.cc", 146 if (use_openssl) {
200 "cert/scoped_nss_types.h", 147 net_shared_sources -= [
201 "cert/x509_util_nss.cc", 148 "base/nss_memio.c",
202 "quic/crypto/aead_base_decrypter_nss.cc", 149 "base/nss_memio.h",
203 "quic/crypto/aead_base_encrypter_nss.cc", 150 "cert/ct_log_verifier_nss.cc",
204 "quic/crypto/aes_128_gcm_12_decrypter_nss.cc", 151 "cert/ct_objects_extractor_nss.cc",
205 "quic/crypto/aes_128_gcm_12_encrypter_nss.cc", 152 "cert/jwk_serializer_nss.cc",
206 "quic/crypto/chacha20_poly1305_decrypter_nss.cc", 153 "cert/scoped_nss_types.h",
207 "quic/crypto/chacha20_poly1305_encrypter_nss.cc", 154 "cert/x509_util_nss.cc",
208 "quic/crypto/channel_id_nss.cc", 155 "quic/crypto/aead_base_decrypter_nss.cc",
209 "quic/crypto/p256_key_exchange_nss.cc", 156 "quic/crypto/aead_base_encrypter_nss.cc",
210 "socket/nss_ssl_util.cc", 157 "quic/crypto/aes_128_gcm_12_decrypter_nss.cc",
211 "socket/nss_ssl_util.h", 158 "quic/crypto/aes_128_gcm_12_encrypter_nss.cc",
212 "socket/ssl_client_socket_nss.cc", 159 "quic/crypto/chacha20_poly1305_decrypter_nss.cc",
213 "socket/ssl_client_socket_nss.h", 160 "quic/crypto/chacha20_poly1305_encrypter_nss.cc",
214 "socket/ssl_server_socket_nss.cc", 161 "quic/crypto/channel_id_nss.cc",
215 "socket/ssl_server_socket_nss.h", 162 "quic/crypto/p256_key_exchange_nss.cc",
216 ] 163 "socket/nss_ssl_util.cc",
217 if (is_ios) { 164 "socket/nss_ssl_util.h",
218 # Always removed for !ios below. 165 "socket/ssl_client_socket_nss.cc",
219 sources -= [ 166 "socket/ssl_client_socket_nss.h",
220 "cert/cert_verify_proc_nss.cc", 167 "socket/ssl_server_socket_nss.cc",
221 "cert/cert_verify_proc_nss.h", 168 "socket/ssl_server_socket_nss.h",
222 ] 169 ]
223 } 170 if (is_ios) {
224 if (is_win) { 171 # Always removed for !ios below.
225 sources -= [ "cert/sha256_legacy_support_nss_win.cc" ] 172 net_shared_sources -= [
226 } 173 "cert/cert_verify_proc_nss.cc",
227 if (!use_nss_certs && !is_ios) { 174 "cert/cert_verify_proc_nss.h",
228 sources -= [ "cert/x509_util_nss.h" ] 175 ]
229 } 176 }
230 } else { 177 if (is_win) {
231 sources -= [ 178 net_shared_sources -= [ "cert/sha256_legacy_support_nss_win.cc" ]
232 "cert/ct_log_verifier_openssl.cc", 179 }
233 "cert/ct_objects_extractor_openssl.cc", 180 if (!use_nss_certs && !is_ios) {
234 "cert/jwk_serializer_openssl.cc", 181 net_shared_sources -= [ "cert/x509_util_nss.h" ]
235 "cert/x509_util_openssl.cc", 182 }
236 "cert/x509_util_openssl.h", 183 } else {
237 "quic/crypto/aead_base_decrypter_openssl.cc", 184 net_shared_sources -= [
238 "quic/crypto/aead_base_encrypter_openssl.cc", 185 "cert/ct_log_verifier_openssl.cc",
239 "quic/crypto/aes_128_gcm_12_decrypter_openssl.cc", 186 "cert/ct_objects_extractor_openssl.cc",
240 "quic/crypto/aes_128_gcm_12_encrypter_openssl.cc", 187 "cert/jwk_serializer_openssl.cc",
241 "quic/crypto/chacha20_poly1305_decrypter_openssl.cc", 188 "cert/x509_util_openssl.cc",
242 "quic/crypto/chacha20_poly1305_encrypter_openssl.cc", 189 "cert/x509_util_openssl.h",
243 "quic/crypto/channel_id_openssl.cc", 190 "quic/crypto/aead_base_decrypter_openssl.cc",
244 "quic/crypto/p256_key_exchange_openssl.cc", 191 "quic/crypto/aead_base_encrypter_openssl.cc",
245 "quic/crypto/scoped_evp_aead_ctx.cc", 192 "quic/crypto/aes_128_gcm_12_decrypter_openssl.cc",
246 "quic/crypto/scoped_evp_aead_ctx.h", 193 "quic/crypto/aes_128_gcm_12_encrypter_openssl.cc",
247 "socket/ssl_client_socket_openssl.cc", 194 "quic/crypto/chacha20_poly1305_decrypter_openssl.cc",
248 "socket/ssl_client_socket_openssl.h", 195 "quic/crypto/chacha20_poly1305_encrypter_openssl.cc",
249 "socket/ssl_server_socket_openssl.cc", 196 "quic/crypto/channel_id_openssl.cc",
250 "socket/ssl_server_socket_openssl.h", 197 "quic/crypto/p256_key_exchange_openssl.cc",
251 "ssl/openssl_ssl_util.cc", 198 "quic/crypto/scoped_evp_aead_ctx.cc",
252 "ssl/openssl_ssl_util.h", 199 "quic/crypto/scoped_evp_aead_ctx.h",
253 "ssl/ssl_client_session_cache_openssl.cc", 200 "socket/ssl_client_socket_openssl.cc",
254 "ssl/ssl_client_session_cache_openssl.h", 201 "socket/ssl_client_socket_openssl.h",
255 "ssl/ssl_platform_key.h", 202 "socket/ssl_server_socket_openssl.cc",
256 "ssl/threaded_ssl_private_key.cc", 203 "socket/ssl_server_socket_openssl.h",
257 "ssl/threaded_ssl_private_key.h", 204 "ssl/openssl_ssl_util.cc",
258 ] 205 "ssl/openssl_ssl_util.h",
259 if (is_mac) { 206 "ssl/ssl_client_session_cache_openssl.cc",
260 sources -= [ "ssl/ssl_platform_key_mac.cc" ] 207 "ssl/ssl_client_session_cache_openssl.h",
261 } 208 "ssl/ssl_platform_key.h",
262 if (is_android) { 209 "ssl/threaded_ssl_private_key.cc",
263 sources -= [ "ssl/ssl_platform_key_android.cc" ] 210 "ssl/threaded_ssl_private_key.h",
264 } 211 ]
265 if (is_win) { 212 if (is_mac) {
266 sources -= [ 213 net_shared_sources -= [ "ssl/ssl_platform_key_mac.cc" ]
267 "cert/sha256_legacy_support_openssl_win.cc", 214 }
268 "ssl/ssl_platform_key_win.cc", 215 if (is_android) {
269 ] 216 net_shared_sources -= [ "ssl/ssl_platform_key_android.cc" ]
270 } 217 }
271 if (use_nss_certs) { 218 if (is_win) {
272 sources -= [ 219 net_shared_sources -= [
273 "ssl/client_key_store.cc", 220 "cert/sha256_legacy_support_openssl_win.cc",
274 "ssl/client_key_store.h", 221 "ssl/ssl_platform_key_win.cc",
275 "ssl/ssl_platform_key_nss.cc", 222 ]
276 ] 223 }
277 } 224 if (use_nss_certs) {
278 } 225 net_shared_sources -= [
279 226 "ssl/client_key_store.cc",
280 if (!use_openssl_certs) { 227 "ssl/client_key_store.h",
281 sources -= [ 228 "ssl/ssl_platform_key_nss.cc",
282 "base/crypto_module_openssl.cc", 229 ]
283 "base/keygen_handler_openssl.cc", 230 }
284 "base/openssl_private_key_store.h", 231 }
232
233 if (!use_openssl_certs) {
234 net_shared_sources -= [
235 "base/crypto_module_openssl.cc",
236 "base/keygen_handler_openssl.cc",
237 "base/openssl_private_key_store.h",
238 "base/openssl_private_key_store_memory.cc",
239 "cert/cert_database_openssl.cc",
240 "cert/cert_verify_proc_openssl.cc",
241 "cert/cert_verify_proc_openssl.h",
242 "cert/test_root_certs_openssl.cc",
243 "cert/x509_certificate_openssl.cc",
244 "ssl/openssl_client_key_store.cc",
245 "ssl/openssl_client_key_store.h",
246 ]
247 if (is_android) {
248 net_shared_sources -= [ "base/openssl_private_key_store_android.cc" ]
249 }
250 } else {
251 if (is_android) {
252 # Android doesn't use these even when using OpenSSL.
253 net_shared_sources -= [
285 "base/openssl_private_key_store_memory.cc", 254 "base/openssl_private_key_store_memory.cc",
286 "cert/cert_database_openssl.cc", 255 "cert/cert_database_openssl.cc",
287 "cert/cert_verify_proc_openssl.cc", 256 "cert/cert_verify_proc_openssl.cc",
288 "cert/cert_verify_proc_openssl.h",
289 "cert/test_root_certs_openssl.cc", 257 "cert/test_root_certs_openssl.cc",
290 "cert/x509_certificate_openssl.cc", 258 ]
291 "ssl/openssl_client_key_store.cc", 259 }
292 "ssl/openssl_client_key_store.h", 260 }
293 ] 261
294 if (is_android) { 262 if (use_glib && !is_chromeos) {
295 sources -= [ "base/openssl_private_key_store_android.cc" ] 263 net_shared_configs += [ "//build/config/linux:gconf" ]
296 } 264 net_shared_deps += [ "//build/linux:gio" ]
297 } else { 265 }
298 if (is_android) { 266
299 # Android doesn't use these even when using OpenSSL. 267 if (is_linux) {
300 sources -= [ 268 net_shared_configs += [ "//build/config/linux:libresolv" ]
301 "base/openssl_private_key_store_memory.cc", 269 }
302 "cert/cert_database_openssl.cc", 270
303 "cert/cert_verify_proc_openssl.cc", 271 if (!use_nss_certs) {
304 "cert/test_root_certs_openssl.cc", 272 net_shared_sources -= [
305 ] 273 "base/crypto_module_nss.cc",
306 } 274 "base/keygen_handler_nss.cc",
307 } 275 "cert/cert_database_nss.cc",
308 276 "cert/nss_cert_database.cc",
309 if (use_glib && !is_chromeos) { 277 "cert/nss_cert_database.h",
310 configs += [ "//build/config/linux:gconf" ] 278 "cert/x509_certificate_nss.cc",
311 deps += [ "//build/linux:gio" ] 279 "ssl/client_cert_store_nss.cc",
312 } 280 "ssl/client_cert_store_nss.h",
313 281 "third_party/mozilla_security_manager/nsKeygenHandler.cpp",
314 if (is_linux) { 282 "third_party/mozilla_security_manager/nsKeygenHandler.h",
315 configs += [ "//build/config/linux:libresolv" ] 283 "third_party/mozilla_security_manager/nsNSSCertificateDB.cpp",
316 } 284 "third_party/mozilla_security_manager/nsNSSCertificateDB.h",
317 285 "third_party/mozilla_security_manager/nsPKCS12Blob.cpp",
318 if (!use_nss_certs) { 286 "third_party/mozilla_security_manager/nsPKCS12Blob.h",
319 sources -= [ 287 ]
320 "base/crypto_module_nss.cc", 288 if (!is_ios) {
321 "base/keygen_handler_nss.cc", 289 # These files are part of the partial implementation of NSS on iOS so
322 "cert/cert_database_nss.cc", 290 # keep them in that case (even though use_nss_certs is not set).
323 "cert/nss_cert_database.cc", 291 net_shared_sources -= [
324 "cert/nss_cert_database.h", 292 "cert/cert_verify_proc_nss.cc",
325 "cert/x509_certificate_nss.cc", 293 "cert/cert_verify_proc_nss.h",
326 "ssl/client_cert_store_nss.cc", 294 "cert/test_root_certs_nss.cc",
327 "ssl/client_cert_store_nss.h", 295 "cert/x509_util_nss_certs.cc",
328 "third_party/mozilla_security_manager/nsKeygenHandler.cpp", 296 "cert_net/nss_ocsp.cc",
329 "third_party/mozilla_security_manager/nsKeygenHandler.h", 297 "cert_net/nss_ocsp.h",
330 "third_party/mozilla_security_manager/nsNSSCertificateDB.cpp", 298 ]
331 "third_party/mozilla_security_manager/nsNSSCertificateDB.h", 299 }
332 "third_party/mozilla_security_manager/nsPKCS12Blob.cpp", 300 if (is_chromeos) {
333 "third_party/mozilla_security_manager/nsPKCS12Blob.h", 301 # These were already removed on non-ChromeOS.
334 ] 302 net_shared_sources -= [
335 if (!is_ios) { 303 "cert/nss_cert_database_chromeos.cc",
336 # These files are part of the partial implementation of NSS on iOS so 304 "cert/nss_cert_database_chromeos.h",
337 # keep them in that case (even though use_nss_certs is not set). 305 "cert/nss_profile_filter_chromeos.cc",
338 sources -= [ 306 "cert/nss_profile_filter_chromeos.h",
339 "cert/cert_verify_proc_nss.cc", 307 ]
340 "cert/cert_verify_proc_nss.h", 308 }
341 "cert/test_root_certs_nss.cc", 309 net_shared_sources -= [
342 "cert/x509_util_nss_certs.cc", 310 "ssl/client_key_store.cc",
343 "cert_net/nss_ocsp.cc", 311 "ssl/client_key_store.h",
344 "cert_net/nss_ocsp.h", 312 "ssl/ssl_platform_key_nss.cc",
345 ] 313 ]
346 } 314 } else if (use_openssl) {
347 if (is_chromeos) { 315 # client_cert_store_nss.c requires NSS_CmpCertChainWCANames from NSS's
348 # These were already removed on non-ChromeOS. 316 # libssl, but our bundled copy is not built in OpenSSL ports. Pull that file
349 sources -= [ 317 # in directly.
350 "cert/nss_cert_database_chromeos.cc", 318 net_shared_sources += [ "third_party/nss/ssl/cmpcert.c" ]
351 "cert/nss_cert_database_chromeos.h", 319 }
352 "cert/nss_profile_filter_chromeos.cc", 320
353 "cert/nss_profile_filter_chromeos.h", 321 if (!enable_mdns) {
354 ] 322 net_shared_sources -= [
355 } 323 "dns/mdns_cache.cc",
356 sources -= [ 324 "dns/mdns_cache.h",
357 "ssl/client_key_store.cc", 325 "dns/mdns_client.cc",
358 "ssl/client_key_store.h", 326 "dns/mdns_client.h",
359 "ssl/ssl_platform_key_nss.cc", 327 "dns/mdns_client_impl.cc",
360 ] 328 "dns/mdns_client_impl.h",
361 } else if (use_openssl) { 329 "dns/record_parsed.cc",
362 # client_cert_store_nss.c requires NSS_CmpCertChainWCANames from NSS's 330 "dns/record_parsed.h",
363 # libssl, but our bundled copy is not built in OpenSSL ports. Pull that file 331 "dns/record_rdata.cc",
364 # in directly. 332 "dns/record_rdata.h",
365 sources += [ "third_party/nss/ssl/cmpcert.c" ] 333 ]
366 } 334 }
367 335
368 if (!enable_websockets) { 336 if (is_win) {
369 sources -= [ 337 net_shared_sources -= [
370 "websockets/websocket_basic_handshake_stream.cc", 338 "http/http_auth_handler_ntlm_portable.cc",
371 "websockets/websocket_basic_handshake_stream.h", 339 "socket/socket_libevent.cc",
372 "websockets/websocket_basic_stream.cc", 340 "socket/socket_libevent.h",
373 "websockets/websocket_basic_stream.h", 341 "socket/tcp_socket_libevent.cc",
374 "websockets/websocket_channel.cc", 342 "socket/tcp_socket_libevent.h",
375 "websockets/websocket_channel.h", 343 "udp/udp_socket_libevent.cc",
376 "websockets/websocket_deflate_predictor.h", 344 "udp/udp_socket_libevent.h",
377 "websockets/websocket_deflate_predictor_impl.cc", 345 ]
378 "websockets/websocket_deflate_predictor_impl.h", 346 } else { # !is_win
379 "websockets/websocket_deflate_stream.cc", 347 net_shared_sources -= [
380 "websockets/websocket_deflate_stream.h", 348 "base/winsock_init.cc",
381 "websockets/websocket_deflater.cc", 349 "base/winsock_init.h",
382 "websockets/websocket_deflater.h", 350 "base/winsock_util.cc",
383 "websockets/websocket_errors.cc", 351 "base/winsock_util.h",
384 "websockets/websocket_errors.h", 352 "proxy/proxy_resolver_winhttp.cc",
385 "websockets/websocket_extension.cc", 353 "proxy/proxy_resolver_winhttp.h",
386 "websockets/websocket_extension.h", 354 ]
387 "websockets/websocket_extension_parser.cc", 355 }
388 "websockets/websocket_extension_parser.h", 356
389 "websockets/websocket_frame.cc", 357 if (is_ios) {
390 "websockets/websocket_frame.h", 358 # Add back some sources that were otherwise filtered out. iOS needs some Mac
391 "websockets/websocket_frame_parser.cc", 359 # files.
392 "websockets/websocket_frame_parser.h", 360 net_shared_unfiltered_sources += [
393 "websockets/websocket_handshake_challenge.cc", 361 "base/mac/url_conversions.h",
394 "websockets/websocket_handshake_challenge.h", 362 "base/mac/url_conversions.mm",
395 "websockets/websocket_handshake_constants.cc", 363 "base/network_change_notifier_mac.cc",
396 "websockets/websocket_handshake_constants.h", 364 "base/network_config_watcher_mac.cc",
397 "websockets/websocket_handshake_request_info.cc", 365 "base/network_interfaces_mac.cc",
398 "websockets/websocket_handshake_request_info.h", 366 "base/network_interfaces_mac.h",
399 "websockets/websocket_handshake_response_info.cc", 367 "base/platform_mime_util_mac.mm",
400 "websockets/websocket_handshake_response_info.h", 368 "proxy/proxy_resolver_mac.cc",
401 "websockets/websocket_handshake_stream_base.h", 369 "proxy/proxy_server_mac.cc",
402 "websockets/websocket_handshake_stream_create_helper.cc", 370 ]
403 "websockets/websocket_handshake_stream_create_helper.h", 371
404 "websockets/websocket_inflater.cc", 372 net_shared_sources -= [ "disk_cache/blockfile/file_posix.cc" ]
405 "websockets/websocket_inflater.h", 373 net_shared_deps += [
406 "websockets/websocket_mux.h", 374 "//third_party/nss:nspr",
407 "websockets/websocket_stream.cc", 375 "//third_party/nss",
408 "websockets/websocket_stream.h", 376 "//net/third_party/nss/ssl:libssl",
409 ] 377 ]
410 } 378 }
411 379
412 if (!enable_mdns) { 380 if (is_ios || is_mac) {
413 sources -= [ 381 net_shared_sources += gypi_values.net_base_mac_ios_sources
414 "dns/mdns_cache.cc", 382 }
415 "dns/mdns_cache.h", 383
416 "dns/mdns_client.cc", 384 if (is_android) {
417 "dns/mdns_client.h", 385 net_shared_deps += [ ":net_jni_headers" ]
418 "dns/mdns_client_impl.cc", 386
419 "dns/mdns_client_impl.h", 387 # Add some Linux sources that were excluded by the filter, but which
420 "dns/record_parsed.cc", 388 # are needed.
421 "dns/record_parsed.h", 389 net_shared_unfiltered_sources += [
422 "dns/record_rdata.cc", 390 "base/address_tracker_linux.cc",
423 "dns/record_rdata.h", 391 "base/address_tracker_linux.h",
424 ] 392 "base/network_interfaces_linux.cc",
425 } 393 "base/network_interfaces_linux.h",
426 394 "base/platform_mime_util_linux.cc",
427 if (is_win) { 395 ]
428 sources -= [ 396 }
429 "http/http_auth_handler_ntlm_portable.cc", 397
430 "socket/socket_libevent.cc", 398 component("net") {
431 "socket/socket_libevent.h", 399 sources = net_shared_sources
432 "socket/tcp_socket_libevent.cc", 400
433 "socket/tcp_socket_libevent.h", 401 # Add back some sources that were otherwise filtered out.
434 "udp/udp_socket_libevent.cc", 402 set_sources_assignment_filter([])
435 "udp/udp_socket_libevent.h", 403 sources += net_shared_unfiltered_sources
436 ] 404 set_sources_assignment_filter(sources_assignment_filter)
437 } else { # !is_win 405
438 sources -= [ 406 cflags = []
439 "base/winsock_init.cc", 407 configs += net_shared_configs
440 "base/winsock_init.h", 408 public_configs = [ ":net_config" ]
441 "base/winsock_util.cc", 409
442 "base/winsock_util.h", 410 public_deps = net_shared_public_deps + [ "//url" ]
443 "proxy/proxy_resolver_winhttp.cc", 411 deps = net_shared_deps
444 "proxy/proxy_resolver_winhttp.h",
445 ]
446 }
447 412
448 if (is_mac) { 413 if (is_mac) {
449 libs = [ 414 libs = [
450 "Foundation.framework", 415 "Foundation.framework",
451 "Security.framework", 416 "Security.framework",
452 "SystemConfiguration.framework", 417 "SystemConfiguration.framework",
453 "resolv", 418 "resolv",
454 ] 419 ]
455 } 420 }
456 421
457 if (is_ios) { 422 if (is_ios) {
458 # Add back some sources that were otherwise filtered out. iOS needs some Mac
459 # files.
460 set_sources_assignment_filter([])
461 sources += [
462 "base/mac/url_conversions.h",
463 "base/mac/url_conversions.mm",
464 "base/network_change_notifier_mac.cc",
465 "base/network_config_watcher_mac.cc",
466 "base/network_interfaces_mac.cc",
467 "base/network_interfaces_mac.h",
468 "base/platform_mime_util_mac.mm",
469 "proxy/proxy_resolver_mac.cc",
470 "proxy/proxy_server_mac.cc",
471 ]
472 set_sources_assignment_filter(sources_assignment_filter)
473
474 sources -= [ "disk_cache/blockfile/file_posix.cc" ]
475 libs = [ 423 libs = [
476 "CFNetwork.framework", 424 "CFNetwork.framework",
477 "MobileCoreServices.framework", 425 "MobileCoreServices.framework",
478 "Security.framework", 426 "Security.framework",
479 "SystemConfiguration.framework", 427 "SystemConfiguration.framework",
480 "resolv", 428 "resolv",
481 ] 429 ]
482
483 deps += [
484 "//third_party/nss:nspr",
485 "//third_party/nss",
486 "//net/third_party/nss/ssl:libssl",
487 ]
488 } 430 }
489 431
490 if (is_ios || is_mac) { 432 if (!disable_file_support) {
491 sources += gypi_values.net_base_mac_ios_sources 433 sources += gypi_values.net_file_support_sources
492 } 434 }
493 435
494 if (is_android) { 436 if (!disable_ftp_support) {
495 # Add some Linux sources that were excluded by the filter, but which 437 sources += gypi_values.net_ftp_support_sources
496 # are needed.
497 set_sources_assignment_filter([])
498 sources += [
499 "base/address_tracker_linux.cc",
500 "base/address_tracker_linux.h",
501 "base/network_interfaces_linux.cc",
502 "base/network_interfaces_linux.h",
503 "base/platform_mime_util_linux.cc",
504 ]
505 set_sources_assignment_filter(sources_assignment_filter)
506 deps += [ ":net_jni_headers" ]
507 } 438 }
508 439
509 if (use_icu_alternatives_on_android) { 440 if (enable_websockets) {
441 sources += gypi_values.net_websockets_sources
442 }
443
444 # ICU support.
445 deps += [
446 "//base:i18n",
447 "//third_party/icu",
448 ]
449 sources += [
450 "base/filename_util_icu.cc",
451 "base/net_string_util_icu.cc",
452 "base/net_util_icu.cc",
453 ]
454 }
455
456 if (is_android) {
457 # Same as net, but with ICU, file, ftp, and websocket support stripped.
458 component("net_small") {
459 sources = net_shared_sources
460
461 # Add back some sources that were otherwise filtered out.
462 set_sources_assignment_filter([])
463 sources += net_shared_unfiltered_sources
464 set_sources_assignment_filter(sources_assignment_filter)
465
466 cflags = []
467 defines = []
468 configs += net_shared_configs
469 public_configs = [ ":net_config" ]
470
471 public_deps = net_shared_public_deps +
472 [ "//url:url_lib_use_icu_alternatives_on_android" ]
473 deps = net_shared_deps + [ ":net_jni_headers" ]
474
475 defines += [
476 "DISABLE_FILE_SUPPORT",
477 "DISABLE_FTP_SUPPORT",
478 "USE_ICU_ALTERNATIVES_ON_ANDROID=1",
479 ]
480
481 # Use ICU alternative on Android.
510 sources += [ 482 sources += [
511 "base/net_string_util_icu_alternatives_android.cc", 483 "base/net_string_util_icu_alternatives_android.cc",
512 "base/net_string_util_icu_alternatives_android.h", 484 "base/net_string_util_icu_alternatives_android.h",
513 ] 485 ]
514 } else {
515 deps += [
516 "//base:i18n",
517 "//third_party/icu",
518 ]
519 sources += [
520 "base/filename_util_icu.cc",
521 "base/net_string_util_icu.cc",
522 "base/net_util_icu.cc",
523 ]
524 } 486 }
525 } 487 }
526 488
527 grit("net_resources") { 489 grit("net_resources") {
528 source = "base/net_resources.grd" 490 source = "base/net_resources.grd"
529 use_qualified_include = true 491 use_qualified_include = true
530 outputs = [ 492 outputs = [
531 "grit/net_resources.h", 493 "grit/net_resources.h",
532 "net_resources.pak", 494 "net_resources.pak",
533 ] 495 ]
534 } 496 }
535 497
536 proto_library("net_quic_proto") { 498 proto_library("net_quic_proto") {
537 visibility = [ "//net" ] # Part of the net component. 499 visibility = [
500 ":net",
501 ":net_small",
502 ]
538 503
539 sources = [ 504 sources = [
540 "quic/proto/cached_network_parameters.proto", 505 "quic/proto/cached_network_parameters.proto",
541 "quic/proto/source_address_token.proto", 506 "quic/proto/source_address_token.proto",
542 ] 507 ]
543 cc_generator_options = "dllexport_decl=NET_EXPORT_PRIVATE:" 508 cc_generator_options = "dllexport_decl=NET_EXPORT_PRIVATE:"
544 cc_include = "net/base/net_export.h" 509 cc_include = "net/base/net_export.h"
545 510
546 defines = [ "NET_IMPLEMENTATION" ] 511 defines = [ "NET_IMPLEMENTATION" ]
547 512
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 sources = [ 969 sources = [
1005 "tools/net_watcher/net_watcher.cc", 970 "tools/net_watcher/net_watcher.cc",
1006 ] 971 ]
1007 deps = [ 972 deps = [
1008 ":net", 973 ":net",
1009 ":net_with_v8", 974 ":net_with_v8",
1010 "//base", 975 "//base",
1011 ] 976 ]
1012 977
1013 if (is_desktop_linux) { 978 if (is_desktop_linux) {
979 configs += [
980 "//build/config/linux:gconf",
981 "//build/config/linux:glib",
982 ]
1014 deps += [ "//build/linux:gio" ] 983 deps += [ "//build/linux:gio" ]
1015 } 984 }
1016
1017 if (use_gconf) {
1018 configs += [ "//build/config/linux:gconf" ]
1019 }
1020
1021 if (use_glib) {
1022 configs += [ "//build/config/linux:glib" ]
1023 }
1024 } 985 }
1025 } 986 }
1026 987
1027 executable("run_testserver") { 988 executable("run_testserver") {
1028 testonly = true 989 testonly = true
1029 sources = [ 990 sources = [
1030 "tools/testserver/run_testserver.cc", 991 "tools/testserver/run_testserver.cc",
1031 ] 992 ]
1032 deps = [ 993 deps = [
1033 ":test_support", 994 ":test_support",
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1223 1184
1224 if (is_android) { 1185 if (is_android) {
1225 generate_jni("net_jni_headers") { 1186 generate_jni("net_jni_headers") {
1226 sources = [ 1187 sources = [
1227 "android/java/src/org/chromium/net/AndroidCertVerifyResult.java", 1188 "android/java/src/org/chromium/net/AndroidCertVerifyResult.java",
1228 "android/java/src/org/chromium/net/AndroidKeyStore.java", 1189 "android/java/src/org/chromium/net/AndroidKeyStore.java",
1229 "android/java/src/org/chromium/net/AndroidNetworkLibrary.java", 1190 "android/java/src/org/chromium/net/AndroidNetworkLibrary.java",
1230 "android/java/src/org/chromium/net/AndroidPrivateKey.java", 1191 "android/java/src/org/chromium/net/AndroidPrivateKey.java",
1231 "android/java/src/org/chromium/net/GURLUtils.java", 1192 "android/java/src/org/chromium/net/GURLUtils.java",
1232 "android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java", 1193 "android/java/src/org/chromium/net/HttpNegotiateAuthenticator.java",
1194 "android/java/src/org/chromium/net/NetStringUtil.java",
1233 "android/java/src/org/chromium/net/NetworkChangeNotifier.java", 1195 "android/java/src/org/chromium/net/NetworkChangeNotifier.java",
1234 "android/java/src/org/chromium/net/ProxyChangeListener.java", 1196 "android/java/src/org/chromium/net/ProxyChangeListener.java",
1235 "android/java/src/org/chromium/net/X509Util.java", 1197 "android/java/src/org/chromium/net/X509Util.java",
1236 ] 1198 ]
1237 jni_package = "net" 1199 jni_package = "net"
1238 } 1200 }
1239 generate_jni("net_test_jni_headers") { 1201 generate_jni("net_test_jni_headers") {
1240 sources = [ 1202 sources = [
1241 "android/javatests/src/org/chromium/net/AndroidKeyStoreTestUtil.java", 1203 "android/javatests/src/org/chromium/net/AndroidKeyStoreTestUtil.java",
1242 "test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticator .java", 1204 "test/android/javatests/src/org/chromium/net/test/DummySpnegoAuthenticator .java",
(...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after
1359 ":simple_quic_tools", 1321 ":simple_quic_tools",
1360 ":test_support", 1322 ":test_support",
1361 "//base", 1323 "//base",
1362 "//base:i18n", 1324 "//base:i18n",
1363 "//base:prefs_test_support", 1325 "//base:prefs_test_support",
1364 "//base/allocator", 1326 "//base/allocator",
1365 "//base/third_party/dynamic_annotations", 1327 "//base/third_party/dynamic_annotations",
1366 "//crypto", 1328 "//crypto",
1367 "//crypto:platform", 1329 "//crypto:platform",
1368 "//crypto:test_support", 1330 "//crypto:test_support",
1331 "//gin",
1369 "//net/base/registry_controlled_domains", 1332 "//net/base/registry_controlled_domains",
1370 "//sql", 1333 "//sql",
1371 "//testing/gmock", 1334 "//testing/gmock",
1372 "//testing/gtest", 1335 "//testing/gtest",
1373 "//third_party/zlib", 1336 "//third_party/zlib",
1374 "//url", 1337 "//url",
1375 ] 1338 ]
1376 1339
1377 if (!is_ios) {
1378 deps += [ "//gin" ]
1379 }
1380 data = [ 1340 data = [
1381 "data/", 1341 "data/",
1382 ] 1342 ]
1383 1343
1384 if (is_linux || is_mac || is_win) { 1344 if (is_linux || is_mac || is_win) {
1385 deps += [ 1345 deps += [
1386 "//third_party/pyftpdlib/", 1346 "//third_party/pyftpdlib/",
1387 "//third_party/pywebsocket/", 1347 "//third_party/pywebsocket/",
1388 "//third_party/tlslite/", 1348 "//third_party/tlslite/",
1389 ] 1349 ]
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
1511 "base/directory_lister_unittest.cc", 1471 "base/directory_lister_unittest.cc",
1512 "url_request/url_request_file_job_unittest.cc", 1472 "url_request/url_request_file_job_unittest.cc",
1513 ] 1473 ]
1514 } 1474 }
1515 1475
1516 if (disable_ftp_support) { 1476 if (disable_ftp_support) {
1517 sources -= [ 1477 sources -= [
1518 "ftp/ftp_auth_cache_unittest.cc", 1478 "ftp/ftp_auth_cache_unittest.cc",
1519 "ftp/ftp_ctrl_response_buffer_unittest.cc", 1479 "ftp/ftp_ctrl_response_buffer_unittest.cc",
1520 "ftp/ftp_directory_listing_parser_ls_unittest.cc", 1480 "ftp/ftp_directory_listing_parser_ls_unittest.cc",
1521 "ftp/ftp_directory_listing_parser_netware_unittest.cc",
1522 "ftp/ftp_directory_listing_parser_os2_unittest.cc",
1523 "ftp/ftp_directory_listing_parser_unittest.cc", 1481 "ftp/ftp_directory_listing_parser_unittest.cc",
1524 "ftp/ftp_directory_listing_parser_unittest.h", 1482 "ftp/ftp_directory_listing_parser_unittest.h",
1525 "ftp/ftp_directory_listing_parser_vms_unittest.cc", 1483 "ftp/ftp_directory_listing_parser_vms_unittest.cc",
1526 "ftp/ftp_directory_listing_parser_windows_unittest.cc", 1484 "ftp/ftp_directory_listing_parser_windows_unittest.cc",
1527 "ftp/ftp_network_transaction_unittest.cc", 1485 "ftp/ftp_network_transaction_unittest.cc",
1528 "ftp/ftp_util_unittest.cc", 1486 "ftp/ftp_util_unittest.cc",
1529 "url_request/url_request_ftp_job_unittest.cc", 1487 "url_request/url_request_ftp_job_unittest.cc",
1530 ] 1488 ]
1531 } 1489 }
1532 1490
1533 if (!enable_built_in_dns) { 1491 if (!enable_built_in_dns) {
1534 sources -= [ 1492 sources -= [
1535 "dns/address_sorter_posix_unittest.cc", 1493 "dns/address_sorter_posix_unittest.cc",
1536 "dns/address_sorter_unittest.cc", 1494 "dns/address_sorter_unittest.cc",
1537 ] 1495 ]
1538 } 1496 }
1539 1497
1540 # Always need use_v8_in_net to be 1 to run on Android, so just remove 1498 if (use_v8_in_net) {
1541 # net_unittest's dependency on v8 when using icu alternatives instead of
1542 # setting use_v8_in_net to 0.
1543 if (use_v8_in_net && !use_icu_alternatives_on_android) {
1544 deps += [ ":net_with_v8" ] 1499 deps += [ ":net_with_v8" ]
1545 } else { 1500 } else {
1546 sources -= [ 1501 sources -= [
1547 "proxy/proxy_resolver_v8_tracing_unittest.cc", 1502 "proxy/proxy_resolver_v8_tracing_unittest.cc",
1548 "proxy/proxy_resolver_v8_tracing_wrapper_unittest.cc", 1503 "proxy/proxy_resolver_v8_tracing_wrapper_unittest.cc",
1549 "proxy/proxy_resolver_v8_unittest.cc", 1504 "proxy/proxy_resolver_v8_unittest.cc",
1550 ] 1505 ]
1551 } 1506 }
1552 1507
1553 if (use_v8_in_net && !is_android) { 1508 if (use_v8_in_net && !is_android) {
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after
1642 # TODO(mmenke): This depends on test_support_base, which depends on 1597 # TODO(mmenke): This depends on test_support_base, which depends on
1643 # icu. Figure out a way to remove that dependency. 1598 # icu. Figure out a way to remove that dependency.
1644 "//testing/android/native_test:native_test_native_code", 1599 "//testing/android/native_test:native_test_native_code",
1645 ] 1600 ]
1646 set_sources_assignment_filter([]) 1601 set_sources_assignment_filter([])
1647 sources += [ "base/address_tracker_linux_unittest.cc" ] 1602 sources += [ "base/address_tracker_linux_unittest.cc" ]
1648 set_sources_assignment_filter(sources_assignment_filter) 1603 set_sources_assignment_filter(sources_assignment_filter)
1649 isolate_file = "net_unittests.isolate" 1604 isolate_file = "net_unittests.isolate"
1650 } 1605 }
1651 1606
1652 if (use_icu_alternatives_on_android) {
1653 sources -= [
1654 "base/filename_util_unittest.cc",
1655 "base/net_util_icu_unittest.cc",
1656 ]
1657 deps -= [ "//base:i18n" ]
1658 }
1659
1660 # Symbols for crashes when running tests on swarming. 1607 # Symbols for crashes when running tests on swarming.
1661 if (symbol_level > 0) { 1608 if (symbol_level > 0) {
1662 if (is_win) { 1609 if (is_win) {
1663 data += [ "$root_out_dir/net_unittests.exe.pdb" ] 1610 data += [ "$root_out_dir/net_unittests.exe.pdb" ]
1664 } else if (is_mac) { 1611 } else if (is_mac) {
1665 data += [ "$root_out_dir/net_unittests.dSYM/" ] 1612 data += [ "$root_out_dir/net_unittests.dSYM/" ]
1666 } 1613 }
1667 } 1614 }
1668 } 1615 }
1669 1616
(...skipping 26 matching lines...) Expand all
1696 if (enable_websockets) { 1643 if (enable_websockets) {
1697 sources += [ "websockets/websocket_frame_perftest.cc" ] 1644 sources += [ "websockets/websocket_frame_perftest.cc" ]
1698 } 1645 }
1699 1646
1700 if (use_v8_in_net) { 1647 if (use_v8_in_net) {
1701 deps += [ ":net_with_v8" ] 1648 deps += [ ":net_with_v8" ]
1702 } else { 1649 } else {
1703 sources -= [ "proxy/proxy_resolver_perftest.cc" ] 1650 sources -= [ "proxy/proxy_resolver_perftest.cc" ]
1704 } 1651 }
1705 } 1652 }
OLDNEW
« no previous file with comments | « no previous file | net/net.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698