OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/browser/webui/url_data_manager_backend.h" | 5 #include "content/browser/webui/url_data_manager_backend.h" |
6 | 6 |
| 7 #include <algorithm> |
7 #include <set> | 8 #include <set> |
8 | 9 |
9 #include "base/bind.h" | 10 #include "base/bind.h" |
10 #include "base/command_line.h" | 11 #include "base/command_line.h" |
11 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
12 #include "base/debug/alias.h" | 13 #include "base/debug/alias.h" |
13 #include "base/lazy_instance.h" | 14 #include "base/lazy_instance.h" |
14 #include "base/location.h" | 15 #include "base/location.h" |
15 #include "base/macros.h" | 16 #include "base/macros.h" |
16 #include "base/memory/ptr_util.h" | 17 #include "base/memory/ptr_util.h" |
(...skipping 23 matching lines...) Expand all Loading... |
40 #include "net/base/net_errors.h" | 41 #include "net/base/net_errors.h" |
41 #include "net/filter/filter.h" | 42 #include "net/filter/filter.h" |
42 #include "net/http/http_response_headers.h" | 43 #include "net/http/http_response_headers.h" |
43 #include "net/http/http_status_code.h" | 44 #include "net/http/http_status_code.h" |
44 #include "net/log/net_log_util.h" | 45 #include "net/log/net_log_util.h" |
45 #include "net/url_request/url_request.h" | 46 #include "net/url_request/url_request.h" |
46 #include "net/url_request/url_request_context.h" | 47 #include "net/url_request/url_request_context.h" |
47 #include "net/url_request/url_request_error_job.h" | 48 #include "net/url_request/url_request_error_job.h" |
48 #include "net/url_request/url_request_job.h" | 49 #include "net/url_request/url_request_job.h" |
49 #include "net/url_request/url_request_job_factory.h" | 50 #include "net/url_request/url_request_job_factory.h" |
| 51 #include "ui/base/template_expressions.h" |
50 #include "url/url_util.h" | 52 #include "url/url_util.h" |
51 | 53 |
52 namespace content { | 54 namespace content { |
53 | 55 |
54 namespace { | 56 namespace { |
55 | 57 |
56 const char kChromeURLContentSecurityPolicyHeaderBase[] = | 58 const char kChromeURLContentSecurityPolicyHeaderBase[] = |
57 "Content-Security-Policy: "; | 59 "Content-Security-Policy: "; |
58 | 60 |
59 const char kChromeURLXFrameOptionsHeader[] = "X-Frame-Options: DENY"; | 61 const char kChromeURLXFrameOptionsHeader[] = "X-Frame-Options: DENY"; |
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
363 if (!access_control_allow_origin_.empty()) { | 365 if (!access_control_allow_origin_.empty()) { |
364 info->headers->AddHeader("Access-Control-Allow-Origin: " + | 366 info->headers->AddHeader("Access-Control-Allow-Origin: " + |
365 access_control_allow_origin_); | 367 access_control_allow_origin_); |
366 info->headers->AddHeader("Vary: Origin"); | 368 info->headers->AddHeader("Vary: Origin"); |
367 } | 369 } |
368 | 370 |
369 if (is_gzipped_) | 371 if (is_gzipped_) |
370 info->headers->AddHeader("Content-Encoding: gzip"); | 372 info->headers->AddHeader("Content-Encoding: gzip"); |
371 } | 373 } |
372 | 374 |
| 375 class I18nFilter : public net::Filter { |
| 376 public: |
| 377 I18nFilter(const ui::TemplateReplacements* replacements) |
| 378 : net::Filter(net::Filter::FILTER_TYPE_UNSUPPORTED), |
| 379 replacements_(replacements) { |
| 380 CHECK(replacements_); |
| 381 } |
| 382 |
| 383 net::Filter::FilterStatus ReadFilteredData(char* dest_buffer, int* dest_len) o
verride { |
| 384 if (!dest_buffer || !dest_len) |
| 385 return net::Filter::FILTER_ERROR; |
| 386 |
| 387 if (*dest_len <= 0) { |
| 388 *dest_len = 0; |
| 389 return net::Filter::FILTER_ERROR; |
| 390 } |
| 391 |
| 392 if (stream_data_len_) { |
| 393 decoded_.append(next_stream_data_, stream_data_len_); |
| 394 return net::Filter::FILTER_NEED_MORE_DATA; |
| 395 } |
| 396 |
| 397 if (!replaced_) { |
| 398 decoded_ = ui::ReplaceTemplateExpressions(base::StringPiece(decoded_), *re
placements_); |
| 399 replaced_ = true; |
| 400 } |
| 401 |
| 402 *dest_len = std::min(static_cast<int>(decoded_.size()), *dest_len); |
| 403 memcpy(dest_buffer, decoded_.data(), *dest_len); |
| 404 decoded_.erase(0, *dest_len); |
| 405 return decoded_.empty() ? net::Filter::FILTER_DONE : |
| 406 net::Filter::FILTER_OK; |
| 407 } |
| 408 |
| 409 private: |
| 410 const ui::TemplateReplacements* replacements_; // weak |
| 411 std::string decoded_; |
| 412 bool replaced_ = false; |
| 413 |
| 414 DISALLOW_COPY_AND_ASSIGN(I18nFilter); |
| 415 }; |
| 416 |
373 std::unique_ptr<net::Filter> URLRequestChromeJob::SetupFilter() const { | 417 std::unique_ptr<net::Filter> URLRequestChromeJob::SetupFilter() const { |
374 return is_gzipped_ ? net::Filter::GZipFactory() : nullptr; | 418 URLDataSourceImpl* data_source = |
| 419 backend_->GetDataSourceFromURL(request_->url()); |
| 420 |
| 421 const ui::TemplateReplacements* replacements = data_source ? |
| 422 data_source->GetTemplateReplacements() : nullptr; |
| 423 |
| 424 std::unique_ptr<net::Filter> i18n_filter; |
| 425 |
| 426 if (replacements) |
| 427 i18n_filter = base::MakeUnique<I18nFilter>(replacements); |
| 428 |
| 429 if (!is_gzipped_) |
| 430 return i18n_filter; |
| 431 |
| 432 std::unique_ptr<net::Filter> gzip_filter = net::Filter::GZipFactory(); |
| 433 |
| 434 if (i18n_filter) |
| 435 gzip_filter->TakeNextFilter(std::move(i18n_filter)); |
| 436 |
| 437 return gzip_filter; |
375 } | 438 } |
376 | 439 |
377 void URLRequestChromeJob::MimeTypeAvailable(const std::string& mime_type) { | 440 void URLRequestChromeJob::MimeTypeAvailable(const std::string& mime_type) { |
378 set_mime_type(mime_type); | 441 set_mime_type(mime_type); |
379 NotifyHeadersComplete(); | 442 NotifyHeadersComplete(); |
380 } | 443 } |
381 | 444 |
382 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) { | 445 void URLRequestChromeJob::DataAvailable(base::RefCountedMemory* bytes) { |
383 TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this); | 446 TRACE_EVENT_ASYNC_END0("browser", "DataManager:Request", this); |
384 if (bytes) { | 447 if (bytes) { |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 | 875 |
813 } // namespace | 876 } // namespace |
814 | 877 |
815 net::URLRequestJobFactory::ProtocolHandler* | 878 net::URLRequestJobFactory::ProtocolHandler* |
816 CreateDevToolsProtocolHandler(content::ResourceContext* resource_context, | 879 CreateDevToolsProtocolHandler(content::ResourceContext* resource_context, |
817 bool is_incognito) { | 880 bool is_incognito) { |
818 return new DevToolsJobFactory(resource_context, is_incognito); | 881 return new DevToolsJobFactory(resource_context, is_incognito); |
819 } | 882 } |
820 | 883 |
821 } // namespace content | 884 } // namespace content |
OLD | NEW |