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

Side by Side Diff: extensions/browser/api/web_request/web_request_api.cc

Issue 1413543005: Use FrameTreeNode ID as frameId in extension APIs (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Charlie's nits (#33) Created 5 years 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
OLDNEW
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 "extensions/browser/api/web_request/web_request_api.h" 5 #include "extensions/browser/api/web_request/web_request_api.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 19 matching lines...) Expand all
30 #include "extensions/browser/api/declarative_webrequest/request_stage.h" 30 #include "extensions/browser/api/declarative_webrequest/request_stage.h"
31 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h" 31 #include "extensions/browser/api/declarative_webrequest/webrequest_constants.h"
32 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h" 32 #include "extensions/browser/api/declarative_webrequest/webrequest_rules_registr y.h"
33 #include "extensions/browser/api/extensions_api_client.h" 33 #include "extensions/browser/api/extensions_api_client.h"
34 #include "extensions/browser/api/web_request/upload_data_presenter.h" 34 #include "extensions/browser/api/web_request/upload_data_presenter.h"
35 #include "extensions/browser/api/web_request/web_request_api_constants.h" 35 #include "extensions/browser/api/web_request/web_request_api_constants.h"
36 #include "extensions/browser/api/web_request/web_request_api_helpers.h" 36 #include "extensions/browser/api/web_request/web_request_api_helpers.h"
37 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h " 37 #include "extensions/browser/api/web_request/web_request_event_router_delegate.h "
38 #include "extensions/browser/api/web_request/web_request_time_tracker.h" 38 #include "extensions/browser/api/web_request/web_request_time_tracker.h"
39 #include "extensions/browser/event_router.h" 39 #include "extensions/browser/event_router.h"
40 #include "extensions/browser/extension_api_frame_id_map.h"
40 #include "extensions/browser/extension_prefs.h" 41 #include "extensions/browser/extension_prefs.h"
41 #include "extensions/browser/extension_registry.h" 42 #include "extensions/browser/extension_registry.h"
42 #include "extensions/browser/extension_system.h" 43 #include "extensions/browser/extension_system.h"
43 #include "extensions/browser/extensions_browser_client.h" 44 #include "extensions/browser/extensions_browser_client.h"
44 #include "extensions/browser/guest_view/guest_view_events.h" 45 #include "extensions/browser/guest_view/guest_view_events.h"
45 #include "extensions/browser/guest_view/web_view/web_view_constants.h" 46 #include "extensions/browser/guest_view/web_view/web_view_constants.h"
46 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h" 47 #include "extensions/browser/guest_view/web_view/web_view_renderer_state.h"
47 #include "extensions/browser/info_map.h" 48 #include "extensions/browser/info_map.h"
48 #include "extensions/browser/io_thread_extension_message_filter.h" 49 #include "extensions/browser/io_thread_extension_message_filter.h"
49 #include "extensions/browser/runtime_data.h" 50 #include "extensions/browser/runtime_data.h"
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
121 return keys::kOnResponseStarted; 122 return keys::kOnResponseStarted;
122 case ExtensionWebRequestEventRouter::kOnErrorOccurred: 123 case ExtensionWebRequestEventRouter::kOnErrorOccurred:
123 return keys::kOnErrorOccurred; 124 return keys::kOnErrorOccurred;
124 case ExtensionWebRequestEventRouter::kOnCompleted: 125 case ExtensionWebRequestEventRouter::kOnCompleted:
125 return keys::kOnCompleted; 126 return keys::kOnCompleted;
126 } 127 }
127 NOTREACHED(); 128 NOTREACHED();
128 return "Not reached"; 129 return "Not reached";
129 } 130 }
130 131
131 int GetFrameId(bool is_main_frame, int frame_id) {
132 return is_main_frame ? 0 : frame_id;
133 }
134
135 bool IsWebRequestEvent(const std::string& event_name) { 132 bool IsWebRequestEvent(const std::string& event_name) {
136 std::string web_request_event_name(event_name); 133 std::string web_request_event_name(event_name);
137 if (base::StartsWith(web_request_event_name, 134 if (base::StartsWith(web_request_event_name,
138 webview::kWebViewEventPrefix, 135 webview::kWebViewEventPrefix,
139 base::CompareCase::SENSITIVE)) { 136 base::CompareCase::SENSITIVE)) {
140 web_request_event_name.replace( 137 web_request_event_name.replace(
141 0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix); 138 0, strlen(webview::kWebViewEventPrefix), kWebRequestEventPrefix);
142 } 139 }
143 const auto web_request_events_end = 140 const auto web_request_events_end =
144 kWebRequestEvents + arraysize(kWebRequestEvents); 141 kWebRequestEvents + arraysize(kWebRequestEvents);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
195 WebViewRendererState::WebViewInfo* web_view_info) { 192 WebViewRendererState::WebViewInfo* web_view_info) {
196 int render_process_host_id = -1; 193 int render_process_host_id = -1;
197 int routing_id = -1; 194 int routing_id = -1;
198 ExtractRequestRoutingInfo(request, &render_process_host_id, &routing_id); 195 ExtractRequestRoutingInfo(request, &render_process_host_id, &routing_id);
199 return WebViewRendererState::GetInstance()->GetInfo( 196 return WebViewRendererState::GetInstance()->GetInfo(
200 render_process_host_id, routing_id, web_view_info); 197 render_process_host_id, routing_id, web_view_info);
201 } 198 }
202 199
203 void ExtractRequestInfoDetails(const net::URLRequest* request, 200 void ExtractRequestInfoDetails(const net::URLRequest* request,
204 bool* is_main_frame, 201 bool* is_main_frame,
205 int* frame_id, 202 int* render_frame_id,
206 bool* parent_is_main_frame,
207 int* parent_frame_id,
208 int* render_process_host_id, 203 int* render_process_host_id,
209 int* routing_id, 204 int* routing_id,
210 ResourceType* resource_type) { 205 ResourceType* resource_type) {
211 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 206 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
212 if (!info) 207 if (!info)
213 return; 208 return;
214 209
215 *frame_id = info->GetRenderFrameID(); 210 *render_frame_id = info->GetRenderFrameID();
216 *is_main_frame = info->IsMainFrame(); 211 *is_main_frame = info->IsMainFrame();
217 *parent_frame_id = info->GetParentRenderFrameID();
218 *parent_is_main_frame = info->ParentIsMainFrame();
219 *render_process_host_id = info->GetChildID(); 212 *render_process_host_id = info->GetChildID();
220 *routing_id = info->GetRouteID(); 213 *routing_id = info->GetRouteID();
221 214
222 // Restrict the resource type to the values we care about. 215 // Restrict the resource type to the values we care about.
223 if (helpers::IsRelevantResourceType(info->GetResourceType())) 216 if (helpers::IsRelevantResourceType(info->GetResourceType()))
224 *resource_type = info->GetResourceType(); 217 *resource_type = info->GetResourceType();
225 else 218 else
226 *resource_type = content::RESOURCE_TYPE_LAST_TYPE; 219 *resource_type = content::RESOURCE_TYPE_LAST_TYPE;
227 } 220 }
228 221
222 void ExtractRenderFrameInfo(base::DictionaryValue* dict,
223 int* render_process_id,
224 int* render_frame_id) {
225 if (dict->GetInteger(keys::kFrameIdKey, render_frame_id) &&
226 dict->GetInteger(keys::kProcessIdKey, render_process_id)) {
227 } else {
228 *render_process_id = -1;
229 *render_frame_id = -1;
230 }
231 // ExtractFrameIdInfo will overwrite kFrameIdKey, so it is not removed here.
battre 2015/12/10 15:31:39 nit: ExtractApiFrameFrameIdInfo?
robwu 2015/12/10 16:39:29 Done (using 1x Frame though: ExtractApiFrameIdInfo
232 dict->Remove(keys::kProcessIdKey, nullptr);
battre 2015/12/10 15:31:39 It feels weird to me that the extract function has
robwu 2015/12/10 16:39:29 Indeed. That's why I document that processId is mo
233 }
234
235 void ExtractApiFrameIdInfo(base::DictionaryValue* dict,
236 const ExtensionApiFrameId& extension_api_frame_id) {
battre 2015/12/10 15:31:39 nit: do you want to put the output parameter last?
robwu 2015/12/10 16:39:29 Done.
237 dict->SetInteger(keys::kFrameIdKey, extension_api_frame_id.frame_id);
238 dict->SetInteger(keys::kParentFrameIdKey,
239 extension_api_frame_id.parent_frame_id);
240 }
241
229 // Extracts the body from |request| and writes the data into |out|. 242 // Extracts the body from |request| and writes the data into |out|.
230 void ExtractRequestInfoBody(const net::URLRequest* request, 243 void ExtractRequestInfoBody(const net::URLRequest* request,
231 base::DictionaryValue* out) { 244 base::DictionaryValue* out) {
232 const net::UploadDataStream* upload_data = request->get_upload(); 245 const net::UploadDataStream* upload_data = request->get_upload();
233 if (!upload_data || 246 if (!upload_data ||
234 (request->method() != "POST" && request->method() != "PUT")) { 247 (request->method() != "POST" && request->method() != "PUT")) {
235 return; // Need to exit without "out->Set(keys::kRequestBodyKey, ...);" . 248 return; // Need to exit without "out->Set(keys::kRequestBodyKey, ...);" .
236 } 249 }
237 250
238 base::DictionaryValue* request_body = new base::DictionaryValue(); 251 base::DictionaryValue* request_body = new base::DictionaryValue();
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
351 const WebViewRendererState::WebViewInfo& web_view_info, 364 const WebViewRendererState::WebViewInfo& web_view_info,
352 scoped_ptr<base::DictionaryValue> event_argument) { 365 scoped_ptr<base::DictionaryValue> event_argument) {
353 DCHECK_CURRENTLY_ON(BrowserThread::UI); 366 DCHECK_CURRENTLY_ON(BrowserThread::UI);
354 367
355 content::BrowserContext* browser_context = 368 content::BrowserContext* browser_context =
356 reinterpret_cast<content::BrowserContext*>(browser_context_id); 369 reinterpret_cast<content::BrowserContext*>(browser_context_id);
357 if (!ExtensionsBrowserClient::Get()->IsValidContext(browser_context)) 370 if (!ExtensionsBrowserClient::Get()->IsValidContext(browser_context))
358 return; 371 return;
359 372
360 scoped_ptr<base::ListValue> event_args(new base::ListValue); 373 scoped_ptr<base::ListValue> event_args(new base::ListValue);
374 int render_process_host_id = -1;
375 int render_frame_id = -1;
376 ExtractRenderFrameInfo(event_argument.get(), &render_process_host_id,
377 &render_frame_id);
378 const ExtensionApiFrameId& extension_api_frame_id =
379 ExtensionApiFrameIdMap::GetFrameId(render_process_host_id,
380 render_frame_id);
381 ExtractApiFrameIdInfo(event_argument.get(), extension_api_frame_id);
361 event_args->Append(event_argument.release()); 382 event_args->Append(event_argument.release());
362 383
363 EventRouter* event_router = EventRouter::Get(browser_context); 384 EventRouter* event_router = EventRouter::Get(browser_context);
364 385
365 EventFilteringInfo event_filtering_info; 386 EventFilteringInfo event_filtering_info;
366 387
367 events::HistogramValue histogram_value = events::UNKNOWN; 388 events::HistogramValue histogram_value = events::UNKNOWN;
368 std::string event_name; 389 std::string event_name;
369 // The instance ID uniquely identifies a <webview> instance within an embedder 390 // The instance ID uniquely identifies a <webview> instance within an embedder
370 // process. We use a filter here so that only event listeners for a particular 391 // process. We use a filter here so that only event listeners for a particular
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
517 return sub_event_name < that.sub_event_name; 538 return sub_event_name < that.sub_event_name;
518 539
519 if (web_view_instance_id != that.web_view_instance_id) 540 if (web_view_instance_id != that.web_view_instance_id)
520 return web_view_instance_id < that.web_view_instance_id; 541 return web_view_instance_id < that.web_view_instance_id;
521 542
522 if (web_view_instance_id == 0) { 543 if (web_view_instance_id == 0) {
523 // Do not filter by process ID for non-webviews, because this comparator 544 // Do not filter by process ID for non-webviews, because this comparator
524 // is also used to find and remove an event listener when an extension is 545 // is also used to find and remove an event listener when an extension is
525 // unloaded. At this point, the event listener cannot be mapped back to 546 // unloaded. At this point, the event listener cannot be mapped back to
526 // the original process, so 0 is used instead of the actual process ID. 547 // the original process, so 0 is used instead of the actual process ID.
527 DCHECK(embedder_process_id == 0 || that.embedder_process_id == 0); 548 if (embedder_process_id == 0 || that.embedder_process_id == 0) {
528 return false; 549 return false;
550 }
battre 2015/12/10 15:31:39 nit: no {}?
robwu 2015/12/10 16:39:29 Done.
529 } 551 }
530 552
531 if (embedder_process_id != that.embedder_process_id) 553 if (embedder_process_id != that.embedder_process_id)
532 return embedder_process_id < that.embedder_process_id; 554 return embedder_process_id < that.embedder_process_id;
533 555
534 return false; 556 return false;
535 } 557 }
536 558
537 EventListener() 559 EventListener()
538 : histogram_value(events::UNKNOWN), 560 : histogram_value(events::UNKNOWN),
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
734 if (rules_registry.get()) 756 if (rules_registry.get())
735 rules_registries_[key] = rules_registry; 757 rules_registries_[key] = rules_registry;
736 else 758 else
737 rules_registries_.erase(key); 759 rules_registries_.erase(key);
738 } 760 }
739 761
740 void ExtensionWebRequestEventRouter::ExtractRequestInfo( 762 void ExtensionWebRequestEventRouter::ExtractRequestInfo(
741 const net::URLRequest* request, 763 const net::URLRequest* request,
742 base::DictionaryValue* out) { 764 base::DictionaryValue* out) {
743 bool is_main_frame = false; 765 bool is_main_frame = false;
744 int frame_id = -1; 766 int render_frame_id = -1;
745 bool parent_is_main_frame = false;
746 int parent_frame_id = -1;
747 int frame_id_for_extension = -1;
748 int parent_frame_id_for_extension = -1;
749 int render_process_host_id = -1; 767 int render_process_host_id = -1;
750 int routing_id = -1; 768 int routing_id = -1;
751 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; 769 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
752 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, 770 ExtractRequestInfoDetails(request, &is_main_frame, &render_frame_id,
753 &parent_is_main_frame, &parent_frame_id,
754 &render_process_host_id, &routing_id, 771 &render_process_host_id, &routing_id,
755 &resource_type); 772 &resource_type);
756 frame_id_for_extension = GetFrameId(is_main_frame, frame_id);
757 parent_frame_id_for_extension = GetFrameId(parent_is_main_frame,
758 parent_frame_id);
759 773
760 out->SetString(keys::kRequestIdKey, 774 out->SetString(keys::kRequestIdKey,
761 base::Uint64ToString(request->identifier())); 775 base::Uint64ToString(request->identifier()));
762 out->SetString(keys::kUrlKey, request->url().spec()); 776 out->SetString(keys::kUrlKey, request->url().spec());
763 out->SetString(keys::kMethodKey, request->method()); 777 out->SetString(keys::kMethodKey, request->method());
764 out->SetInteger(keys::kFrameIdKey, frame_id_for_extension); 778 // Note: This (frameId, processId) pair is removed by ExtractRenderFrameInfo,
765 out->SetInteger(keys::kParentFrameIdKey, parent_frame_id_for_extension); 779 // and then finally set by ExtractApiFrameIdInfo.
780 // TODO(robwu): This is ugly. Create a proper data structure to separate these
781 // two IDs from the dictionary, so that kFrameIdKey has only one meaning.
782 out->SetInteger(keys::kFrameIdKey, render_frame_id);
783 out->SetInteger(keys::kProcessIdKey, render_process_host_id);
766 out->SetString(keys::kTypeKey, helpers::ResourceTypeToString(resource_type)); 784 out->SetString(keys::kTypeKey, helpers::ResourceTypeToString(resource_type));
767 out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000); 785 out->SetDouble(keys::kTimeStampKey, base::Time::Now().ToDoubleT() * 1000);
768 if (web_request_event_router_delegate_) { 786 if (web_request_event_router_delegate_) {
769 web_request_event_router_delegate_->ExtractExtraRequestDetails( 787 web_request_event_router_delegate_->ExtractExtraRequestDetails(
770 request, out); 788 request, out);
771 } 789 }
772 } 790 }
773 791
774 int ExtensionWebRequestEventRouter::OnBeforeRequest( 792 int ExtensionWebRequestEventRouter::OnBeforeRequest(
775 void* browser_context, 793 void* browser_context,
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 } 1252 }
1235 1253
1236 bool ExtensionWebRequestEventRouter::DispatchEvent( 1254 bool ExtensionWebRequestEventRouter::DispatchEvent(
1237 void* browser_context, 1255 void* browser_context,
1238 net::URLRequest* request, 1256 net::URLRequest* request,
1239 const std::vector<const EventListener*>& listeners, 1257 const std::vector<const EventListener*>& listeners,
1240 const base::ListValue& args) { 1258 const base::ListValue& args) {
1241 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args) 1259 // TODO(mpcomplete): Consider consolidating common (extension_id,json_args)
1242 // pairs into a single message sent to a list of sub_event_names. 1260 // pairs into a single message sent to a list of sub_event_names.
1243 int num_handlers_blocking = 0; 1261 int num_handlers_blocking = 0;
1262
1263 scoped_ptr<std::vector<EventListener>> listeners_to_dispatch(
1264 new std::vector<EventListener>());
1265 listeners_to_dispatch->reserve(listeners.size());
1244 for (const EventListener* listener : listeners) { 1266 for (const EventListener* listener : listeners) {
1245 // Filter out the optional keys that this listener didn't request. 1267 listeners_to_dispatch->push_back(*listener);
1246 scoped_ptr<base::ListValue> args_filtered(args.DeepCopy());
1247 base::DictionaryValue* dict = NULL;
1248 CHECK(args_filtered->GetDictionary(0, &dict) && dict);
1249 if (!(listener->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS))
1250 dict->Remove(keys::kRequestHeadersKey, NULL);
1251 if (!(listener->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS))
1252 dict->Remove(keys::kResponseHeadersKey, NULL);
1253
1254 EventRouter::DispatchEventToSender(
1255 listener->ipc_sender.get(), browser_context, listener->extension_id,
1256 listener->histogram_value, listener->sub_event_name,
1257 args_filtered.Pass(), EventRouter::USER_GESTURE_UNKNOWN,
1258 EventFilteringInfo());
1259 if (listener->extra_info_spec & 1268 if (listener->extra_info_spec &
1260 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) { 1269 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) {
1261 listener->blocked_requests.insert(request->identifier()); 1270 listener->blocked_requests.insert(request->identifier());
1262 // If this is the first delegate blocking the request, go ahead and log 1271 // If this is the first delegate blocking the request, go ahead and log
1263 // it. 1272 // it.
1264 if (num_handlers_blocking == 0) { 1273 if (num_handlers_blocking == 0) {
1265 std::string delegate_info = l10n_util::GetStringFUTF8( 1274 std::string delegate_info = l10n_util::GetStringFUTF8(
1266 IDS_LOAD_STATE_PARAMETER_EXTENSION, 1275 IDS_LOAD_STATE_PARAMETER_EXTENSION,
1267 base::UTF8ToUTF16(listener->extension_name)); 1276 base::UTF8ToUTF16(listener->extension_name));
1268 // LobAndReport allows extensions that block requests to be displayed in 1277 // LobAndReport allows extensions that block requests to be displayed in
1269 // the load status bar. 1278 // the load status bar.
1270 request->LogAndReportBlockedBy(delegate_info.c_str()); 1279 request->LogAndReportBlockedBy(delegate_info.c_str());
1271 } 1280 }
1272 ++num_handlers_blocking; 1281 ++num_handlers_blocking;
1273 } 1282 }
1274 } 1283 }
1275 1284
1285 // TODO(robwu): Avoid unnecessary copy, by changing |args| to be a
1286 // scoped_ptr<base::DictionaryValue> and transferring the ownership.
1287 const base::DictionaryValue* dict = nullptr;
1288 CHECK(args.GetDictionary(0, &dict) && dict);
1289 base::DictionaryValue* args_copy = dict->DeepCopy();
1290
1291 int render_process_host_id = -1;
1292 int render_frame_id = -1;
1293 ExtractRenderFrameInfo(args_copy, &render_process_host_id, &render_frame_id);
1294
1295 ExtensionApiFrameIdMap::GetFrameIdOnIO(
1296 render_process_host_id, render_frame_id,
1297 base::Bind(&ExtensionWebRequestEventRouter::DispatchEventOnIO,
1298 AsWeakPtr(), browser_context,
1299 base::Passed(&listeners_to_dispatch), base::Owned(args_copy)));
battre 2015/12/10 15:31:39 Just checking: Can this asynchronicity rearrange e
robwu 2015/12/10 16:39:29 Good point. In theory, this is certainly possible
1300
1276 if (num_handlers_blocking > 0) { 1301 if (num_handlers_blocking > 0) {
1277 BlockedRequest& blocked_request = blocked_requests_[request->identifier()]; 1302 BlockedRequest& blocked_request = blocked_requests_[request->identifier()];
1278 blocked_request.request = request; 1303 blocked_request.request = request;
1279 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context); 1304 blocked_request.is_incognito |= IsIncognitoBrowserContext(browser_context);
1280 blocked_request.num_handlers_blocking += num_handlers_blocking; 1305 blocked_request.num_handlers_blocking += num_handlers_blocking;
1281 blocked_request.blocking_time = base::Time::Now(); 1306 blocked_request.blocking_time = base::Time::Now();
1282 return true; 1307 return true;
1283 } 1308 }
1284 1309
1285 return false; 1310 return false;
1286 } 1311 }
1287 1312
1313 void ExtensionWebRequestEventRouter::DispatchEventOnIO(
battre 2015/12/10 15:31:39 I think this naming is confusing because the other
robwu 2015/12/10 16:39:29 I've renamed it to DispatchEventToListeners.
1314 void* browser_context,
1315 scoped_ptr<std::vector<EventListener>> listeners,
1316 base::DictionaryValue* dict,
1317 const ExtensionApiFrameId& extension_api_frame_id) {
1318 DCHECK_CURRENTLY_ON(BrowserThread::IO);
1319 DCHECK(listeners.get());
1320 DCHECK_GT(listeners->size(), 0UL);
1321 DCHECK(dict);
1322
1323 ExtractApiFrameIdInfo(dict, extension_api_frame_id);
1324
1325 std::string event_name =
1326 EventRouter::GetBaseEventName((*listeners)[0].sub_event_name);
1327 DCHECK(IsWebRequestEvent(event_name));
1328
1329 const std::set<EventListener>& event_listeners =
1330 listeners_[browser_context][event_name];
1331 void* cross_browser_context = GetCrossBrowserContext(browser_context);
1332 const std::set<EventListener>* cross_event_listeners =
1333 cross_browser_context ? &listeners_[cross_browser_context][event_name]
1334 : nullptr;
1335
1336 for (const EventListener& target : *listeners) {
1337 std::set<EventListener>::const_iterator listener =
1338 event_listeners.find(target);
1339 // Ignore listener if it was removed between the thread hops.
1340 if (listener == event_listeners.end()) {
1341 if (!cross_event_listeners)
1342 continue;
1343 listener = cross_event_listeners->find(target);
1344 if (listener == cross_event_listeners->end())
1345 continue;
1346 }
1347
1348 // Filter out the optional keys that this listener didn't request.
1349 scoped_ptr<base::ListValue> args_filtered(new base::ListValue);
1350 args_filtered->Append(dict->DeepCopy());
1351 if (!(listener->extra_info_spec & ExtraInfoSpec::REQUEST_HEADERS))
1352 dict->Remove(keys::kRequestHeadersKey, nullptr);
1353 if (!(listener->extra_info_spec & ExtraInfoSpec::RESPONSE_HEADERS))
1354 dict->Remove(keys::kResponseHeadersKey, nullptr);
1355
1356 EventRouter::DispatchEventToSender(
1357 listener->ipc_sender.get(), browser_context, listener->extension_id,
1358 listener->histogram_value, listener->sub_event_name,
1359 args_filtered.Pass(), EventRouter::USER_GESTURE_UNKNOWN,
1360 EventFilteringInfo());
1361 }
1362 }
1363
1288 void ExtensionWebRequestEventRouter::OnEventHandled( 1364 void ExtensionWebRequestEventRouter::OnEventHandled(
1289 void* browser_context, 1365 void* browser_context,
1290 const std::string& extension_id, 1366 const std::string& extension_id,
1291 const std::string& event_name, 1367 const std::string& event_name,
1292 const std::string& sub_event_name, 1368 const std::string& sub_event_name,
1293 uint64_t request_id, 1369 uint64_t request_id,
1294 EventResponse* response) { 1370 EventResponse* response) {
1295 // TODO(robwu): Does this also work with webviews? operator< (used by find) 1371 // TODO(robwu): Does this also work with webviews? operator< (used by find)
1296 // takes the webview ID into account, which is not set on |listener|. 1372 // takes the webview ID into account, which is not set on |listener|.
1297 EventListener listener; 1373 EventListener listener;
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
1431 } 1507 }
1432 1508
1433 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad( 1509 void ExtensionWebRequestEventRouter::AddCallbackForPageLoad(
1434 const base::Closure& callback) { 1510 const base::Closure& callback) {
1435 callbacks_for_page_load_.push_back(callback); 1511 callbacks_for_page_load_.push_back(callback);
1436 } 1512 }
1437 1513
1438 bool ExtensionWebRequestEventRouter::IsPageLoad( 1514 bool ExtensionWebRequestEventRouter::IsPageLoad(
1439 const net::URLRequest* request) const { 1515 const net::URLRequest* request) const {
1440 bool is_main_frame = false; 1516 bool is_main_frame = false;
1441 int frame_id = -1; 1517 int render_frame_id = -1;
1442 bool parent_is_main_frame = false;
1443 int parent_frame_id = -1;
1444 int render_process_host_id = -1; 1518 int render_process_host_id = -1;
1445 int routing_id = -1; 1519 int routing_id = -1;
1446 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; 1520 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
1447 1521
1448 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, 1522 ExtractRequestInfoDetails(request, &is_main_frame, &render_frame_id,
1449 &parent_is_main_frame, &parent_frame_id, 1523 &render_process_host_id, &routing_id,
1450 &render_process_host_id, 1524 &resource_type);
1451 &routing_id, &resource_type);
1452 1525
1453 return resource_type == content::RESOURCE_TYPE_MAIN_FRAME; 1526 return resource_type == content::RESOURCE_TYPE_MAIN_FRAME;
1454 } 1527 }
1455 1528
1456 void ExtensionWebRequestEventRouter::NotifyPageLoad() { 1529 void ExtensionWebRequestEventRouter::NotifyPageLoad() {
1457 for (const auto& callback : callbacks_for_page_load_) 1530 for (const auto& callback : callbacks_for_page_load_)
1458 callback.Run(); 1531 callback.Run();
1459 callbacks_for_page_load_.clear(); 1532 callbacks_for_page_load_.clear();
1460 } 1533 }
1461 1534
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after
1581 void* browser_context, 1654 void* browser_context,
1582 const InfoMap* extension_info_map, 1655 const InfoMap* extension_info_map,
1583 const std::string& event_name, 1656 const std::string& event_name,
1584 const net::URLRequest* request, 1657 const net::URLRequest* request,
1585 int* extra_info_spec) { 1658 int* extra_info_spec) {
1586 // TODO(mpcomplete): handle browser_context == NULL (should collect all 1659 // TODO(mpcomplete): handle browser_context == NULL (should collect all
1587 // listeners). 1660 // listeners).
1588 *extra_info_spec = 0; 1661 *extra_info_spec = 0;
1589 1662
1590 bool is_main_frame = false; 1663 bool is_main_frame = false;
1591 int frame_id = -1; 1664 int render_frame_id = -1;
1592 bool parent_is_main_frame = false;
1593 int parent_frame_id = -1;
1594 int render_process_host_id = -1; 1665 int render_process_host_id = -1;
1595 int routing_id = -1; 1666 int routing_id = -1;
1596 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE; 1667 ResourceType resource_type = content::RESOURCE_TYPE_LAST_TYPE;
1597 const GURL& url = request->url(); 1668 const GURL& url = request->url();
1598 1669
1599 ExtractRequestInfoDetails(request, &is_main_frame, &frame_id, 1670 ExtractRequestInfoDetails(request, &is_main_frame, &render_frame_id,
1600 &parent_is_main_frame, &parent_frame_id, 1671 &render_process_host_id, &routing_id,
1601 &render_process_host_id, 1672 &resource_type);
1602 &routing_id, &resource_type);
1603 1673
1604 bool is_request_from_extension = 1674 bool is_request_from_extension =
1605 IsRequestFromExtension(request, extension_info_map); 1675 IsRequestFromExtension(request, extension_info_map);
1606 1676
1607 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request); 1677 const ResourceRequestInfo* info = ResourceRequestInfo::ForRequest(request);
1608 // We are conservative here and assume requests are asynchronous in case 1678 // We are conservative here and assume requests are asynchronous in case
1609 // we don't have an info object. We don't want to risk a deadlock. 1679 // we don't have an info object. We don't want to risk a deadlock.
1610 bool is_async_request = !info || info->IsAsync(); 1680 bool is_async_request = !info || info->IsAsync();
1611 1681
1612 EventListeners matching_listeners; 1682 EventListeners matching_listeners;
(...skipping 871 matching lines...) Expand 10 before | Expand all | Expand 10 after
2484 // Continue gracefully. 2554 // Continue gracefully.
2485 RunSync(); 2555 RunSync();
2486 } 2556 }
2487 2557
2488 bool WebRequestHandlerBehaviorChangedFunction::RunSync() { 2558 bool WebRequestHandlerBehaviorChangedFunction::RunSync() {
2489 helpers::ClearCacheOnNavigation(); 2559 helpers::ClearCacheOnNavigation();
2490 return true; 2560 return true;
2491 } 2561 }
2492 2562
2493 } // namespace extensions 2563 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698