1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CONTENT_BROWSER_TRANSITION_REQUEST_MANAGER_H_
#define CONTENT_BROWSER_TRANSITION_REQUEST_MANAGER_H_
#include <map>
#include <string>
#include <utility>
#include <vector>
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
#include "content/common/content_export.h"
#include "content/public/common/transition_element.h"
#include "ui/gfx/geometry/rect.h"
#include "url/gurl.h"
template <typename T>
struct DefaultSingletonTraits;
namespace net {
class HttpResponseHeaders;
}
class GURL;
namespace content {
// This struct passes data about an imminent transition between threads.
struct TransitionLayerData {
CONTENT_EXPORT TransitionLayerData();
CONTENT_EXPORT ~TransitionLayerData();
std::string markup;
std::string css_selector;
std::vector<TransitionElement> elements;
scoped_refptr<net::HttpResponseHeaders> response_headers;
GURL request_url;
};
// TransitionRequestManager is used to handle bookkeeping for transition
// requests and responses.
//
// TransitionRequestManager is a singleton and should only be accessed on the IO
// thread.
//
class TransitionRequestManager {
public:
// Returns the singleton instance.
CONTENT_EXPORT static TransitionRequestManager* GetInstance();
// Parses out any transition-entering-stylesheet link headers from the
// response headers.
CONTENT_EXPORT static void ParseTransitionStylesheetsFromHeaders(
const scoped_refptr<net::HttpResponseHeaders>& headers,
std::vector<GURL>& entering_stylesheets,
const GURL& resolve_address);
// Get pending transition request data from RenderFrameHost specified by the
// given IDs and return true if the data exists. For web to web transition, we
// will have to delay the response until the embedder resumes the request if
// the data exists.
CONTENT_EXPORT bool GetPendingTransitionRequest(
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,
const std::vector<TransitionElement>& elements);
CONTENT_EXPORT void AddPendingTransitionRequestDataForTesting(
int render_process_id,
int render_frame_id);
CONTENT_EXPORT void ClearPendingTransitionRequestData(int render_process_id,
int render_frame_id);
// The maximum number of elements is meant to avoid passing arbitrarily large
// amount of objects across the IPC boundary.
static const int kMaxNumOfElements = 1024;
private:
class TransitionRequestData {
public:
TransitionRequestData();
~TransitionRequestData();
void AddEntry(const std::string& allowed_destination_host_pattern,
const std::string& selector,
const std::string& markup,
const std::vector<TransitionElement>& elements);
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;
std::vector<TransitionElement> elements;
AllowedEntry(const std::string& allowed_destination_host_pattern,
const std::string& css_selector,
const std::string& markup,
const std::vector<TransitionElement>& elements);
~AllowedEntry();
};
std::vector<AllowedEntry> allowed_entries_;
};
friend struct DefaultSingletonTraits<TransitionRequestManager>;
typedef std::map<std::pair<int, int>, TransitionRequestData>
RenderFrameRequestDataMap;
TransitionRequestManager();
~TransitionRequestManager();
// 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);
};
} // namespace content
#endif // CONTENT_BROWSER_TRANSITION_REQUEST_MANAGER_H_
|