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

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

Issue 12189018: <webview>: Implement WebRequest API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Support all events Created 7 years, 10 months 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 | Annotate | Revision Log
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 "chrome/browser/extensions/api/web_request/web_request_api.h" 5 #include "chrome/browser/extensions/api/web_request/web_request_api.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/bind.h" 9 #include "base/bind.h"
10 #include "base/bind_helpers.h" 10 #include "base/bind_helpers.h"
(...skipping 1267 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 IsGuestProcess(render_process_host_id); 1278 IsGuestProcess(render_process_host_id);
1279 std::set<EventListener>& listeners = listeners_[profile][event_name]; 1279 std::set<EventListener>& listeners = listeners_[profile][event_name];
1280 for (std::set<EventListener>::iterator it = listeners.begin(); 1280 for (std::set<EventListener>::iterator it = listeners.begin();
1281 it != listeners.end(); ++it) { 1281 it != listeners.end(); ++it) {
1282 if (!it->ipc_sender.get()) { 1282 if (!it->ipc_sender.get()) {
1283 // The IPC sender has been deleted. This listener will be removed soon 1283 // The IPC sender has been deleted. This listener will be removed soon
1284 // via a call to RemoveEventListener. For now, just skip it. 1284 // via a call to RemoveEventListener. For now, just skip it.
1285 continue; 1285 continue;
1286 } 1286 }
1287 1287
1288 if (is_guest && (it->target_process_id != render_process_host_id|| 1288 if (is_guest && (it->target_process_id != render_process_host_id ||
1289 it->target_route_id != routing_id)) 1289 it->target_route_id != routing_id))
1290 continue; 1290 continue;
1291 1291
1292 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url)) 1292 if (!it->filter.urls.is_empty() && !it->filter.urls.MatchesURL(url))
1293 continue; 1293 continue;
1294 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id) 1294 if (it->filter.tab_id != -1 && tab_id != it->filter.tab_id)
1295 continue; 1295 continue;
1296 if (it->filter.window_id != -1 && window_id != it->filter.window_id) 1296 if (it->filter.window_id != -1 && window_id != it->filter.window_id)
1297 continue; 1297 continue;
1298 if (!it->filter.types.empty() && 1298 if (!it->filter.types.empty() &&
1299 std::find(it->filter.types.begin(), it->filter.types.end(), 1299 std::find(it->filter.types.begin(), it->filter.types.end(),
1300 resource_type) == it->filter.types.end()) 1300 resource_type) == it->filter.types.end())
1301 continue; 1301 continue;
1302 1302
1303 if (!WebRequestPermissions::CanExtensionAccessURL( 1303 if (!is_guest && !WebRequestPermissions::CanExtensionAccessURL(
1304 extension_info_map, it->extension_id, url, crosses_incognito, true)) 1304 extension_info_map, it->extension_id, url, crosses_incognito, true))
1305 continue; 1305 continue;
1306 1306
1307 bool blocking_listener = 1307 bool blocking_listener =
1308 (it->extra_info_spec & 1308 (it->extra_info_spec &
1309 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) != 0; 1309 (ExtraInfoSpec::BLOCKING | ExtraInfoSpec::ASYNC_BLOCKING)) != 0;
1310 1310
1311 // We do not want to notify extensions about XHR requests that are 1311 // We do not want to notify extensions about XHR requests that are
1312 // triggered by themselves. This is a workaround to prevent deadlocks 1312 // triggered by themselves. This is a workaround to prevent deadlocks
1313 // in case of synchronous XHR requests that block the extension renderer 1313 // in case of synchronous XHR requests that block the extension renderer
(...skipping 504 matching lines...) Expand 10 before | Expand all | Expand 10 after
1818 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue( 1818 ExtensionWebRequestEventRouter::ExtraInfoSpec::InitFromValue(
1819 *value, &extra_info_spec)); 1819 *value, &extra_info_spec));
1820 } 1820 }
1821 1821
1822 std::string event_name; 1822 std::string event_name;
1823 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name)); 1823 EXTENSION_FUNCTION_VALIDATE(args_->GetString(3, &event_name));
1824 1824
1825 std::string sub_event_name; 1825 std::string sub_event_name;
1826 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name)); 1826 EXTENSION_FUNCTION_VALIDATE(args_->GetString(4, &sub_event_name));
1827 1827
1828 int target_process_id = -1;
1829 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(5, &target_process_id));
1830
1831 int target_route_id = -1;
1832 EXTENSION_FUNCTION_VALIDATE(args_->GetInteger(6, &target_route_id));
1833
1828 const Extension* extension = 1834 const Extension* extension =
1829 extension_info_map()->extensions().GetByID(extension_id()); 1835 extension_info_map()->extensions().GetByID(extension_id());
1830 std::string extension_name = extension ? extension->name() : extension_id(); 1836 std::string extension_name = extension ? extension->name() : extension_id();
1831 1837
1832 // We check automatically whether the extension has the 'webRequest' 1838 // We check automatically whether the extension has the 'webRequest'
1833 // permission. For blocking calls we require the additional permission 1839 // permission. For blocking calls we require the additional permission
1834 // 'webRequestBlocking'. 1840 // 'webRequestBlocking'.
1835 if ((extra_info_spec & 1841 if ((!extension->is_app() && extra_info_spec &
1836 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING | 1842 (ExtensionWebRequestEventRouter::ExtraInfoSpec::BLOCKING |
1837 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) && 1843 ExtensionWebRequestEventRouter::ExtraInfoSpec::ASYNC_BLOCKING)) &&
1838 !extension->HasAPIPermission( 1844 !extension->HasAPIPermission(
1839 extensions::APIPermission::kWebRequestBlocking)) { 1845 extensions::APIPermission::kWebRequestBlocking)) {
1840 error_ = keys::kBlockingPermissionRequired; 1846 error_ = keys::kBlockingPermissionRequired;
1841 return false; 1847 return false;
1842 } 1848 }
1843 1849
1844 // We allow to subscribe to patterns that are broader than the host 1850 // We allow to subscribe to patterns that are broader than the host
1845 // permissions. E.g., we could subscribe to http://www.example.com/* 1851 // permissions. E.g., we could subscribe to http://www.example.com/*
1846 // while having host permissions for http://www.example.com/foo/* and 1852 // while having host permissions for http://www.example.com/foo/* and
1847 // http://www.example.com/bar/*. 1853 // http://www.example.com/bar/*.
1848 // For this reason we do only a coarse check here to warn the extension 1854 // For this reason we do only a coarse check here to warn the extension
1849 // developer if he does something obviously wrong. 1855 // developer if he does something obviously wrong.
1850 if (extension->GetEffectiveHostPermissions().is_empty()) { 1856 if (!extension->is_app() && extension->GetEffectiveHostPermissions().is_empty( )) {
1851 error_ = keys::kHostPermissionsRequired; 1857 error_ = keys::kHostPermissionsRequired;
1852 return false; 1858 return false;
1853 } 1859 }
1854 1860
1855 bool success = 1861 bool success =
1856 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener( 1862 ExtensionWebRequestEventRouter::GetInstance()->AddEventListener(
1857 profile_id(), extension_id(), extension_name, 1863 profile_id(), extension_id(), extension_name,
1858 event_name, sub_event_name, filter, 1864 event_name, sub_event_name, filter,
1859 extra_info_spec, -1, -1, ipc_sender_weak()); 1865 extra_info_spec, target_process_id, target_route_id,
1866 ipc_sender_weak());
1860 EXTENSION_FUNCTION_VALIDATE(success); 1867 EXTENSION_FUNCTION_VALIDATE(success);
1861 1868
1862 helpers::ClearCacheOnNavigation(); 1869 helpers::ClearCacheOnNavigation();
1863 1870
1864 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind( 1871 BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, base::Bind(
1865 &NotifyWebRequestAPIUsed, 1872 &NotifyWebRequestAPIUsed,
1866 profile_id(), make_scoped_refptr(GetExtension()))); 1873 profile_id(), make_scoped_refptr(GetExtension())));
1867 1874
1868 return true; 1875 return true;
1869 } 1876 }
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
2029 } else if ((*it)->name().find("AdBlock") != std::string::npos) { 2036 } else if ((*it)->name().find("AdBlock") != std::string::npos) {
2030 adblock = true; 2037 adblock = true;
2031 } else { 2038 } else {
2032 other = true; 2039 other = true;
2033 } 2040 }
2034 } 2041 }
2035 } 2042 }
2036 2043
2037 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other)); 2044 host->Send(new ExtensionMsg_UsingWebRequestAPI(adblock, adblock_plus, other));
2038 } 2045 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698