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/renderer/extensions/extension_dispatcher.h" | 5 #include "chrome/renderer/extensions/extension_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/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
10 #include "base/string_piece.h" | 10 #include "base/string_piece.h" |
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
103 using extensions::TabsCustomBindings; | 103 using extensions::TabsCustomBindings; |
104 using extensions::UpdatedExtensionPermissionsInfo; | 104 using extensions::UpdatedExtensionPermissionsInfo; |
105 using extensions::WebRequestCustomBindings; | 105 using extensions::WebRequestCustomBindings; |
106 | 106 |
107 namespace { | 107 namespace { |
108 | 108 |
109 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000; | 109 static const int64 kInitialExtensionIdleHandlerDelayMs = 5*1000; |
110 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000; | 110 static const int64 kMaxExtensionIdleHandlerDelayMs = 5*60*1000; |
111 static const char kEventDispatchFunction[] = "Event.dispatchJSON"; | 111 static const char kEventDispatchFunction[] = "Event.dispatchJSON"; |
112 static const char kOnUnloadEvent[] = "runtime.onSuspend"; | 112 static const char kOnUnloadEvent[] = "runtime.onSuspend"; |
| 113 static const char kOnSuspendCanceledEvent[] = "runtime.onSuspendCanceled"; |
113 | 114 |
114 class ChromeHiddenNativeHandler : public NativeHandler { | 115 class ChromeHiddenNativeHandler : public NativeHandler { |
115 public: | 116 public: |
116 ChromeHiddenNativeHandler() { | 117 ChromeHiddenNativeHandler() { |
117 RouteFunction("GetChromeHidden", | 118 RouteFunction("GetChromeHidden", |
118 base::Bind(&ChromeHiddenNativeHandler::GetChromeHidden, | 119 base::Bind(&ChromeHiddenNativeHandler::GetChromeHidden, |
119 base::Unretained(this))); | 120 base::Unretained(this))); |
120 } | 121 } |
121 | 122 |
122 v8::Handle<v8::Value> GetChromeHidden(const v8::Arguments& args) { | 123 v8::Handle<v8::Value> GetChromeHidden(const v8::Arguments& args) { |
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 IPC_MESSAGE_HANDLER(ExtensionMsg_ActivateExtension, OnActivateExtension) | 319 IPC_MESSAGE_HANDLER(ExtensionMsg_ActivateExtension, OnActivateExtension) |
319 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) | 320 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdatePermissions, OnUpdatePermissions) |
320 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateTabSpecificPermissions, | 321 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateTabSpecificPermissions, |
321 OnUpdateTabSpecificPermissions) | 322 OnUpdateTabSpecificPermissions) |
322 IPC_MESSAGE_HANDLER(ExtensionMsg_ClearTabSpecificPermissions, | 323 IPC_MESSAGE_HANDLER(ExtensionMsg_ClearTabSpecificPermissions, |
323 OnClearTabSpecificPermissions) | 324 OnClearTabSpecificPermissions) |
324 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateUserScripts, OnUpdateUserScripts) | 325 IPC_MESSAGE_HANDLER(ExtensionMsg_UpdateUserScripts, OnUpdateUserScripts) |
325 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) | 326 IPC_MESSAGE_HANDLER(ExtensionMsg_UsingWebRequestAPI, OnUsingWebRequestAPI) |
326 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldUnload, OnShouldUnload) | 327 IPC_MESSAGE_HANDLER(ExtensionMsg_ShouldUnload, OnShouldUnload) |
327 IPC_MESSAGE_HANDLER(ExtensionMsg_Unload, OnUnload) | 328 IPC_MESSAGE_HANDLER(ExtensionMsg_Unload, OnUnload) |
| 329 IPC_MESSAGE_HANDLER(ExtensionMsg_CancelUnload, OnCancelUnload) |
328 IPC_MESSAGE_UNHANDLED(handled = false) | 330 IPC_MESSAGE_UNHANDLED(handled = false) |
329 IPC_END_MESSAGE_MAP() | 331 IPC_END_MESSAGE_MAP() |
330 | 332 |
331 return handled; | 333 return handled; |
332 } | 334 } |
333 | 335 |
334 void ExtensionDispatcher::WebKitInitialized() { | 336 void ExtensionDispatcher::WebKitInitialized() { |
335 // For extensions, we want to ensure we call the IdleHandler every so often, | 337 // For extensions, we want to ensure we call the IdleHandler every so often, |
336 // even if the extension keeps up activity. | 338 // even if the extension keeps up activity. |
337 if (is_extension_process_) { | 339 if (is_extension_process_) { |
(...skipping 654 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 // event creates. | 994 // event creates. |
993 ListValue args; | 995 ListValue args; |
994 args.Set(0, Value::CreateStringValue(kOnUnloadEvent)); | 996 args.Set(0, Value::CreateStringValue(kOnUnloadEvent)); |
995 args.Set(1, Value::CreateStringValue("[]")); | 997 args.Set(1, Value::CreateStringValue("[]")); |
996 v8_context_set_.DispatchChromeHiddenMethod( | 998 v8_context_set_.DispatchChromeHiddenMethod( |
997 extension_id, kEventDispatchFunction, args, NULL, GURL()); | 999 extension_id, kEventDispatchFunction, args, NULL, GURL()); |
998 | 1000 |
999 RenderThread::Get()->Send(new ExtensionHostMsg_UnloadAck(extension_id)); | 1001 RenderThread::Get()->Send(new ExtensionHostMsg_UnloadAck(extension_id)); |
1000 } | 1002 } |
1001 | 1003 |
| 1004 void ExtensionDispatcher::OnCancelUnload(const std::string& extension_id) { |
| 1005 ListValue args; |
| 1006 args.Set(0, Value::CreateStringValue(kOnSuspendCanceledEvent)); |
| 1007 args.Set(1, Value::CreateStringValue("[]")); |
| 1008 v8_context_set_.DispatchChromeHiddenMethod( |
| 1009 extension_id, kEventDispatchFunction, args, NULL, GURL()); |
| 1010 } |
| 1011 |
1002 Feature::Context ExtensionDispatcher::ClassifyJavaScriptContext( | 1012 Feature::Context ExtensionDispatcher::ClassifyJavaScriptContext( |
1003 const std::string& extension_id, | 1013 const std::string& extension_id, |
1004 int extension_group, | 1014 int extension_group, |
1005 const ExtensionURLInfo& url_info) { | 1015 const ExtensionURLInfo& url_info) { |
1006 if (extension_group == EXTENSION_GROUP_CONTENT_SCRIPTS) | 1016 if (extension_group == EXTENSION_GROUP_CONTENT_SCRIPTS) |
1007 return Feature::CONTENT_SCRIPT_CONTEXT; | 1017 return Feature::CONTENT_SCRIPT_CONTEXT; |
1008 | 1018 |
1009 // We have an explicit check for sandboxed pages first since: | 1019 // We have an explicit check for sandboxed pages first since: |
1010 // 1. Sandboxed pages run in the same process as regular extension pages, so | 1020 // 1. Sandboxed pages run in the same process as regular extension pages, so |
1011 // the extension is considered active. | 1021 // the extension is considered active. |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1068 // APIs, they don't get extension bindings injected. If we end up here it | 1078 // APIs, they don't get extension bindings injected. If we end up here it |
1069 // means that a sandboxed page somehow managed to invoke an API anyway, so | 1079 // means that a sandboxed page somehow managed to invoke an API anyway, so |
1070 // we should abort. | 1080 // we should abort. |
1071 WebKit::WebFrame* frame = context->web_frame(); | 1081 WebKit::WebFrame* frame = context->web_frame(); |
1072 ExtensionURLInfo url_info(frame->document().securityOrigin(), | 1082 ExtensionURLInfo url_info(frame->document().securityOrigin(), |
1073 extensions::UserScriptSlave::GetDataSourceURLForFrame(frame)); | 1083 extensions::UserScriptSlave::GetDataSourceURLForFrame(frame)); |
1074 CHECK(!extensions_.IsSandboxedPage(url_info)); | 1084 CHECK(!extensions_.IsSandboxedPage(url_info)); |
1075 | 1085 |
1076 return true; | 1086 return true; |
1077 } | 1087 } |
OLD | NEW |