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

Side by Side Diff: chrome/renderer/extensions/dispatcher.cc

Issue 22709003: Enable webview and browser-plugin as custom elements in Chrome Apps (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 4 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
« no previous file with comments | « chrome/renderer/extensions/dispatcher.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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/renderer/extensions/dispatcher.h" 5 #include "chrome/renderer/extensions/dispatcher.h"
6 6
7 #include "base/callback.h" 7 #include "base/callback.h"
8 #include "base/command_line.h" 8 #include "base/command_line.h"
9 #include "base/debug/alias.h" 9 #include "base/debug/alias.h"
10 #include "base/json/json_reader.h" 10 #include "base/json/json_reader.h"
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
76 #include "chrome/renderer/resource_bundle_source_map.h" 76 #include "chrome/renderer/resource_bundle_source_map.h"
77 #include "content/public/renderer/render_thread.h" 77 #include "content/public/renderer/render_thread.h"
78 #include "content/public/renderer/render_view.h" 78 #include "content/public/renderer/render_view.h"
79 #include "content/public/renderer/v8_value_converter.h" 79 #include "content/public/renderer/v8_value_converter.h"
80 #include "extensions/common/constants.h" 80 #include "extensions/common/constants.h"
81 #include "extensions/common/view_type.h" 81 #include "extensions/common/view_type.h"
82 #include "grit/common_resources.h" 82 #include "grit/common_resources.h"
83 #include "grit/renderer_resources.h" 83 #include "grit/renderer_resources.h"
84 #include "third_party/WebKit/public/platform/WebString.h" 84 #include "third_party/WebKit/public/platform/WebString.h"
85 #include "third_party/WebKit/public/platform/WebURLRequest.h" 85 #include "third_party/WebKit/public/platform/WebURLRequest.h"
86 #include "third_party/WebKit/public/web/WebCustomElement.h"
86 #include "third_party/WebKit/public/web/WebDataSource.h" 87 #include "third_party/WebKit/public/web/WebDataSource.h"
87 #include "third_party/WebKit/public/web/WebDocument.h" 88 #include "third_party/WebKit/public/web/WebDocument.h"
88 #include "third_party/WebKit/public/web/WebFrame.h" 89 #include "third_party/WebKit/public/web/WebFrame.h"
90 #include "third_party/WebKit/public/web/WebRuntimeFeatures.h"
89 #include "third_party/WebKit/public/web/WebScopedUserGesture.h" 91 #include "third_party/WebKit/public/web/WebScopedUserGesture.h"
90 #include "third_party/WebKit/public/web/WebSecurityPolicy.h" 92 #include "third_party/WebKit/public/web/WebSecurityPolicy.h"
91 #include "third_party/WebKit/public/web/WebView.h" 93 #include "third_party/WebKit/public/web/WebView.h"
92 #include "ui/base/layout.h" 94 #include "ui/base/layout.h"
93 #include "ui/base/resource/resource_bundle.h" 95 #include "ui/base/resource/resource_bundle.h"
94 #include "v8/include/v8.h" 96 #include "v8/include/v8.h"
95 97
96 using WebKit::WebDataSource; 98 using WebKit::WebDataSource;
97 using WebKit::WebDocument; 99 using WebKit::WebDocument;
98 using WebKit::WebFrame; 100 using WebKit::WebFrame;
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
456 458
457 void Dispatcher::WebKitInitialized() { 459 void Dispatcher::WebKitInitialized() {
458 // For extensions, we want to ensure we call the IdleHandler every so often, 460 // For extensions, we want to ensure we call the IdleHandler every so often,
459 // even if the extension keeps up activity. 461 // even if the extension keeps up activity.
460 if (is_extension_process_) { 462 if (is_extension_process_) {
461 forced_idle_timer_.Start(FROM_HERE, 463 forced_idle_timer_.Start(FROM_HERE,
462 base::TimeDelta::FromMilliseconds(kMaxExtensionIdleHandlerDelayMs), 464 base::TimeDelta::FromMilliseconds(kMaxExtensionIdleHandlerDelayMs),
463 RenderThread::Get(), &RenderThread::IdleHandler); 465 RenderThread::Get(), &RenderThread::IdleHandler);
464 } 466 }
465 467
468 bool is_app = false;
466 // Initialize host permissions for any extensions that were activated before 469 // Initialize host permissions for any extensions that were activated before
467 // WebKit was initialized. 470 // WebKit was initialized.
468 for (std::set<std::string>::iterator iter = active_extension_ids_.begin(); 471 for (std::set<std::string>::iterator iter = active_extension_ids_.begin();
469 iter != active_extension_ids_.end(); ++iter) { 472 iter != active_extension_ids_.end(); ++iter) {
470 const Extension* extension = extensions_.GetByID(*iter); 473 const Extension* extension = extensions_.GetByID(*iter);
471 CHECK(extension); 474 CHECK(extension);
472 InitOriginPermissions(extension); 475 InitOriginPermissions(extension);
476 is_app |= extension->is_app();
not at google - send to devlin 2013/08/08 21:20:25 you probably want is_platform_app()
473 } 477 }
474 478
479 if (is_app)
480 EnableCustomElementWhiteList();
481
475 is_webkit_initialized_ = true; 482 is_webkit_initialized_ = true;
476 } 483 }
477 484
478 void Dispatcher::IdleNotification() { 485 void Dispatcher::IdleNotification() {
479 if (is_extension_process_) { 486 if (is_extension_process_) {
480 // Dampen the forced delay as well if the extension stays idle for long 487 // Dampen the forced delay as well if the extension stays idle for long
481 // periods of time. 488 // periods of time.
482 int64 forced_delay_ms = std::max( 489 int64 forced_delay_ms = std::max(
483 RenderThread::Get()->GetIdleNotificationDelayInMs(), 490 RenderThread::Get()->GetIdleNotificationDelayInMs(),
484 kMaxExtensionIdleHandlerDelayMs); 491 kMaxExtensionIdleHandlerDelayMs);
(...skipping 657 matching lines...) Expand 10 before | Expand all | Expand 10 after
1142 1149
1143 // TODO(kalman): Delete this check. 1150 // TODO(kalman): Delete this check.
1144 if (frame->document().securityOrigin().isUnique()) 1151 if (frame->document().securityOrigin().isUnique())
1145 return std::string(); 1152 return std::string();
1146 1153
1147 // Extension pages (chrome-extension:// URLs). 1154 // Extension pages (chrome-extension:// URLs).
1148 GURL frame_url = UserScriptSlave::GetDataSourceURLForFrame(frame); 1155 GURL frame_url = UserScriptSlave::GetDataSourceURLForFrame(frame);
1149 return extensions_.GetExtensionOrAppIDByURL(frame_url); 1156 return extensions_.GetExtensionOrAppIDByURL(frame_url);
1150 } 1157 }
1151 1158
1152 bool Dispatcher::IsWithinPlatformApp(const WebFrame* frame) { 1159 bool Dispatcher::IsWithinPlatformApp(const WebFrame* frame) {
not at google - send to devlin 2013/08/08 21:20:25 I would rather we fix this method to work without
1153 GURL url(UserScriptSlave::GetDataSourceURLForFrame(frame->top())); 1160 GURL url(UserScriptSlave::GetDataSourceURLForFrame(frame->top()));
1154 const Extension* extension = extensions_.GetExtensionOrAppByURL(url); 1161 const Extension* extension = extensions_.GetExtensionOrAppByURL(url);
1155 1162
1156 return extension && extension->is_platform_app(); 1163 return extension && extension->is_platform_app();
1157 } 1164 }
1158 1165
1159 void Dispatcher::WillReleaseScriptContext( 1166 void Dispatcher::WillReleaseScriptContext(
1160 WebFrame* frame, v8::Handle<v8::Context> v8_context, int world_id) { 1167 WebFrame* frame, v8::Handle<v8::Context> v8_context, int world_id) {
1161 ChromeV8Context* context = v8_context_set_.GetByV8Context(v8_context); 1168 ChromeV8Context* context = v8_context_set_.GetByV8Context(v8_context);
1162 if (!context) 1169 if (!context)
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1215 1222
1216 if (is_webkit_initialized_) { 1223 if (is_webkit_initialized_) {
1217 InitOriginPermissions(extension); 1224 InitOriginPermissions(extension);
1218 // DOMActivity logger for a main world controlled by an extension (as in 1225 // DOMActivity logger for a main world controlled by an extension (as in
1219 // the case of an extension background page, options page, popup etc.) 1226 // the case of an extension background page, options page, popup etc.)
1220 // gets an empty title. 1227 // gets an empty title.
1221 DOMActivityLogger::AttachToWorld(DOMActivityLogger::kMainWorldId, 1228 DOMActivityLogger::AttachToWorld(DOMActivityLogger::kMainWorldId,
1222 extension_id, 1229 extension_id,
1223 extension->url(), 1230 extension->url(),
1224 string16()); 1231 string16());
1232
1233 const Extension* extension = extensions_.GetByID(extension_id);
1234 if (extension->is_app())
1235 EnableCustomElementWhiteList();
1225 } 1236 }
1226 } 1237 }
1227 1238
1228 void Dispatcher::InitOriginPermissions(const Extension* extension) { 1239 void Dispatcher::InitOriginPermissions(const Extension* extension) {
1229 // TODO(jstritar): We should try to remove this special case. Also, these 1240 // TODO(jstritar): We should try to remove this special case. Also, these
1230 // whitelist entries need to be updated when the kManagement permission 1241 // whitelist entries need to be updated when the kManagement permission
1231 // changes. 1242 // changes.
1232 if (extension->HasAPIPermission(APIPermission::kManagement)) { 1243 if (extension->HasAPIPermission(APIPermission::kManagement)) {
1233 WebSecurityPolicy::addOriginAccessWhitelistEntry( 1244 WebSecurityPolicy::addOriginAccessWhitelistEntry(
1234 extension->url(), 1245 extension->url(),
(...skipping 27 matching lines...) Expand all
1262 WebSecurityPolicy::addOriginAccessWhitelistEntry)( 1273 WebSecurityPolicy::addOriginAccessWhitelistEntry)(
1263 extension->url(), 1274 extension->url(),
1264 WebString::fromUTF8(schemes[j]), 1275 WebString::fromUTF8(schemes[j]),
1265 WebString::fromUTF8(i->host()), 1276 WebString::fromUTF8(i->host()),
1266 i->match_subdomains()); 1277 i->match_subdomains());
1267 } 1278 }
1268 } 1279 }
1269 } 1280 }
1270 } 1281 }
1271 1282
1283 void Dispatcher::EnableCustomElementWhiteList() {
1284 WebKit::WebRuntimeFeatures::enableCustomElements(true);
1285 WebKit::WebCustomElement::allowTagName("webview");
1286 // TODO(fsamuel): Add <adview> to the whitelist once it has been converted
1287 // into a custom element.
1288 WebKit::WebCustomElement::allowTagName("browser-plugin");
1289 }
1290
1272 void Dispatcher::AddOrRemoveBindings(const std::string& extension_id) { 1291 void Dispatcher::AddOrRemoveBindings(const std::string& extension_id) {
1273 v8_context_set().ForEach( 1292 v8_context_set().ForEach(
1274 extension_id, 1293 extension_id,
1275 NULL, // all render views 1294 NULL, // all render views
1276 base::Bind(&Dispatcher::AddOrRemoveBindingsForContext, 1295 base::Bind(&Dispatcher::AddOrRemoveBindingsForContext,
1277 base::Unretained(this))); 1296 base::Unretained(this)));
1278 } 1297 }
1279 1298
1280 void Dispatcher::OnUpdatePermissions(int reason_id, 1299 void Dispatcher::OnUpdatePermissions(int reason_id,
1281 const std::string& extension_id, 1300 const std::string& extension_id,
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
1530 RenderView* background_view = 1549 RenderView* background_view =
1531 ExtensionHelper::GetBackgroundPage(extension_id); 1550 ExtensionHelper::GetBackgroundPage(extension_id);
1532 if (background_view) { 1551 if (background_view) {
1533 background_view->Send(new ExtensionHostMsg_EventAck( 1552 background_view->Send(new ExtensionHostMsg_EventAck(
1534 background_view->GetRoutingID())); 1553 background_view->GetRoutingID()));
1535 } 1554 }
1536 } 1555 }
1537 } 1556 }
1538 1557
1539 } // namespace extensions 1558 } // namespace extensions
OLDNEW
« no previous file with comments | « chrome/renderer/extensions/dispatcher.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698