Index: content/browser/transition_request_manager.h |
diff --git a/content/browser/transition_request_manager.h b/content/browser/transition_request_manager.h |
index 48be189ca50e0dfb7016dd909116bba22187f122..0a01878eb1a5f6d3f7a0e3bbacaf8ae3216bce3f 100644 |
--- a/content/browser/transition_request_manager.h |
+++ b/content/browser/transition_request_manager.h |
@@ -5,7 +5,8 @@ |
#ifndef CONTENT_BROWSER_TRANSITION_REQUEST_MANAGER_H_ |
#define CONTENT_BROWSER_TRANSITION_REQUEST_MANAGER_H_ |
-#include <set> |
+#include <map> |
+#include <string> |
#include <utility> |
#include <vector> |
@@ -20,9 +21,21 @@ struct DefaultSingletonTraits; |
namespace net { |
class HttpResponseHeaders; |
} |
+class GURL; |
namespace content { |
+// This struct passes data about an imminent transition between threads. |
+struct TransitionLayerData { |
+ TransitionLayerData(); |
+ ~TransitionLayerData(); |
+ |
+ std::string markup; |
+ std::string css_selector; |
+ scoped_refptr<net::HttpResponseHeaders> response_headers; |
+ GURL request_url; |
+}; |
+ |
// TransitionRequestManager is used to handle bookkeeping for transition |
// requests and responses. |
// |
@@ -42,28 +55,67 @@ class TransitionRequestManager { |
const GURL& resolve_address); |
// Returns whether the RenderFrameHost specified by the given IDs currently |
- // has a pending transition request. If so, we will have to delay the |
+ // has any pending transition request data. If so, we will have to delay the |
// response until the embedder resumes the request. |
- bool HasPendingTransitionRequest(int process_id, int render_frame_id); |
- |
- // Sets whether the RenderFrameHost specified by the given IDs currently has a |
- // pending transition request. |
- CONTENT_EXPORT void SetHasPendingTransitionRequest(int process_id, |
- int render_frame_id, |
- bool has_pending); |
+ bool HasPendingTransitionRequest(int render_process_id, |
+ int render_frame_id, |
+ const GURL& request_url, |
+ TransitionLayerData* transition_data); |
+ |
+ // Adds pending request data for a transition navigation for the |
+ // RenderFrameHost specified by the given IDs. |
+ CONTENT_EXPORT void AddPendingTransitionRequestData( |
+ int render_process_id, |
+ int render_frame_id, |
+ const std::string& allowed_destination_host_pattern, |
+ const std::string& css_selector, |
+ const std::string& markup); |
+ |
+ void ClearPendingTransitionRequestData(int render_process_id, |
+ int render_frame_id); |
private: |
+ class TransitionRequestData { |
+ public: |
+ TransitionRequestData(); |
+ ~TransitionRequestData(); |
+ void AddEntry(const std::string& allowed_destination_host_pattern, |
+ const std::string& selector, |
+ const std::string& markup); |
+ bool FindEntry(const GURL& request_url, |
+ TransitionLayerData* transition_data); |
+ |
+ private: |
+ struct AllowedEntry { |
+ // These strings could have originated from a compromised renderer, |
+ // and should not be trusted or assumed safe. They are only used within |
+ // a sandboxed iframe with scripts disabled. |
+ std::string allowed_destination_host_pattern; |
+ std::string css_selector; |
+ std::string markup; |
+ |
+ AllowedEntry(const std::string& allowed_destination_host_pattern, |
+ const std::string& css_selector, |
+ const std::string& markup) : |
+ allowed_destination_host_pattern(allowed_destination_host_pattern), |
+ css_selector(css_selector), |
+ markup(markup) {} |
+ }; |
+ std::vector<AllowedEntry> allowed_entries_; |
+ }; |
+ |
friend struct DefaultSingletonTraits<TransitionRequestManager>; |
- typedef std::set<std::pair<int, int> > RenderFrameSet; |
+ typedef std::map<std::pair<int, int>, TransitionRequestData> |
+ RenderFrameRequestDataMap; |
TransitionRequestManager(); |
~TransitionRequestManager(); |
- // Set of (render_process_host_id, render_frame_id) pairs of all |
- // RenderFrameHosts that have pending transition requests. Used to pass |
- // information to the CrossSiteResourceHandler without doing a round-trip |
- // between IO->UI->IO threads. |
- RenderFrameSet pending_transition_frames_; |
+ // Map of (render_process_host_id, render_frame_id) pairs of all |
+ // RenderFrameHosts that have pending cross-site requests and their data. |
+ // Used to pass information to the CrossSiteResourceHandler without doing a |
+ // round-trip between IO->UI->IO threads. |
+ RenderFrameRequestDataMap pending_transition_frames_; |
DISALLOW_COPY_AND_ASSIGN(TransitionRequestManager); |
}; |