Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/active_tab_permission_granter.h" | 5 #include "chrome/browser/extensions/active_tab_permission_granter.h" |
| 6 | 6 |
| 7 #include "chrome/browser/chrome_notification_types.h" | 7 #include "chrome/browser/chrome_notification_types.h" |
| 8 #include "chrome/browser/extensions/extension_service.h" | 8 #include "chrome/browser/extensions/extension_service.h" |
| 9 #include "chrome/browser/extensions/extension_system.h" | 9 #include "chrome/browser/extensions/extension_system.h" |
| 10 #include "chrome/browser/profiles/profile.h" | 10 #include "chrome/browser/profiles/profile.h" |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 30 content::WebContents* web_contents, int tab_id, Profile* profile) | 30 content::WebContents* web_contents, int tab_id, Profile* profile) |
| 31 : WebContentsObserver(web_contents), tab_id_(tab_id) { | 31 : WebContentsObserver(web_contents), tab_id_(tab_id) { |
| 32 registrar_.Add(this, | 32 registrar_.Add(this, |
| 33 chrome::NOTIFICATION_EXTENSION_UNLOADED, | 33 chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 34 content::Source<Profile>(profile)); | 34 content::Source<Profile>(profile)); |
| 35 } | 35 } |
| 36 | 36 |
| 37 ActiveTabPermissionGranter::~ActiveTabPermissionGranter() {} | 37 ActiveTabPermissionGranter::~ActiveTabPermissionGranter() {} |
| 38 | 38 |
| 39 void ActiveTabPermissionGranter::GrantIfRequested(const Extension* extension) { | 39 void ActiveTabPermissionGranter::GrantIfRequested(const Extension* extension) { |
| 40 if (!extension->HasAPIPermission(extensions::APIPermission::kActiveTab) && | 40 if (!extension->HasAPIPermission(APIPermission::kActiveTab) && |
| 41 !extension->HasAPIPermission(extensions::APIPermission::kTabCapture)) { | 41 !extension->HasAPIPermission(APIPermission::kTabCapture)) { |
| 42 return; | 42 return; |
| 43 } | 43 } |
|
not at google - send to devlin
2013/09/13 03:22:44
this check here isn't worth much anymore
justinlin
2013/09/13 19:27:32
Still need this, otherwise there will be some un-n
not at google - send to devlin
2013/09/13 22:09:45
why? you check new_apis.empty.
justinlin
2013/09/13 22:47:15
Done. Well, now I do :)
| |
| 44 | 44 |
| 45 if (IsGranted(extension)) | 45 if (granted_extensions_.Contains(extension->id())) |
| 46 return; | 46 return; |
| 47 | 47 |
| 48 URLPattern pattern(UserScript::ValidUserScriptSchemes()); | 48 if (extension->HasAPIPermission(APIPermission::kActiveTab)) { |
| 49 if (pattern.Parse(web_contents()->GetURL().spec()) != | 49 URLPattern pattern(UserScript::ValidUserScriptSchemes()); |
| 50 URLPattern::PARSE_SUCCESS) { | 50 if (pattern.Parse(web_contents()->GetURL().spec()) != |
| 51 // Pattern parsing could fail if this is an unsupported URL e.g. chrome://. | 51 URLPattern::PARSE_SUCCESS) { |
| 52 return; | 52 // Pattern parsing could fail if this is an unsupported URL e.g. |
| 53 // chrome://. | |
| 54 return; | |
| 55 } | |
| 56 | |
| 57 APIPermissionSet new_apis; | |
| 58 new_apis.insert(APIPermission::kTab); | |
| 59 URLPatternSet new_hosts; | |
| 60 new_hosts.AddPattern(pattern); | |
| 61 scoped_refptr<const PermissionSet> new_permissions = | |
| 62 new PermissionSet(new_apis, new_hosts, URLPatternSet()); | |
| 63 | |
| 64 PermissionsData::UpdateTabSpecificPermissions(extension, | |
| 65 tab_id_, | |
| 66 new_permissions); | |
| 67 Send(new ExtensionMsg_UpdateTabSpecificPermissions(GetPageID(), | |
| 68 tab_id_, | |
| 69 extension->id(), | |
| 70 new_hosts)); | |
| 53 } | 71 } |
| 54 | 72 |
| 55 APIPermissionSet new_apis; | 73 if (extension->HasAPIPermission(APIPermission::kTabCapture)) { |
| 56 new_apis.insert(APIPermission::kTab); | 74 APIPermissionSet new_apis; |
| 57 URLPatternSet new_hosts; | 75 new_apis.insert(APIPermission::kTabCaptureForTab); |
| 58 new_hosts.AddPattern(pattern); | 76 scoped_refptr<const PermissionSet> new_permissions = |
| 59 scoped_refptr<const PermissionSet> new_permissions = | 77 new PermissionSet(new_apis, URLPatternSet(), URLPatternSet()); |
| 60 new PermissionSet(new_apis, new_hosts, URLPatternSet()); | 78 PermissionsData::UpdateTabSpecificPermissions(extension, |
| 79 tab_id_, | |
| 80 new_permissions); | |
|
not at google - send to devlin
2013/09/13 03:22:44
could you factor this so that each case shares mor
justinlin
2013/09/13 19:27:32
Done. Fixed a kind of subtle bug too with this sec
| |
| 81 } | |
| 61 | 82 |
| 62 PermissionsData::UpdateTabSpecificPermissions(extension, | |
| 63 tab_id_, | |
| 64 new_permissions); | |
| 65 granted_extensions_.Insert(extension); | 83 granted_extensions_.Insert(extension); |
| 66 Send(new ExtensionMsg_UpdateTabSpecificPermissions(GetPageID(), | |
| 67 tab_id_, | |
| 68 extension->id(), | |
| 69 new_hosts)); | |
| 70 } | |
| 71 | |
| 72 bool ActiveTabPermissionGranter::IsGranted(const Extension* extension) { | |
| 73 return granted_extensions_.Contains(extension->id()); | |
| 74 } | 84 } |
| 75 | 85 |
| 76 void ActiveTabPermissionGranter::DidNavigateMainFrame( | 86 void ActiveTabPermissionGranter::DidNavigateMainFrame( |
| 77 const content::LoadCommittedDetails& details, | 87 const content::LoadCommittedDetails& details, |
| 78 const content::FrameNavigateParams& params) { | 88 const content::FrameNavigateParams& params) { |
| 79 if (details.is_in_page) | 89 if (details.is_in_page) |
| 80 return; | 90 return; |
| 81 DCHECK(details.is_main_frame); // important: sub-frames don't get granted! | 91 DCHECK(details.is_main_frame); // important: sub-frames don't get granted! |
| 82 ClearActiveExtensionsAndNotify(); | 92 ClearActiveExtensionsAndNotify(); |
| 83 } | 93 } |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 113 | 123 |
| 114 Send(new ExtensionMsg_ClearTabSpecificPermissions(tab_id_, extension_ids)); | 124 Send(new ExtensionMsg_ClearTabSpecificPermissions(tab_id_, extension_ids)); |
| 115 granted_extensions_.Clear(); | 125 granted_extensions_.Clear(); |
| 116 } | 126 } |
| 117 | 127 |
| 118 int32 ActiveTabPermissionGranter::GetPageID() { | 128 int32 ActiveTabPermissionGranter::GetPageID() { |
| 119 return web_contents()->GetController().GetVisibleEntry()->GetPageID(); | 129 return web_contents()->GetController().GetVisibleEntry()->GetPageID(); |
| 120 } | 130 } |
| 121 | 131 |
| 122 } // namespace extensions | 132 } // namespace extensions |
| OLD | NEW |