blob: 1b7fa2a74395f56381ecff391bd873b0f26cacd5 [file] [log] [blame]
// 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/browser/chrome_worker_message_filter.h"
#include "chrome/browser/content_settings/host_content_settings_map.h"
#include "chrome/browser/content_settings/tab_specific_content_settings.h"
#include "chrome/browser/profiles/profile_io_data.h"
#include "content/browser/resource_context.h"
#include "content/browser/worker_host/worker_process_host.h"
#include "content/common/worker_messages.h"
ChromeWorkerMessageFilter::ChromeWorkerMessageFilter(WorkerProcessHost* process)
: process_(process) {
ProfileIOData* io_data = reinterpret_cast<ProfileIOData*>(
process->resource_context()->GetUserData(NULL));
host_content_settings_map_ = io_data->GetHostContentSettingsMap();
}
ChromeWorkerMessageFilter::~ChromeWorkerMessageFilter() {
}
bool ChromeWorkerMessageFilter::OnMessageReceived(const IPC::Message& message) {
bool handled = true;
IPC_BEGIN_MESSAGE_MAP(ChromeWorkerMessageFilter, message)
IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowDatabase, OnAllowDatabase)
IPC_MESSAGE_HANDLER(WorkerProcessHostMsg_AllowFileSystem, OnAllowFileSystem)
IPC_MESSAGE_UNHANDLED(handled = false)
IPC_END_MESSAGE_MAP()
return handled;
}
bool ChromeWorkerMessageFilter::Send(IPC::Message* message) {
return process_->Send(message);
}
void ChromeWorkerMessageFilter::OnAllowDatabase(int worker_route_id,
const GURL& url,
const string16& name,
const string16& display_name,
unsigned long estimated_size,
bool* result) {
ContentSetting content_setting =
host_content_settings_map_->GetCookieContentSetting(url, url, true);
*result = content_setting != CONTENT_SETTING_BLOCK;
// Record access to database for potential display in UI: Find the worker
// instance and forward the message to all attached documents.
WorkerProcessHost::Instances::const_iterator i;
for (i = process_->instances().begin(); i != process_->instances().end();
++i) {
if (i->worker_route_id() != worker_route_id)
continue;
const WorkerDocumentSet::DocumentInfoSet& documents =
i->worker_document_set()->documents();
for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc =
documents.begin(); doc != documents.end(); ++doc) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableFunction(
&TabSpecificContentSettings::WebDatabaseAccessed,
doc->render_process_id(), doc->render_view_id(),
url, name, display_name, !*result));
}
break;
}
}
void ChromeWorkerMessageFilter::OnAllowFileSystem(int worker_route_id,
const GURL& url,
bool* result) {
ContentSetting content_setting =
host_content_settings_map_->GetCookieContentSetting(url, url, true);
*result = content_setting != CONTENT_SETTING_BLOCK;
// Record access to file system for potential display in UI: Find the worker
// instance and forward the message to all attached documents.
WorkerProcessHost::Instances::const_iterator i;
for (i = process_->instances().begin(); i != process_->instances().end();
++i) {
if (i->worker_route_id() != worker_route_id)
continue;
const WorkerDocumentSet::DocumentInfoSet& documents =
i->worker_document_set()->documents();
for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc =
documents.begin(); doc != documents.end(); ++doc) {
BrowserThread::PostTask(
BrowserThread::UI, FROM_HERE,
NewRunnableFunction(
&TabSpecificContentSettings::FileSystemAccessed,
doc->render_process_id(), doc->render_view_id(), url, !*result));
}
break;
}
}