diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-08 18:31:20 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-07-08 18:31:20 +0000 |
commit | bd11ba32a3a9844a15ed2a0c2cf6a4140c2853ae (patch) | |
tree | 32c018c626c1b6580224fdd8ff7b2cc7aeadcbab | |
parent | 6f65cc3b4114080938c42bc1f3f55c0188f27163 (diff) | |
download | chromium_src-bd11ba32a3a9844a15ed2a0c2cf6a4140c2853ae.zip chromium_src-bd11ba32a3a9844a15ed2a0c2cf6a4140c2853ae.tar.gz chromium_src-bd11ba32a3a9844a15ed2a0c2cf6a4140c2853ae.tar.bz2 |
Add the page url to plugin crashes to aid debugging.
Review URL: http://codereview.chromium.org/149305
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20173 0039d316-1c4b-4281-b951-d872f2087c98
23 files changed, 254 insertions, 186 deletions
diff --git a/chrome/app/breakpad_win.cc b/chrome/app/breakpad_win.cc index 3f0e1ae..05e60fd 100644 --- a/chrome/app/breakpad_win.cc +++ b/chrome/app/breakpad_win.cc @@ -78,10 +78,10 @@ google_breakpad::CustomClientInfo* GetCustomInfo(const std::wstring& dll_path, google_breakpad::CustomInfoEntry plat_entry(L"plat", L"Win32"); google_breakpad::CustomInfoEntry type_entry(L"ptype", type.c_str()); - if (type == L"renderer") { - // If we're a renderer create entries for the URL. Currently we only allow - // each chunk to be 64 characters, which isn't enough for a URL. As a hack - // we create 8 entries and split the URL across the entries. + if (type == L"renderer" || type == L"plugin") { + // Create entries for the URL. Currently we only allow each chunk to be 64 + // characters, which isn't enough for a URL. As a hack we create 8 entries + // and split the URL across the entries. google_breakpad::CustomInfoEntry url1(L"url-chunk-1", L""); google_breakpad::CustomInfoEntry url2(L"url-chunk-2", L""); google_breakpad::CustomInfoEntry url3(L"url-chunk-3", L""); @@ -181,7 +181,7 @@ long WINAPI ChromeExceptionFilter(EXCEPTION_POINTERS* info) { return EXCEPTION_EXECUTE_HANDLER; } -extern "C" void __declspec(dllexport) __cdecl SetActiveRendererURL( +extern "C" void __declspec(dllexport) __cdecl SetActiveURL( const wchar_t* url_cstring) { DCHECK(url_cstring); if (!g_url_chunks) diff --git a/chrome/chrome.gyp b/chrome/chrome.gyp index 22611db..bb382c3 100644 --- a/chrome/chrome.gyp +++ b/chrome/chrome.gyp @@ -325,6 +325,10 @@ 'common/child_process_host.h', 'common/child_process_info.cc', 'common/child_process_info.h', + 'common/child_process_logging.h', + 'common/child_process_logging_linux.cc', + 'common/child_process_logging_mac.mm', + 'common/child_process_logging_win.cc', 'common/child_thread.cc', 'common/child_thread.h', 'common/chrome_constants.cc', @@ -2324,10 +2328,6 @@ 'renderer/renderer_glue.cc', 'renderer/renderer_histogram_snapshots.cc', 'renderer/renderer_histogram_snapshots.h', - 'renderer/renderer_logging.h', - 'renderer/renderer_logging_linux.cc', - 'renderer/renderer_logging_mac.mm', - 'renderer/renderer_logging_win.cc', 'renderer/renderer_main.cc', 'renderer/renderer_main_platform_delegate.h', 'renderer/renderer_main_platform_delegate_linux.cc', @@ -3589,6 +3589,7 @@ 'browser/webdata/web_database_unittest.cc', 'browser/window_sizer_unittest.cc', 'common/bzip2_unittest.cc', + 'common/child_process_logging_mac_unittest.mm', 'common/chrome_plugin_unittest.cc', 'common/extensions/extension_unittest.cc', 'common/extensions/url_pattern_unittest.cc', @@ -3620,7 +3621,6 @@ 'renderer/render_thread_unittest.cc', 'renderer/render_view_unittest.cc', 'renderer/render_widget_unittest.cc', - 'renderer/renderer_logging_mac_unittest.mm', 'renderer/renderer_main_unittest.cc', 'test/browser_with_test_window_test.cc', 'test/browser_with_test_window_test.h', diff --git a/chrome/common/child_process_logging.h b/chrome/common/child_process_logging.h new file mode 100644 index 0000000..43b34d2 --- /dev/null +++ b/chrome/common/child_process_logging.h @@ -0,0 +1,55 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_COMMON_CHILD_PROCESS_LOGGING_H_ +#define CHROME_COMMON_CHILD_PROCESS_LOGGING_H_ + +#include "base/basictypes.h" +#include "googleurl/src/gurl.h" + +namespace child_process_logging { + +// Sets the URL that is logged if the child process crashes. Use GURL() to clear +// the URL. +void SetActiveURL(const GURL& url); + +// Simple wrapper class that sets the active URL in it's constructor and clears +// the active URL in the destructor. +class ScopedActiveURLSetter { + public: + explicit ScopedActiveURLSetter(const GURL& url) { + SetActiveURL(url); + } + + ~ScopedActiveURLSetter() { + SetActiveURL(GURL()); + } + + private: + DISALLOW_COPY_AND_ASSIGN(ScopedActiveURLSetter); +}; + +} // namespace child_process_logging + +#if defined(OS_MACOSX) && __OBJC__ +// Exported for testing purposes. + +@class NSString; + +typedef void (*SetCrashKeyValueFuncPtr)(NSString*, NSString*); +typedef void (*ClearCrashKeyValueFuncPtr)(NSString*); + +namespace child_process_logging { +void SetActiveURLImpl(const GURL& url, + SetCrashKeyValueFuncPtr set_key_func, + ClearCrashKeyValueFuncPtr clear_key_func); + +extern const int kMaxNumCrashURLChunks; +extern const int kMaxNumURLChunkValueLength; +extern const char *kUrlChunkFormatStr; +} // namespace child_process_logging + +#endif // defined(OS_MACOSX) && __OBJC__ + +#endif // CHROME_COMMON_CHILD_PROCESS_LOGGING_H_ diff --git a/chrome/renderer/renderer_logging_linux.cc b/chrome/common/child_process_logging_linux.cc index 7812da1..59b16f6 100644 --- a/chrome/renderer/renderer_logging_linux.cc +++ b/chrome/common/child_process_logging_linux.cc @@ -2,23 +2,21 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/renderer/renderer_logging.h" +#include "chrome/common/child_process_logging.h" #include <string> #include "base/logging.h" #include "googleurl/src/gurl.h" -namespace renderer_logging { +namespace child_process_logging { // We use a static string to hold the most recent active url. If we crash, the // crash handler code will send the contents of this string to the browser. std::string active_url; -// Sets the URL that is logged if the renderer crashes. Use GURL() to clear -// the URL. -void SetActiveRendererURL(const GURL& url) { +void SetActiveURL(const GURL& url) { active_url = url.possibly_invalid_spec(); } -} // namespace renderer_logging +} // namespace child_process_logging diff --git a/chrome/renderer/renderer_logging_mac.mm b/chrome/common/child_process_logging_mac.mm index bb0ea92..a05b79d 100644 --- a/chrome/renderer/renderer_logging_mac.mm +++ b/chrome/common/child_process_logging_mac.mm @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/renderer/renderer_logging.h" +#include "chrome/common/child_process_logging.h" #import <Foundation/Foundation.h> @@ -10,15 +10,15 @@ #include "googleurl/src/gurl.h" #import "chrome/app/breakpad_mac.h" -namespace renderer_logging { +namespace child_process_logging { const int kMaxNumCrashURLChunks = 8; const int kMaxNumURLChunkValueLength = 255; const char *kUrlChunkFormatStr = "url-chunk-%d"; -void SetActiveRendererURLImpl(const GURL& url, - SetCrashKeyValueFuncPtr set_key_func, - ClearCrashKeyValueFuncPtr clear_key_func) { +void SetActiveURLImpl(const GURL& url, + SetCrashKeyValueFuncPtr set_key_func, + ClearCrashKeyValueFuncPtr clear_key_func) { NSString *kUrlChunkFormatStr_utf8 = [NSString stringWithUTF8String:kUrlChunkFormatStr]; @@ -59,13 +59,13 @@ void SetActiveRendererURLImpl(const GURL& url, } } -void SetActiveRendererURL(const GURL& url) { +void SetActiveURL(const GURL& url) { // If Breakpad isn't initialized then bail. if (IsCrashReporterDisabled()) { return; } - SetActiveRendererURLImpl(url, SetCrashKeyValue, ClearCrashKeyValue); + SetActiveURLImpl(url, SetCrashKeyValue, ClearCrashKeyValue); } -} // namespace renderer_logging +} // namespace child_process_logging diff --git a/chrome/renderer/renderer_logging_mac_unittest.mm b/chrome/common/child_process_logging_mac_unittest.mm index 6aece64..276f19b 100644 --- a/chrome/renderer/renderer_logging_mac_unittest.mm +++ b/chrome/common/child_process_logging_mac_unittest.mm @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/renderer/renderer_logging.h" +#include "chrome/common/child_process_logging.h" #import <Foundation/Foundation.h> @@ -10,7 +10,7 @@ #include "testing/gtest/include/gtest/gtest.h" #include "testing/platform_test.h" -typedef PlatformTest RendererLoggingTest; +typedef PlatformTest ChildProcessLoggingTest; namespace { @@ -48,9 +48,9 @@ class MockBreakpadKeyValueStore { } bool VerifyDictionaryContents(const std::string &url) { - using renderer_logging::kMaxNumCrashURLChunks; - using renderer_logging::kMaxNumURLChunkValueLength; - using renderer_logging::kUrlChunkFormatStr; + using child_process_logging::kMaxNumCrashURLChunks; + using child_process_logging::kMaxNumURLChunkValueLength; + using child_process_logging::kUrlChunkFormatStr; int num_url_chunks = CountDictionaryEntries(); EXPECT_TRUE(num_url_chunks <= kMaxNumCrashURLChunks); @@ -80,21 +80,21 @@ class MockBreakpadKeyValueStore { } // namespace -// Call through to SetActiveRendererURLImpl using the functions from +// Call through to SetActiveURLImpl using the functions from // MockBreakpadKeyValueStore. -void SetActiveRendererURLWithMock(const GURL& url) { - using renderer_logging::SetActiveRendererURLImpl; +void SetActiveURLWithMock(const GURL& url) { + using child_process_logging::SetActiveURLImpl; SetCrashKeyValueFuncPtr setFunc = MockBreakpadKeyValueStore::SetKeyValue; ClearCrashKeyValueFuncPtr clearFunc = MockBreakpadKeyValueStore::ClearKeyValue; - SetActiveRendererURLImpl(url, setFunc, clearFunc); + SetActiveURLImpl(url, setFunc, clearFunc); } -TEST_F(RendererLoggingTest, TestUrlSplitting) { - using renderer_logging::kMaxNumCrashURLChunks; - using renderer_logging::kMaxNumURLChunkValueLength; +TEST_F(ChildProcessLoggingTest, TestUrlSplitting) { + using child_process_logging::kMaxNumCrashURLChunks; + using child_process_logging::kMaxNumURLChunkValueLength; const std::string short_url("http://abc/"); std::string long_url("http://"); @@ -110,29 +110,29 @@ TEST_F(RendererLoggingTest, TestUrlSplitting) { // Check that Clearing NULL URL works. MockBreakpadKeyValueStore mock; - SetActiveRendererURLWithMock(GURL()); + SetActiveURLWithMock(GURL()); EXPECT_EQ(mock.CountDictionaryEntries(), 0); // Check that we can set a URL. - SetActiveRendererURLWithMock(GURL(short_url.c_str())); + SetActiveURLWithMock(GURL(short_url.c_str())); EXPECT_TRUE(mock.VerifyDictionaryContents(short_url)); EXPECT_EQ(mock.CountDictionaryEntries(), 1); - SetActiveRendererURLWithMock(GURL()); + SetActiveURLWithMock(GURL()); EXPECT_EQ(mock.CountDictionaryEntries(), 0); // Check that we can replace a long url with a short url. - SetActiveRendererURLWithMock(GURL(long_url.c_str())); + SetActiveURLWithMock(GURL(long_url.c_str())); EXPECT_TRUE(mock.VerifyDictionaryContents(long_url)); - SetActiveRendererURLWithMock(GURL(short_url.c_str())); + SetActiveURLWithMock(GURL(short_url.c_str())); EXPECT_TRUE(mock.VerifyDictionaryContents(short_url)); - SetActiveRendererURLWithMock(GURL()); + SetActiveURLWithMock(GURL()); EXPECT_EQ(mock.CountDictionaryEntries(), 0); // Check that overflow works correctly. - SetActiveRendererURLWithMock(GURL(overflow_url.c_str())); + SetActiveURLWithMock(GURL(overflow_url.c_str())); EXPECT_TRUE(mock.VerifyDictionaryContents( overflow_url.substr(0, max_num_chars_stored_in_dump))); - SetActiveRendererURLWithMock(GURL()); + SetActiveURLWithMock(GURL()); EXPECT_EQ(mock.CountDictionaryEntries(), 0); } diff --git a/chrome/common/child_process_logging_win.cc b/chrome/common/child_process_logging_win.cc new file mode 100644 index 0000000..2221713 --- /dev/null +++ b/chrome/common/child_process_logging_win.cc @@ -0,0 +1,31 @@ +// Copyright (c) 2009 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/common/child_process_logging.h" + +#include <windows.h> + +#include "base/string_util.h" +#include "chrome/common/chrome_constants.h" +#include "googleurl/src/gurl.h" + +namespace child_process_logging { + +typedef void (__cdecl *MainSetActiveURL)(const wchar_t*); + +void SetActiveURL(const GURL& url) { + HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName); + if (!exe_module) + return; + + MainSetActiveURL set_active_url = + reinterpret_cast<MainSetActiveURL>( + GetProcAddress(exe_module, "SetActiveURL")); + if (!set_active_url) + return; + + (set_active_url)(UTF8ToWide(url.possibly_invalid_spec()).c_str()); +} + +} // namespace child_process_logging diff --git a/chrome/common/plugin_messages.h b/chrome/common/plugin_messages.h index 111a7db..3b43b8b 100644 --- a/chrome/common/plugin_messages.h +++ b/chrome/common/plugin_messages.h @@ -32,6 +32,7 @@ struct PluginMsg_Init_Params { gfx::NativeViewId containing_window; GURL url; + GURL page_url; std::vector<std::string> arg_names; std::vector<std::string> arg_values; #if defined(OS_WIN) @@ -109,6 +110,7 @@ struct ParamTraits<PluginMsg_Init_Params> { static void Write(Message* m, const param_type& p) { WriteParam(m, p.containing_window); WriteParam(m, p.url); + WriteParam(m, p.page_url); DCHECK(p.arg_names.size() == p.arg_values.size()); WriteParam(m, p.arg_names); WriteParam(m, p.arg_values); @@ -120,6 +122,7 @@ struct ParamTraits<PluginMsg_Init_Params> { static bool Read(const Message* m, void** iter, param_type* p) { return ReadParam(m, iter, &p->containing_window) && ReadParam(m, iter, &p->url) && + ReadParam(m, iter, &p->page_url) && ReadParam(m, iter, &p->arg_names) && ReadParam(m, iter, &p->arg_values) && #if defined(OS_WIN) @@ -133,6 +136,8 @@ struct ParamTraits<PluginMsg_Init_Params> { l->append(L", "); LogParam(p.url, l); l->append(L", "); + LogParam(p.page_url, l); + l->append(L", "); LogParam(p.arg_names, l); l->append(L", "); LogParam(p.arg_values, l); diff --git a/chrome/plugin/npobject_proxy.cc b/chrome/plugin/npobject_proxy.cc index f56832a..acb3cc5 100644 --- a/chrome/plugin/npobject_proxy.cc +++ b/chrome/plugin/npobject_proxy.cc @@ -49,11 +49,13 @@ NPObjectProxy::NPObjectProxy( PluginChannelBase* channel, int route_id, intptr_t npobject_ptr, - base::WaitableEvent* modal_dialog_event) + base::WaitableEvent* modal_dialog_event, + const GURL& page_url) : channel_(channel), route_id_(route_id), npobject_ptr_(npobject_ptr), - modal_dialog_event_(modal_dialog_event) { + modal_dialog_event_(modal_dialog_event), + page_url_(page_url) { channel_->AddRoute(route_id, this, true); } @@ -68,11 +70,12 @@ NPObjectProxy::~NPObjectProxy() { NPObject* NPObjectProxy::Create(PluginChannelBase* channel, int route_id, intptr_t npobject_ptr, - base::WaitableEvent* modal_dialog_event) { + base::WaitableEvent* modal_dialog_event, + const GURL& page_url) { NPObjectWrapper* obj = reinterpret_cast<NPObjectWrapper*>( NPN_CreateObject(0, &npclass_proxy_)); obj->proxy = new NPObjectProxy( - channel, route_id, npobject_ptr, modal_dialog_event); + channel, route_id, npobject_ptr, modal_dialog_event, page_url); return reinterpret_cast<NPObject*>(obj); } @@ -166,7 +169,8 @@ bool NPObjectProxy::NPInvokePrivate(NPP npp, for (unsigned int i = 0; i < arg_count; ++i) { NPVariant_Param param; CreateNPVariantParam( - args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_); + args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_, + proxy->page_url_); args_param.push_back(param); } @@ -193,7 +197,8 @@ bool NPObjectProxy::NPInvokePrivate(NPP npp, return false; CreateNPVariant( - param_result, channel_copy, np_result, modal_dialog_event_handle); + param_result, channel_copy, np_result, modal_dialog_event_handle, + proxy->page_url_); return true; } @@ -251,7 +256,8 @@ bool NPObjectProxy::NPGetProperty(NPObject *obj, return false; CreateNPVariant( - param, channel.get(), np_result, modal_dialog_event_handle); + param, channel.get(), np_result, modal_dialog_event_handle, + proxy->page_url_); return true; } @@ -271,7 +277,7 @@ bool NPObjectProxy::NPSetProperty(NPObject *obj, NPVariant_Param value_param; CreateNPVariantParam( *value, proxy->channel(), &value_param, false, - proxy->modal_dialog_event_); + proxy->modal_dialog_event_, proxy->page_url_); proxy->Send(new NPObjectMsg_SetProperty( proxy->route_id(), name_param, value_param, &result)); @@ -358,7 +364,8 @@ bool NPObjectProxy::NPNConstruct(NPObject *obj, for (unsigned int i = 0; i < arg_count; ++i) { NPVariant_Param param; CreateNPVariantParam( - args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_); + args[i], channel_copy, ¶m, false, proxy->modal_dialog_event_, + proxy->page_url_); args_param.push_back(param); } @@ -380,7 +387,8 @@ bool NPObjectProxy::NPNConstruct(NPObject *obj, return false; CreateNPVariant( - param_result, channel_copy, np_result, modal_dialog_event_handle); + param_result, channel_copy, np_result, modal_dialog_event_handle, + proxy->page_url_); return true; } @@ -425,7 +433,8 @@ bool NPObjectProxy::NPNEvaluate(NPP npp, return false; CreateNPVariant( - result_param, channel.get(), result_var, modal_dialog_event_handle); + result_param, channel.get(), result_var, modal_dialog_event_handle, + proxy->page_url_); return true; } diff --git a/chrome/plugin/npobject_proxy.h b/chrome/plugin/npobject_proxy.h index 3cdae9e..afeb207 100644 --- a/chrome/plugin/npobject_proxy.h +++ b/chrome/plugin/npobject_proxy.h @@ -10,6 +10,7 @@ #include "base/ref_counted.h" #include "chrome/common/ipc_channel.h" +#include "googleurl/src/gurl.h" #include "third_party/npapi/bindings/npruntime.h" class PluginChannelBase; @@ -36,7 +37,8 @@ class NPObjectProxy : public IPC::Channel::Listener, static NPObject* Create(PluginChannelBase* channel, int route_id, intptr_t npobject_ptr, - base::WaitableEvent* modal_dialog_event); + base::WaitableEvent* modal_dialog_event, + const GURL& page_url); // IPC::Message::Sender implementation: bool Send(IPC::Message* msg); @@ -101,7 +103,8 @@ class NPObjectProxy : public IPC::Channel::Listener, NPObjectProxy(PluginChannelBase* channel, int route_id, intptr_t npobject_ptr, - base::WaitableEvent* modal_dialog_event); + base::WaitableEvent* modal_dialog_event, + const GURL& page_url); // IPC::Channel::Listener implementation: void OnMessageReceived(const IPC::Message& msg); @@ -118,6 +121,9 @@ class NPObjectProxy : public IPC::Channel::Listener, int route_id_; intptr_t npobject_ptr_; base::WaitableEvent* modal_dialog_event_; + + // The url of the main frame hosting the plugin. + GURL page_url_; }; #endif // CHROME_PLUGIN_NPOBJECT_PROXY_H_ diff --git a/chrome/plugin/npobject_stub.cc b/chrome/plugin/npobject_stub.cc index c5f14f5..4345d37 100644 --- a/chrome/plugin/npobject_stub.cc +++ b/chrome/plugin/npobject_stub.cc @@ -4,6 +4,7 @@ #include "chrome/plugin/npobject_stub.h" +#include "chrome/common/child_process_logging.h" #include "chrome/common/plugin_messages.h" #include "chrome/plugin/npobject_util.h" #include "chrome/plugin/plugin_channel_base.h" @@ -15,13 +16,15 @@ NPObjectStub::NPObjectStub( NPObject* npobject, PluginChannelBase* channel, int route_id, - base::WaitableEvent* modal_dialog_event) + base::WaitableEvent* modal_dialog_event, + const GURL& page_url) : npobject_(npobject), channel_(channel), route_id_(route_id), valid_(true), web_plugin_delegate_proxy_(NULL), - modal_dialog_event_(modal_dialog_event) { + modal_dialog_event_(modal_dialog_event), + page_url_(page_url) { channel_->AddRoute(route_id, this, true); // We retain the object just as PluginHost does if everything was in-process. @@ -42,6 +45,8 @@ bool NPObjectStub::Send(IPC::Message* msg) { } void NPObjectStub::OnMessageReceived(const IPC::Message& msg) { + child_process_logging::ScopedActiveURLSetter url_setter(page_url_); + if (!valid_) { if (msg.is_sync()) { // The object could be garbage because the frame has gone away, so @@ -117,7 +122,8 @@ void NPObjectStub::OnInvoke(bool is_default, NPVariant* args_var = new NPVariant[arg_count]; for (int i = 0; i < arg_count; ++i) { CreateNPVariant( - args[i], local_channel, &(args_var[i]), modal_dialog_event_); + args[i], local_channel, &(args_var[i]), modal_dialog_event_, + page_url_); } if (is_default) { @@ -153,7 +159,8 @@ void NPObjectStub::OnInvoke(bool is_default, delete[] args_var; CreateNPVariantParam( - result_var, local_channel, &result_param, true, modal_dialog_event_); + result_var, local_channel, &result_param, true, modal_dialog_event_, + page_url_); NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value); local_channel->Send(reply_msg); } @@ -190,7 +197,7 @@ void NPObjectStub::OnGetProperty(const NPIdentifier_Param& name, } CreateNPVariantParam( - result_var, channel_, property, true, modal_dialog_event_); + result_var, channel_, property, true, modal_dialog_event_, page_url_); } void NPObjectStub::OnSetProperty(const NPIdentifier_Param& name, @@ -200,7 +207,8 @@ void NPObjectStub::OnSetProperty(const NPIdentifier_Param& name, VOID_TO_NPVARIANT(result_var); NPIdentifier id = CreateNPIdentifier(name); NPVariant property_var; - CreateNPVariant(property, channel_, &property_var, modal_dialog_event_); + CreateNPVariant( + property, channel_, &property_var, modal_dialog_event_, page_url_); if (IsPluginProcess()) { if (npobject_->_class->setProperty) { @@ -281,7 +289,7 @@ void NPObjectStub::OnConstruct(const std::vector<NPVariant_Param>& args, NPVariant* args_var = new NPVariant[arg_count]; for (int i = 0; i < arg_count; ++i) { CreateNPVariant( - args[i], local_channel, &(args_var[i]), modal_dialog_event_); + args[i], local_channel, &(args_var[i]), modal_dialog_event_, page_url_); } if (IsPluginProcess()) { @@ -302,7 +310,8 @@ void NPObjectStub::OnConstruct(const std::vector<NPVariant_Param>& args, delete[] args_var; CreateNPVariantParam( - result_var, local_channel, &result_param, true, modal_dialog_event_); + result_var, local_channel, &result_param, true, modal_dialog_event_, + page_url_); NPObjectMsg_Invoke::WriteReplyParams(reply_msg, result_param, return_value); local_channel->Send(reply_msg); } @@ -331,7 +340,8 @@ void NPObjectStub::OnEvaluate(const std::string& script, NPVariant_Param result_param; CreateNPVariantParam( - result_var, local_channel, &result_param, true, modal_dialog_event_); + result_var, local_channel, &result_param, true, modal_dialog_event_, + page_url_); NPObjectMsg_Evaluate::WriteReplyParams(reply_msg, result_param, return_value); local_channel->Send(reply_msg); } diff --git a/chrome/plugin/npobject_stub.h b/chrome/plugin/npobject_stub.h index 94bf2b1..acfd7727 100644 --- a/chrome/plugin/npobject_stub.h +++ b/chrome/plugin/npobject_stub.h @@ -12,6 +12,7 @@ #include "base/ref_counted.h" #include "chrome/common/ipc_channel.h" +#include "googleurl/src/gurl.h" namespace base { class WaitableEvent; @@ -32,7 +33,8 @@ class NPObjectStub : public IPC::Channel::Listener, NPObjectStub(NPObject* npobject, PluginChannelBase* channel, int route_id, - base::WaitableEvent* modal_dialog_event); + base::WaitableEvent* modal_dialog_event, + const GURL& page_url); ~NPObjectStub(); // IPC::Message::Sender implementation: @@ -90,6 +92,9 @@ class NPObjectStub : public IPC::Channel::Listener, WebPluginDelegateProxy* web_plugin_delegate_proxy_; base::WaitableEvent* modal_dialog_event_; + + // The url of the main frame hosting the plugin. + GURL page_url_; }; #endif // CHROME_PLUGIN_NPOBJECT_STUB_H_ diff --git a/chrome/plugin/npobject_util.cc b/chrome/plugin/npobject_util.cc index ececfa2..ecf5606 100644 --- a/chrome/plugin/npobject_util.cc +++ b/chrome/plugin/npobject_util.cc @@ -138,7 +138,8 @@ void CreateNPVariantParam(const NPVariant& variant, PluginChannelBase* channel, NPVariant_Param* param, bool release, - base::WaitableEvent* modal_dialog_event) { + base::WaitableEvent* modal_dialog_event, + const GURL& page_url) { switch (variant.type) { case NPVariantType_Void: param->type = NPVARIANT_PARAM_VOID; @@ -183,7 +184,8 @@ void CreateNPVariantParam(const NPVariant& variant, param->type = NPVARIANT_PARAM_OBJECT_ROUTING_ID; int route_id = channel->GenerateRouteID(); new NPObjectStub( - variant.value.objectValue, channel, route_id, modal_dialog_event); + variant.value.objectValue, channel, route_id, modal_dialog_event, + page_url); param->npobject_routing_id = route_id; param->npobject_pointer = reinterpret_cast<intptr_t>(variant.value.objectValue); @@ -204,7 +206,8 @@ void CreateNPVariantParam(const NPVariant& variant, void CreateNPVariant(const NPVariant_Param& param, PluginChannelBase* channel, NPVariant* result, - base::WaitableEvent* modal_dialog_event) { + base::WaitableEvent* modal_dialog_event, + const GURL& page_url) { switch (param.type) { case NPVARIANT_PARAM_VOID: result->type = NPVariantType_Void; @@ -237,7 +240,8 @@ void CreateNPVariant(const NPVariant_Param& param, NPObjectProxy::Create(channel, param.npobject_routing_id, param.npobject_pointer, - modal_dialog_event); + modal_dialog_event, + page_url); break; case NPVARIANT_PARAM_OBJECT_POINTER: result->type = NPVariantType_Object; diff --git a/chrome/plugin/npobject_util.h b/chrome/plugin/npobject_util.h index 9a2907b..861d591 100644 --- a/chrome/plugin/npobject_util.h +++ b/chrome/plugin/npobject_util.h @@ -15,12 +15,15 @@ #include "chrome/plugin/npobject_stub.h" -struct _NPVariant; -typedef _NPVariant NPVariant; +class GURL; class NPObjectProxy; class PluginChannelBase; + +struct _NPVariant; struct NPIdentifier_Param; struct NPVariant_Param; + +typedef _NPVariant NPVariant; typedef void *NPIdentifier; namespace base { @@ -50,13 +53,15 @@ void CreateNPVariantParam(const NPVariant& variant, PluginChannelBase* channel, NPVariant_Param* param, bool release, - base::WaitableEvent* modal_dialog_event); + base::WaitableEvent* modal_dialog_event, + const GURL& page_url); // Creates an NPVariant from the marshalled object. void CreateNPVariant(const NPVariant_Param& param, PluginChannelBase* channel, NPVariant* result, - base::WaitableEvent* modal_dialog_event); + base::WaitableEvent* modal_dialog_event, + const GURL& page_url); #if defined(OS_WIN) // Given a plugin's HWND, returns an event associated with the TabContents diff --git a/chrome/plugin/webplugin_delegate_stub.cc b/chrome/plugin/webplugin_delegate_stub.cc index 3bfd002..4d18012 100644 --- a/chrome/plugin/webplugin_delegate_stub.cc +++ b/chrome/plugin/webplugin_delegate_stub.cc @@ -7,6 +7,7 @@ #include "build/build_config.h" #include "base/command_line.h" +#include "chrome/common/child_process_logging.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/plugin_messages.h" #include "chrome/plugin/npobject_stub.h" @@ -49,6 +50,8 @@ WebPluginDelegateStub::WebPluginDelegateStub( } WebPluginDelegateStub::~WebPluginDelegateStub() { + child_process_logging::ScopedActiveURLSetter url_setter(page_url_); + if (channel_->in_send()) { // The delegate or an npobject is in the callstack, so don't delete it // right away. @@ -64,6 +67,8 @@ WebPluginDelegateStub::~WebPluginDelegateStub() { } void WebPluginDelegateStub::OnMessageReceived(const IPC::Message& msg) { + child_process_logging::ScopedActiveURLSetter url_setter(page_url_); + // A plugin can execute a script to delete itself in any of its NPP methods. // Hold an extra reference to ourself so that if this does occur and we're // handling a sync message, we don't crash when attempting to send a reply. @@ -110,6 +115,9 @@ bool WebPluginDelegateStub::Send(IPC::Message* msg) { void WebPluginDelegateStub::OnInit(const PluginMsg_Init_Params& params, bool* result) { + page_url_ = params.page_url; + child_process_logging::ScopedActiveURLSetter url_setter(page_url_); + *result = false; int argc = static_cast<int>(params.arg_names.size()); if (argc != static_cast<int>(params.arg_values.size())) { @@ -139,7 +147,8 @@ void WebPluginDelegateStub::OnInit(const PluginMsg_Init_Params& params, delegate_ = WebPluginDelegate::Create(path, mime_type_, parent); if (delegate_) { - webplugin_ = new WebPluginProxy(channel_, instance_id_, delegate_); + webplugin_ = new WebPluginProxy( + channel_, instance_id_, delegate_, page_url_); #if defined(OS_WIN) if (!webplugin_->SetModalDialogEvent(params.modal_dialog_event)) return; @@ -278,7 +287,8 @@ void WebPluginDelegateStub::OnGetPluginScriptableObject(int* route_id, // The stub will delete itself when the proxy tells it that it's released, or // otherwise when the channel is closed. new NPObjectStub( - object, channel_.get(), *route_id, webplugin_->modal_dialog_event()); + object, channel_.get(), *route_id, webplugin_->modal_dialog_event(), + page_url_); // Release ref added by GetPluginScriptableObject (our stub holds its own). NPN_ReleaseObject(object); diff --git a/chrome/plugin/webplugin_delegate_stub.h b/chrome/plugin/webplugin_delegate_stub.h index b09038c..10ac7a4 100644 --- a/chrome/plugin/webplugin_delegate_stub.h +++ b/chrome/plugin/webplugin_delegate_stub.h @@ -13,9 +13,9 @@ #include "base/task.h" #include "chrome/common/ipc_channel.h" #include "chrome/common/transport_dib.h" +#include "googleurl/src/gurl.h" #include "third_party/npapi/bindings/npapi.h" -class GURL; class PluginChannel; class WebPluginProxy; class WebPluginDelegate; @@ -105,6 +105,9 @@ class WebPluginDelegateStub : public IPC::Channel::Listener, WebPluginDelegate* delegate_; WebPluginProxy* webplugin_; + // The url of the main frame hosting the plugin. + GURL page_url_; + DISALLOW_IMPLICIT_CONSTRUCTORS(WebPluginDelegateStub); }; diff --git a/chrome/plugin/webplugin_proxy.cc b/chrome/plugin/webplugin_proxy.cc index 3d6a6ac..b2fe778 100644 --- a/chrome/plugin/webplugin_proxy.cc +++ b/chrome/plugin/webplugin_proxy.cc @@ -13,6 +13,7 @@ #include "base/singleton.h" #include "base/waitable_event.h" #include "build/build_config.h" +#include "chrome/common/child_process_logging.h" #include "chrome/common/plugin_messages.h" #include "chrome/common/url_constants.h" #include "chrome/plugin/npobject_proxy.h" @@ -35,7 +36,8 @@ static ContextMap& GetContextMap() { WebPluginProxy::WebPluginProxy( PluginChannel* channel, int route_id, - WebPluginDelegate* delegate) + WebPluginDelegate* delegate, + const GURL& page_url) : channel_(channel), route_id_(route_id), cp_browsing_context_(0), @@ -43,6 +45,7 @@ WebPluginProxy::WebPluginProxy( plugin_element_(NULL), delegate_(delegate), waiting_for_paint_(false), + page_url_(page_url), ALLOW_THIS_IN_INITIALIZER_LIST(runnable_method_factory_(this)) { } @@ -159,10 +162,9 @@ NPObject* WebPluginProxy::GetWindowScriptNPObject() { if (!success) return NULL; - window_npobject_ = NPObjectProxy::Create(channel_, - npobject_route_id, - npobject_ptr, - modal_dialog_event_.get()); + window_npobject_ = NPObjectProxy::Create( + channel_, npobject_route_id, npobject_ptr, modal_dialog_event_.get(), + page_url_); return window_npobject_; } @@ -179,10 +181,9 @@ NPObject* WebPluginProxy::GetPluginElement() { if (!success) return NULL; - plugin_element_ = NPObjectProxy::Create(channel_, - npobject_route_id, - npobject_ptr, - modal_dialog_event_.get()); + plugin_element_ = NPObjectProxy::Create( + channel_, npobject_route_id, npobject_ptr, modal_dialog_event_.get(), + page_url_); return plugin_element_; } @@ -518,6 +519,8 @@ void WebPluginProxy::InitiateHTTPRangeRequest(const char* url, } void WebPluginProxy::OnPaint(const gfx::Rect& damaged_rect) { + child_process_logging::ScopedActiveURLSetter url_setter(page_url_); + Paint(damaged_rect); Send(new PluginHostMsg_InvalidateRect(route_id_, damaged_rect)); } diff --git a/chrome/plugin/webplugin_proxy.h b/chrome/plugin/webplugin_proxy.h index 0388514..103be5c 100644 --- a/chrome/plugin/webplugin_proxy.h +++ b/chrome/plugin/webplugin_proxy.h @@ -16,6 +16,7 @@ #include "chrome/common/ipc_message.h" #include "chrome/common/chrome_plugin_api.h" #include "chrome/common/transport_dib.h" +#include "googleurl/src/gurl.h" #include "webkit/glue/webplugin.h" namespace base { @@ -33,7 +34,8 @@ class WebPluginProxy : public WebPlugin { // marshalled WebPlugin calls. WebPluginProxy(PluginChannel* channel, int route_id, - WebPluginDelegate* delegate); + WebPluginDelegate* delegate, + const GURL& page_url); ~WebPluginProxy(); // WebPlugin overrides @@ -156,6 +158,8 @@ class WebPluginProxy : public WebPlugin { gfx::Rect damaged_rect_; bool waiting_for_paint_; scoped_ptr<base::WaitableEvent> modal_dialog_event_; + // The url of the main frame hosting the plugin. + GURL page_url_; #if defined(OS_WIN) // Variables used for desynchronized windowless plugin painting. See note in diff --git a/chrome/renderer/render_view.cc b/chrome/renderer/render_view.cc index c960798..d94f484 100644 --- a/chrome/renderer/render_view.cc +++ b/chrome/renderer/render_view.cc @@ -23,6 +23,7 @@ #include "base/string_util.h" #include "build/build_config.h" #include "chrome/common/bindings_policy.h" +#include "chrome/common/child_process_logging.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/jstemplate_builder.h" @@ -42,7 +43,6 @@ #include "chrome/renderer/navigation_state.h" #include "chrome/renderer/print_web_view_helper.h" #include "chrome/renderer/render_process.h" -#include "chrome/renderer/renderer_logging.h" #include "chrome/renderer/user_script_slave.h" #include "chrome/renderer/visitedlink_slave.h" #include "chrome/renderer/webplugin_delegate_proxy.h" @@ -325,7 +325,7 @@ void RenderView::Init(gfx::NativeViewId parent_hwnd, void RenderView::OnMessageReceived(const IPC::Message& message) { WebFrame* main_frame = webview() ? webview()->GetMainFrame() : NULL; - renderer_logging::ScopedActiveRenderingURLSetter url_setter( + child_process_logging::ScopedActiveURLSetter url_setter( main_frame ? main_frame->GetURL() : GURL()); // If this is developer tools renderer intercept tools messages first. @@ -626,7 +626,7 @@ void RenderView::OnNavigate(const ViewMsg_Navigate_Params& params) { if (!webview()) return; - renderer_logging::ScopedActiveRenderingURLSetter url_setter(params.url); + child_process_logging::ScopedActiveURLSetter url_setter(params.url); AboutHandler::MaybeHandle(params.url); diff --git a/chrome/renderer/renderer_logging.h b/chrome/renderer/renderer_logging.h deleted file mode 100644 index d7c91a5..0000000 --- a/chrome/renderer/renderer_logging.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_RENDERER_RENDERER_LOGGING_H_ -#define CHROME_RENDERER_RENDERER_LOGGING_H_ - -#include "base/basictypes.h" -#include "googleurl/src/gurl.h" - -namespace renderer_logging { - -// Sets the URL that is logged if the renderer crashes. Use GURL() to clear -// the URL. -void SetActiveRendererURL(const GURL& url); - -// Simple wrapper class that sets the active rendering URL in it's constructor -// and clears the active rendering URL in the destructor. -class ScopedActiveRenderingURLSetter { - public: - explicit ScopedActiveRenderingURLSetter(const GURL& url) { - SetActiveRendererURL(url); - } - - ~ScopedActiveRenderingURLSetter() { - SetActiveRendererURL(GURL()); - } - - private: - DISALLOW_COPY_AND_ASSIGN(ScopedActiveRenderingURLSetter); -}; - -} // namespace renderer_logging - -#if defined(OS_MACOSX) && __OBJC__ -// Exported for testing purposes. - -@class NSString; - -typedef void (*SetCrashKeyValueFuncPtr)(NSString*, NSString*); -typedef void (*ClearCrashKeyValueFuncPtr)(NSString*); - -namespace renderer_logging { -void SetActiveRendererURLImpl(const GURL& url, - SetCrashKeyValueFuncPtr set_key_func, - ClearCrashKeyValueFuncPtr clear_key_func); - -extern const int kMaxNumCrashURLChunks; -extern const int kMaxNumURLChunkValueLength; -extern const char *kUrlChunkFormatStr; -} // namespace renderer_logging - -#endif // defined(OS_MACOSX) && __OBJC__ - -#endif // CHROME_RENDERER_RENDERER_LOGGING_H_ diff --git a/chrome/renderer/renderer_logging_win.cc b/chrome/renderer/renderer_logging_win.cc deleted file mode 100644 index 6d1b758..0000000 --- a/chrome/renderer/renderer_logging_win.cc +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) 2009 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/renderer/renderer_logging.h" - -#include <windows.h> - -#include "base/string_util.h" -#include "chrome/common/chrome_constants.h" -#include "googleurl/src/gurl.h" - -namespace renderer_logging { - -typedef void (__cdecl *MainSetActiveRendererURL)(const wchar_t*); - -// Sets the URL that is logged if the renderer crashes. Use GURL() to clear -// the URL. -void SetActiveRendererURL(const GURL& url) { - HMODULE exe_module = GetModuleHandle(chrome::kBrowserProcessExecutableName); - if (!exe_module) - return; - - MainSetActiveRendererURL set_active_renderer_url = - reinterpret_cast<MainSetActiveRendererURL>( - GetProcAddress(exe_module, "SetActiveRendererURL")); - if (!set_active_renderer_url) - return; - - (set_active_renderer_url)(UTF8ToWide(url.possibly_invalid_spec()).c_str()); -} - -} // namespace renderer_logging diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc index ad70db1..e7650a7 100644 --- a/chrome/renderer/webplugin_delegate_proxy.cc +++ b/chrome/renderer/webplugin_delegate_proxy.cc @@ -19,6 +19,7 @@ #include "base/gfx/size.h" #include "base/gfx/native_widget_types.h" #include "chrome/app/chrome_dll_resource.h" +#include "chrome/common/child_process_logging.h" #include "chrome/common/plugin_messages.h" #include "chrome/common/render_messages.h" #include "chrome/plugin/npobject_proxy.h" @@ -26,7 +27,6 @@ #include "chrome/plugin/npobject_util.h" #include "chrome/renderer/render_thread.h" #include "chrome/renderer/render_view.h" -#include "googleurl/src/gurl.h" #include "grit/generated_resources.h" #include "net/base/mime_util.h" #include "printing/native_metafile.h" @@ -170,7 +170,8 @@ WebPluginDelegateProxy::WebPluginDelegateProxy(const std::string& mime_type, window_script_object_(NULL), sad_plugin_(NULL), invalidate_pending_(false), - transparent_(false) { + transparent_(false), + page_url_(render_view_->webview()->GetMainFrame()->GetURL()) { } WebPluginDelegateProxy::~WebPluginDelegateProxy() { @@ -245,6 +246,7 @@ bool WebPluginDelegateProxy::Initialize(const GURL& url, char** argn, PluginMsg_Init_Params params; params.containing_window = render_view_->host_window(); params.url = url; + params.page_url = page_url_; for (int i = 0; i < argc; ++i) { params.arg_names.push_back(argn[i]); params.arg_values.push_back(argv[i]); @@ -329,6 +331,8 @@ void WebPluginDelegateProxy::InstallMissingPlugin() { } void WebPluginDelegateProxy::OnMessageReceived(const IPC::Message& msg) { + child_process_logging::ScopedActiveURLSetter url_setter(page_url_); + IPC_BEGIN_MESSAGE_MAP(WebPluginDelegateProxy, msg) IPC_MESSAGE_HANDLER(PluginHostMsg_SetWindow, OnSetWindow) #if defined(OS_LINUX) @@ -608,7 +612,7 @@ NPObject* WebPluginDelegateProxy::GetPluginScriptableObject() { npobject_ = NPObjectProxy::Create( channel_host_.get(), route_id, npobject_ptr, - render_view_->modal_dialog_event()); + render_view_->modal_dialog_event(), page_url_); return NPN_RetainObject(npobject_); } @@ -698,7 +702,7 @@ void WebPluginDelegateProxy::OnGetWindowScriptNPObject( // otherwise when the channel is closed. NPObjectStub* stub = new NPObjectStub( npobject, channel_host_.get(), route_id, - render_view_->modal_dialog_event()); + render_view_->modal_dialog_event(), page_url_); window_script_object_ = stub; window_script_object_->set_proxy(this); *success = true; @@ -718,7 +722,7 @@ void WebPluginDelegateProxy::OnGetPluginElement( // otherwise when the channel is closed. new NPObjectStub( npobject, channel_host_.get(), route_id, - render_view_->modal_dialog_event()); + render_view_->modal_dialog_event(), page_url_); *success = true; *npobject_ptr = reinterpret_cast<intptr_t>(npobject); } @@ -809,7 +813,8 @@ void WebPluginDelegateProxy::OnGetDragData(const NPVariant_Param& object, for (size_t i = 0; i < arraysize(results); ++i) { values->push_back(NPVariant_Param()); - CreateNPVariantParam(results[i], NULL, &values->back(), false, NULL); + CreateNPVariantParam( + results[i], NULL, &values->back(), false, NULL, page_url_); } *success = true; diff --git a/chrome/renderer/webplugin_delegate_proxy.h b/chrome/renderer/webplugin_delegate_proxy.h index e720815..b665015 100644 --- a/chrome/renderer/webplugin_delegate_proxy.h +++ b/chrome/renderer/webplugin_delegate_proxy.h @@ -14,11 +14,11 @@ #include "base/ref_counted.h" #include "chrome/common/ipc_message.h" #include "chrome/renderer/plugin_channel_host.h" +#include "googleurl/src/gurl.h" #include "skia/ext/platform_canvas.h" #include "webkit/glue/webplugin.h" #include "webkit/glue/webplugin_delegate.h" -class GURL; struct NPObject; class NPObjectStub; struct NPVariant_Param; @@ -204,6 +204,9 @@ class WebPluginDelegateProxy : public WebPluginDelegate, // This lets us know which portion of the backing store has been painted into. gfx::Rect backing_store_painted_; + // The url of the main frame hosting the plugin. + GURL page_url_; + DISALLOW_EVIL_CONSTRUCTORS(WebPluginDelegateProxy); }; |