| Index: chrome/renderer/chrome_render_process_observer.cc
|
| ===================================================================
|
| --- chrome/renderer/chrome_render_process_observer.cc (revision 0)
|
| +++ chrome/renderer/chrome_render_process_observer.cc (revision 0)
|
| @@ -0,0 +1,240 @@
|
| +// Copyright (c) 2011 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/chrome_render_process_observer.h"
|
| +
|
| +#include "base/command_line.h"
|
| +#include "base/file_util.h"
|
| +#include "base/metrics/histogram.h"
|
| +#include "base/path_service.h"
|
| +#include "base/process_util.h"
|
| +#include "chrome/common/chrome_paths.h"
|
| +#include "chrome/common/chrome_switches.h"
|
| +#include "chrome/common/render_messages.h"
|
| +#include "content/common/view_messages.h"
|
| +#include "content/renderer/render_thread.h"
|
| +#include "content/renderer/render_view.h"
|
| +#include "content/renderer/render_view_visitor.h"
|
| +#include "crypto/nss_util.h"
|
| +#include "third_party/sqlite/sqlite3.h"
|
| +#include "third_party/tcmalloc/chromium/src/google/malloc_extension.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebCache.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebCrossOriginPreflightResultCache.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFontCache.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
|
| +#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
|
| +#include "v8/include/v8.h"
|
| +
|
| +#if defined(OS_WIN)
|
| +#include "app/win/iat_patch_function.h"
|
| +#endif
|
| +
|
| +using WebKit::WebCache;
|
| +using WebKit::WebCrossOriginPreflightResultCache;
|
| +using WebKit::WebFontCache;
|
| +
|
| +namespace {
|
| +
|
| +#if defined(OS_WIN)
|
| +
|
| +static app::win::IATPatchFunction g_iat_patch_createdca;
|
| +HDC WINAPI CreateDCAPatch(LPCSTR driver_name,
|
| + LPCSTR device_name,
|
| + LPCSTR output,
|
| + const void* init_data) {
|
| + DCHECK(std::string("DISPLAY") == std::string(driver_name));
|
| + DCHECK(!device_name);
|
| + DCHECK(!output);
|
| + DCHECK(!init_data);
|
| +
|
| + // CreateDC fails behind the sandbox, but not CreateCompatibleDC.
|
| + return CreateCompatibleDC(NULL);
|
| +}
|
| +
|
| +static app::win::IATPatchFunction g_iat_patch_get_font_data;
|
| +DWORD WINAPI GetFontDataPatch(HDC hdc,
|
| + DWORD table,
|
| + DWORD offset,
|
| + LPVOID buffer,
|
| + DWORD length) {
|
| + int rv = GetFontData(hdc, table, offset, buffer, length);
|
| + if (rv == GDI_ERROR && hdc) {
|
| + HFONT font = static_cast<HFONT>(GetCurrentObject(hdc, OBJ_FONT));
|
| +
|
| + LOGFONT logfont;
|
| + if (GetObject(font, sizeof(LOGFONT), &logfont)) {
|
| + std::vector<char> font_data;
|
| + if (RenderThread::current()->Send(new ViewHostMsg_PreCacheFont(logfont)))
|
| + rv = GetFontData(hdc, table, offset, buffer, length);
|
| + }
|
| + }
|
| + return rv;
|
| +}
|
| +
|
| +#endif
|
| +
|
| +class RenderViewContentSettingsSetter : public RenderViewVisitor {
|
| + public:
|
| + RenderViewContentSettingsSetter(const GURL& url,
|
| + const ContentSettings& content_settings)
|
| + : url_(url),
|
| + content_settings_(content_settings) {
|
| + }
|
| +
|
| + virtual bool Visit(RenderView* render_view) {
|
| + if (GURL(render_view->webview()->mainFrame()->url()) == url_)
|
| + render_view->SetContentSettings(content_settings_);
|
| + return true;
|
| + }
|
| +
|
| + private:
|
| + GURL url_;
|
| + ContentSettings content_settings_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(RenderViewContentSettingsSetter);
|
| +};
|
| +
|
| +} // namespace
|
| +
|
| +bool ChromeRenderProcessObserver::is_incognito_process_ = false;
|
| +
|
| +ChromeRenderProcessObserver::ChromeRenderProcessObserver() {
|
| + const CommandLine& command_line = *CommandLine::ForCurrentProcess();
|
| +
|
| + if (command_line.HasSwitch(switches::kEnableWatchdog)) {
|
| + // TODO(JAR): Need to implement renderer IO msgloop watchdog.
|
| + }
|
| +
|
| + if (command_line.HasSwitch(switches::kDumpHistogramsOnExit)) {
|
| + base::StatisticsRecorder::set_dump_on_exit(true);
|
| + }
|
| +
|
| +#if defined(OS_WIN)
|
| + // Need to patch a few functions for font loading to work correctly.
|
| + FilePath pdf;
|
| + if (PathService::Get(chrome::FILE_PDF_PLUGIN, &pdf) &&
|
| + file_util::PathExists(pdf)) {
|
| + g_iat_patch_createdca.Patch(
|
| + pdf.value().c_str(), "gdi32.dll", "CreateDCA", CreateDCAPatch);
|
| + g_iat_patch_get_font_data.Patch(
|
| + pdf.value().c_str(), "gdi32.dll", "GetFontData", GetFontDataPatch);
|
| + }
|
| +#endif
|
| +
|
| +#if defined(OS_LINUX)
|
| + // Remoting requires NSS to function properly.
|
| + if (!command_line.HasSwitch(switches::kSingleProcess) &&
|
| + command_line.HasSwitch(switches::kEnableRemoting)) {
|
| +#if defined(USE_NSS)
|
| + // We are going to fork to engage the sandbox and we have not loaded
|
| + // any security modules so it is safe to disable the fork check in NSS.
|
| + crypto::DisableNSSForkCheck();
|
| + crypto::ForceNSSNoDBInit();
|
| + crypto::EnsureNSSInit();
|
| +#else
|
| + // TODO(bulach): implement openssl support.
|
| + NOTREACHED() << "Remoting is not supported for openssl";
|
| +#endif
|
| + }
|
| +#endif
|
| +}
|
| +
|
| +ChromeRenderProcessObserver::~ChromeRenderProcessObserver() {
|
| +}
|
| +
|
| +bool ChromeRenderProcessObserver::OnControlMessageReceived(
|
| + const IPC::Message& message) {
|
| + bool handled = true;
|
| + IPC_BEGIN_MESSAGE_MAP(ChromeRenderProcessObserver, message)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_SetIsIncognitoProcess, OnSetIsIncognitoProcess)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_SetContentSettingsForCurrentURL,
|
| + OnSetContentSettingsForCurrentURL)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_SetCacheCapacities, OnSetCacheCapacities)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_ClearCache, OnClearCache)
|
| +#if defined(USE_TCMALLOC)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_GetRendererTcmalloc, OnGetRendererTcmalloc)
|
| +#endif
|
| + IPC_MESSAGE_HANDLER(ViewMsg_GetV8HeapStats, OnGetV8HeapStats)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_GetCacheResourceStats, OnGetCacheResourceStats)
|
| + IPC_MESSAGE_HANDLER(ViewMsg_PurgeMemory, OnPurgeMemory)
|
| + IPC_MESSAGE_UNHANDLED(handled = false)
|
| + IPC_END_MESSAGE_MAP()
|
| + return handled;
|
| +}
|
| +
|
| +void ChromeRenderProcessObserver::OnSetIsIncognitoProcess(
|
| + bool is_incognito_process) {
|
| + is_incognito_process_ = is_incognito_process;
|
| +}
|
| +
|
| +void ChromeRenderProcessObserver::OnSetContentSettingsForCurrentURL(
|
| + const GURL& url,
|
| + const ContentSettings& content_settings) {
|
| + RenderViewContentSettingsSetter setter(url, content_settings);
|
| + RenderView::ForEach(&setter);
|
| +}
|
| +
|
| +void ChromeRenderProcessObserver::OnSetCacheCapacities(size_t min_dead_capacity,
|
| + size_t max_dead_capacity,
|
| + size_t capacity) {
|
| + WebCache::setCapacities(
|
| + min_dead_capacity, max_dead_capacity, capacity);
|
| +}
|
| +
|
| +void ChromeRenderProcessObserver::OnClearCache() {
|
| + WebCache::clear();
|
| +}
|
| +
|
| +void ChromeRenderProcessObserver::OnGetCacheResourceStats() {
|
| + WebCache::ResourceTypeStats stats;
|
| + WebCache::getResourceTypeStats(&stats);
|
| + Send(new ViewHostMsg_ResourceTypeStats(stats));
|
| +}
|
| +
|
| +#if defined(USE_TCMALLOC)
|
| +void ChromeRenderProcessObserver::OnGetRendererTcmalloc() {
|
| + std::string result;
|
| + char buffer[1024 * 32];
|
| + base::ProcessId pid = base::GetCurrentProcId();
|
| + MallocExtension::instance()->GetStats(buffer, sizeof(buffer));
|
| + result.append(buffer);
|
| + Send(new ViewHostMsg_RendererTcmalloc(pid, result));
|
| +}
|
| +#endif
|
| +
|
| +void ChromeRenderProcessObserver::OnGetV8HeapStats() {
|
| + v8::HeapStatistics heap_stats;
|
| + v8::V8::GetHeapStatistics(&heap_stats);
|
| + Send(new ViewHostMsg_V8HeapStats(heap_stats.total_heap_size(),
|
| + heap_stats.used_heap_size()));
|
| +}
|
| +
|
| +void ChromeRenderProcessObserver::OnPurgeMemory() {
|
| + // Clear the object cache (as much as possible; some live objects cannot be
|
| + // freed).
|
| + WebCache::clear();
|
| +
|
| + // Clear the font/glyph cache.
|
| + WebFontCache::clear();
|
| +
|
| + // Clear the Cross-Origin Preflight cache.
|
| + WebCrossOriginPreflightResultCache::clear();
|
| +
|
| + // Release all freeable memory from the SQLite process-global page cache (a
|
| + // low-level object which backs the Connection-specific page caches).
|
| + while (sqlite3_release_memory(std::numeric_limits<int>::max()) > 0) {
|
| + }
|
| +
|
| + // Repeatedly call the V8 idle notification until it returns true ("nothing
|
| + // more to free"). Note that it makes more sense to do this than to implement
|
| + // a new "delete everything" pass because object references make it difficult
|
| + // to free everything possible in just one pass.
|
| + while (!v8::V8::IdleNotification()) {
|
| + }
|
| +
|
| +#if (defined(OS_WIN) || defined(OS_LINUX)) && defined(USE_TCMALLOC)
|
| + // Tell tcmalloc to release any free pages it's still holding.
|
| + MallocExtension::instance()->ReleaseFreeMemory();
|
| +#endif
|
| +}
|
|
|
| Property changes on: chrome\renderer\chrome_render_process_observer.cc
|
| ___________________________________________________________________
|
| Added: svn:eol-style
|
| + LF
|
|
|
|
|