| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/chrome_v8_context.h" | 5 #include "chrome/renderer/extensions/chrome_v8_context.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "base/string_split.h" | 8 #include "base/string_split.h" |
| 9 #include "base/values.h" | 9 #include "base/values.h" |
| 10 #include "chrome/common/extensions/extension_set.h" | 10 #include "chrome/common/extensions/extension_set.h" |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 76 else | 76 else |
| 77 return NULL; | 77 return NULL; |
| 78 } | 78 } |
| 79 | 79 |
| 80 bool ChromeV8Context::CallChromeHiddenMethod( | 80 bool ChromeV8Context::CallChromeHiddenMethod( |
| 81 const std::string& function_name, | 81 const std::string& function_name, |
| 82 int argc, | 82 int argc, |
| 83 v8::Handle<v8::Value>* argv, | 83 v8::Handle<v8::Value>* argv, |
| 84 v8::Handle<v8::Value>* result) const { | 84 v8::Handle<v8::Value>* result) const { |
| 85 v8::Context::Scope context_scope(v8_context_); | 85 v8::Context::Scope context_scope(v8_context_); |
| 86 v8::TryCatch try_catch; | |
| 87 | 86 |
| 88 // Look up the function name, which may be a sub-property like | 87 // Look up the function name, which may be a sub-property like |
| 89 // "Port.dispatchOnMessage" in the hidden global variable. | 88 // "Port.dispatchOnMessage" in the hidden global variable. |
| 90 v8::Local<v8::Value> value = v8::Local<v8::Value>::New(GetChromeHidden()); | 89 v8::Local<v8::Value> value = v8::Local<v8::Value>::New(GetChromeHidden()); |
| 91 if (value.IsEmpty()) | 90 if (value.IsEmpty()) |
| 92 return false; | 91 return false; |
| 93 | 92 |
| 94 std::vector<std::string> components; | 93 std::vector<std::string> components; |
| 95 base::SplitStringDontTrim(function_name, '.', &components); | 94 base::SplitStringDontTrim(function_name, '.', &components); |
| 96 for (size_t i = 0; i < components.size(); ++i) { | 95 for (size_t i = 0; i < components.size(); ++i) { |
| 97 if (!value.IsEmpty() && value->IsObject()) { | 96 if (!value.IsEmpty() && value->IsObject()) { |
| 98 value = v8::Local<v8::Object>::Cast(value)->Get( | 97 value = v8::Local<v8::Object>::Cast(value)->Get( |
| 99 v8::String::New(components[i].c_str())); | 98 v8::String::New(components[i].c_str())); |
| 100 if (try_catch.HasCaught()) { | |
| 101 NOTREACHED() << *v8::String::AsciiValue(try_catch.Exception()); | |
| 102 return false; | |
| 103 } | |
| 104 } | 99 } |
| 105 } | 100 } |
| 106 | 101 |
| 107 if (value.IsEmpty() || !value->IsFunction()) { | 102 if (value.IsEmpty() || !value->IsFunction()) { |
| 108 VLOG(1) << "Could not execute chrome hidden method: " << function_name; | 103 VLOG(1) << "Could not execute chrome hidden method: " << function_name; |
| 109 return false; | 104 return false; |
| 110 } | 105 } |
| 111 | 106 |
| 112 v8::Handle<v8::Value> result_temp = | 107 v8::Handle<v8::Value> result_temp = |
| 113 v8::Local<v8::Function>::Cast(value)->Call(v8::Object::New(), argc, argv); | 108 v8::Local<v8::Function>::Cast(value)->Call(v8::Object::New(), argc, argv); |
| 114 if (try_catch.HasCaught()) { | |
| 115 NOTREACHED() << *v8::String::AsciiValue(try_catch.Exception()); | |
| 116 return false; | |
| 117 } | |
| 118 if (result) | 109 if (result) |
| 119 *result = result_temp; | 110 *result = result_temp; |
| 120 return true; | 111 return true; |
| 121 } | 112 } |
| 122 | 113 |
| 123 void ChromeV8Context::DispatchOnLoadEvent(bool is_extension_process, | 114 void ChromeV8Context::DispatchOnLoadEvent(bool is_extension_process, |
| 124 bool is_incognito_process) const { | 115 bool is_incognito_process) const { |
| 125 v8::HandleScope handle_scope; | 116 v8::HandleScope handle_scope; |
| 126 v8::Handle<v8::Value> argv[3]; | 117 v8::Handle<v8::Value> argv[3]; |
| 127 argv[0] = v8::String::New(extension_id_.c_str()); | 118 argv[0] = v8::String::New(extension_id_.c_str()); |
| 128 argv[1] = v8::Boolean::New(is_extension_process); | 119 argv[1] = v8::Boolean::New(is_extension_process); |
| 129 argv[2] = v8::Boolean::New(is_incognito_process); | 120 argv[2] = v8::Boolean::New(is_incognito_process); |
| 130 CallChromeHiddenMethod("dispatchOnLoad", arraysize(argv), argv, NULL); | 121 CallChromeHiddenMethod("dispatchOnLoad", arraysize(argv), argv, NULL); |
| 131 } | 122 } |
| 132 | 123 |
| 133 void ChromeV8Context::DispatchOnUnloadEvent() const { | 124 void ChromeV8Context::DispatchOnUnloadEvent() const { |
| 134 v8::HandleScope handle_scope; | 125 v8::HandleScope handle_scope; |
| 135 CallChromeHiddenMethod("dispatchOnUnload", 0, NULL, NULL); | 126 CallChromeHiddenMethod("dispatchOnUnload", 0, NULL, NULL); |
| 136 } | 127 } |
| OLD | NEW |