Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "content/browser/transition_request_manager.h" | 5 #include "content/browser/transition_request_manager.h" |
| 6 | 6 |
| 7 #include "base/memory/singleton.h" | 7 #include "base/memory/singleton.h" |
| 8 #include "base/strings/string_util.h" | |
| 8 #include "content/public/browser/browser_thread.h" | 9 #include "content/public/browser/browser_thread.h" |
| 10 #include "net/http/http_response_headers.h" | |
| 11 #include "net/http/http_util.h" | |
| 9 | 12 |
| 10 namespace content { | 13 namespace content { |
| 11 | 14 |
| 15 TransitionLayerData::TransitionLayerData() { } | |
| 16 | |
| 17 TransitionLayerData::~TransitionLayerData() { } | |
| 18 | |
| 19 // Enumerate all Link: headers with the specified relation in this | |
| 20 // response, and optionally returns the URL and any additional attributes of | |
| 21 // each one. See EnumerateHeaders for |iter| usage. | |
| 22 bool EnumerateLinkHeaders( | |
|
jochen (gone - plz use gerrit)
2014/07/16 13:25:59
should be in an anon namespace
Zhen Wang
2014/07/18 00:56:35
Done.
| |
| 23 scoped_refptr<net::HttpResponseHeaders> headers, | |
| 24 void** iter, | |
| 25 const std::string& rel, | |
| 26 std::string* url, | |
| 27 std::vector<std::pair<std::string, std::string> >* attributes) { | |
| 28 std::string header_body; | |
| 29 bool rel_matched = false; | |
| 30 while (headers->EnumerateHeader( | |
| 31 iter, "link", &header_body) && !rel_matched) { | |
| 32 const std::string::const_iterator begin = header_body.begin(); | |
| 33 size_t url_start = header_body.find_first_of('<'); | |
| 34 size_t url_end = header_body.find_first_of('>'); | |
| 35 if (url_start == std::string::npos || url_end == std::string::npos || | |
| 36 url_start > url_end) { | |
| 37 break; | |
| 38 } | |
| 39 | |
| 40 if (attributes) { | |
|
jochen (gone - plz use gerrit)
2014/07/16 13:25:58
nit. no { } for single line bodies
Zhen Wang
2014/07/18 00:56:35
Done.
| |
| 41 attributes->clear(); | |
| 42 } | |
| 43 | |
| 44 net::HttpUtil::NameValuePairsIterator param_iter(begin + url_end + 1, | |
| 45 header_body.end(), ';'); | |
| 46 | |
| 47 while (param_iter.GetNext()) { | |
| 48 if (LowerCaseEqualsASCII(param_iter.name_begin(), | |
| 49 param_iter.name_end(), | |
| 50 "rel")) { | |
| 51 if (LowerCaseEqualsASCII(param_iter.value_begin(), | |
| 52 param_iter.value_end(), | |
| 53 rel.c_str())) { | |
| 54 if (url) { | |
| 55 url->assign(begin + url_start + 1, begin + url_end); | |
| 56 } | |
| 57 rel_matched = true; | |
| 58 } else { | |
| 59 break; | |
| 60 } | |
| 61 } else if (attributes) { | |
| 62 std::string attribute_name(param_iter.name_begin(), | |
| 63 param_iter.name_end()); | |
| 64 std::string attribute_value(param_iter.value_begin(), | |
| 65 param_iter.value_end()); | |
| 66 attributes->push_back(std::make_pair(attribute_name, | |
| 67 attribute_value)); | |
| 68 } | |
| 69 } | |
| 70 } | |
| 71 | |
| 72 if (!rel_matched && attributes) { | |
| 73 attributes->clear(); | |
| 74 } | |
| 75 | |
| 76 return rel_matched; | |
| 77 } | |
| 78 | |
| 79 void TransitionRequestManager::ParseTransitionStylesheetsFromHeaders( | |
| 80 scoped_refptr<net::HttpResponseHeaders> headers, | |
| 81 TransitionLayerData& transition_layer_data, | |
| 82 const GURL& resolve_address) { | |
| 83 std::string transition_stylesheet; | |
| 84 std::vector<std::pair<std::string, std::string> > attributes; | |
| 85 void* header_iter = NULL; | |
| 86 while (EnumerateLinkHeaders( | |
| 87 headers, | |
| 88 &header_iter, | |
| 89 "transition-entering-stylesheet", | |
| 90 &transition_stylesheet, | |
| 91 &attributes)) { | |
| 92 transition_layer_data.transition_stylesheets.push_back( | |
| 93 resolve_address.Resolve(transition_stylesheet)); | |
| 94 } | |
| 95 } | |
|
jochen (gone - plz use gerrit)
2014/07/16 13:25:58
is this file clang formatted?
Zhen Wang
2014/07/18 00:56:34
Done.
| |
| 96 | |
| 12 bool TransitionRequestManager::HasPendingTransitionRequest( | 97 bool TransitionRequestManager::HasPendingTransitionRequest( |
| 13 int process_id, | 98 int process_id, |
| 14 int render_frame_id) { | 99 int render_frame_id) { |
| 15 DCHECK_CURRENTLY_ON(BrowserThread::IO); | 100 DCHECK_CURRENTLY_ON(BrowserThread::IO); |
| 16 | 101 |
| 17 std::pair<int, int> key(process_id, render_frame_id); | 102 std::pair<int, int> key(process_id, render_frame_id); |
| 18 return (pending_transition_frames_.find(key) != | 103 return (pending_transition_frames_.find(key) != |
| 19 pending_transition_frames_.end()); | 104 pending_transition_frames_.end()); |
| 20 } | 105 } |
| 21 | 106 |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 38 | 123 |
| 39 TransitionRequestManager::~TransitionRequestManager() { | 124 TransitionRequestManager::~TransitionRequestManager() { |
| 40 } | 125 } |
| 41 | 126 |
| 42 // static | 127 // static |
| 43 TransitionRequestManager* TransitionRequestManager::GetInstance() { | 128 TransitionRequestManager* TransitionRequestManager::GetInstance() { |
| 44 return Singleton<TransitionRequestManager>::get(); | 129 return Singleton<TransitionRequestManager>::get(); |
| 45 } | 130 } |
| 46 | 131 |
| 47 } // namespace content | 132 } // namespace content |
| OLD | NEW |