| // Copyright (c) 2010 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/worker/worker_webkitclient_impl.h" |
| |
| #include "base/logging.h" |
| #include "base/utf_string_conversions.h" |
| #include "chrome/common/database_util.h" |
| #include "chrome/common/file_utilities_messages.h" |
| #include "chrome/common/render_messages.h" |
| #include "chrome/common/render_messages_params.h" |
| #include "chrome/common/mime_registry_messages.h" |
| #include "chrome/common/webblobregistry_impl.h" |
| #include "chrome/common/webmessageportchannel_impl.h" |
| #include "chrome/worker/worker_thread.h" |
| #include "content/common/file_system/webfilesystem_impl.h" |
| #include "ipc/ipc_sync_message_filter.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebBlobRegistry.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h" |
| #include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h" |
| #include "webkit/glue/webfileutilities_impl.h" |
| #include "webkit/glue/webkit_glue.h" |
| |
| using WebKit::WebBlobRegistry; |
| using WebKit::WebClipboard; |
| using WebKit::WebFileSystem; |
| using WebKit::WebFileUtilities; |
| using WebKit::WebKitClient; |
| using WebKit::WebMessagePortChannel; |
| using WebKit::WebMimeRegistry; |
| using WebKit::WebSandboxSupport; |
| using WebKit::WebSharedWorkerRepository; |
| using WebKit::WebStorageNamespace; |
| using WebKit::WebString; |
| using WebKit::WebURL; |
| |
| // TODO(kinuko): Probably this could be consolidated into |
| // RendererWebKitClientImpl::FileUtilities. |
| class WorkerWebKitClientImpl::FileUtilities |
| : public webkit_glue::WebFileUtilitiesImpl { |
| public: |
| virtual bool getFileSize(const WebKit::WebString& path, long long& result); |
| virtual bool getFileModificationTime(const WebKit::WebString& path, |
| double& result); |
| }; |
| |
| static bool SendSyncMessageFromAnyThread(IPC::SyncMessage* msg) { |
| WorkerThread* worker_thread = WorkerThread::current(); |
| if (worker_thread) |
| return worker_thread->Send(msg); |
| |
| scoped_refptr<IPC::SyncMessageFilter> sync_msg_filter( |
| ChildThread::current()->sync_message_filter()); |
| return sync_msg_filter->Send(msg); |
| } |
| |
| bool WorkerWebKitClientImpl::FileUtilities::getFileSize(const WebString& path, |
| long long& result) { |
| if (SendSyncMessageFromAnyThread(new FileUtilitiesMsg_GetFileSize( |
| webkit_glue::WebStringToFilePath(path), |
| reinterpret_cast<int64*>(&result)))) { |
| return result >= 0; |
| } |
| |
| result = -1; |
| return false; |
| } |
| |
| bool WorkerWebKitClientImpl::FileUtilities::getFileModificationTime( |
| const WebString& path, |
| double& result) { |
| base::Time time; |
| if (SendSyncMessageFromAnyThread(new FileUtilitiesMsg_GetFileModificationTime( |
| webkit_glue::WebStringToFilePath(path), &time))) { |
| result = time.ToDoubleT(); |
| return !time.is_null(); |
| } |
| |
| result = 0; |
| return false; |
| } |
| |
| //------------------------------------------------------------------------------ |
| |
| WorkerWebKitClientImpl::WorkerWebKitClientImpl() { |
| } |
| |
| WorkerWebKitClientImpl::~WorkerWebKitClientImpl() { |
| } |
| |
| WebClipboard* WorkerWebKitClientImpl::clipboard() { |
| NOTREACHED(); |
| return NULL; |
| } |
| |
| WebMimeRegistry* WorkerWebKitClientImpl::mimeRegistry() { |
| return this; |
| } |
| |
| WebFileSystem* WorkerWebKitClientImpl::fileSystem() { |
| if (!web_file_system_.get()) |
| web_file_system_.reset(new WebFileSystemImpl()); |
| return web_file_system_.get(); |
| } |
| |
| WebFileUtilities* WorkerWebKitClientImpl::fileUtilities() { |
| if (!file_utilities_.get()) { |
| file_utilities_.reset(new FileUtilities); |
| file_utilities_->set_sandbox_enabled(sandboxEnabled()); |
| } |
| return file_utilities_.get(); |
| } |
| |
| WebSandboxSupport* WorkerWebKitClientImpl::sandboxSupport() { |
| NOTREACHED(); |
| return NULL; |
| } |
| |
| bool WorkerWebKitClientImpl::sandboxEnabled() { |
| // Always return true because WebKit should always act as though the Sandbox |
| // is enabled for workers. See the comment in WebKitClient for more info. |
| return true; |
| } |
| |
| unsigned long long WorkerWebKitClientImpl::visitedLinkHash( |
| const char* canonical_url, |
| size_t length) { |
| NOTREACHED(); |
| return 0; |
| } |
| |
| bool WorkerWebKitClientImpl::isLinkVisited(unsigned long long link_hash) { |
| NOTREACHED(); |
| return false; |
| } |
| |
| WebMessagePortChannel* |
| WorkerWebKitClientImpl::createMessagePortChannel() { |
| return new WebMessagePortChannelImpl(); |
| } |
| |
| void WorkerWebKitClientImpl::setCookies(const WebURL& url, |
| const WebURL& first_party_for_cookies, |
| const WebString& value) { |
| NOTREACHED(); |
| } |
| |
| WebString WorkerWebKitClientImpl::cookies( |
| const WebURL& url, const WebURL& first_party_for_cookies) { |
| // WebSocketHandshake may access cookies in worker process. |
| return WebString(); |
| } |
| |
| void WorkerWebKitClientImpl::prefetchHostName(const WebString&) { |
| NOTREACHED(); |
| } |
| |
| WebString WorkerWebKitClientImpl::defaultLocale() { |
| NOTREACHED(); |
| return WebString(); |
| } |
| |
| WebStorageNamespace* WorkerWebKitClientImpl::createLocalStorageNamespace( |
| const WebString& path, unsigned quota) { |
| NOTREACHED(); |
| return 0; |
| } |
| |
| void WorkerWebKitClientImpl::dispatchStorageEvent( |
| const WebString& key, const WebString& old_value, |
| const WebString& new_value, const WebString& origin, |
| const WebKit::WebURL& url, bool is_local_storage) { |
| NOTREACHED(); |
| } |
| |
| WebSharedWorkerRepository* WorkerWebKitClientImpl::sharedWorkerRepository() { |
| return 0; |
| } |
| |
| WebKitClient::FileHandle WorkerWebKitClientImpl::databaseOpenFile( |
| const WebString& vfs_file_name, int desired_flags) { |
| return DatabaseUtil::databaseOpenFile(vfs_file_name, desired_flags); |
| } |
| |
| int WorkerWebKitClientImpl::databaseDeleteFile( |
| const WebString& vfs_file_name, bool sync_dir) { |
| return DatabaseUtil::databaseDeleteFile(vfs_file_name, sync_dir); |
| } |
| |
| long WorkerWebKitClientImpl::databaseGetFileAttributes( |
| const WebString& vfs_file_name) { |
| return DatabaseUtil::databaseGetFileAttributes(vfs_file_name); |
| } |
| |
| long long WorkerWebKitClientImpl::databaseGetFileSize( |
| const WebString& vfs_file_name) { |
| return DatabaseUtil::databaseGetFileSize(vfs_file_name); |
| } |
| |
| WebMimeRegistry::SupportsType WorkerWebKitClientImpl::supportsMIMEType( |
| const WebString&) { |
| return WebMimeRegistry::IsSupported; |
| } |
| |
| WebMimeRegistry::SupportsType WorkerWebKitClientImpl::supportsImageMIMEType( |
| const WebString&) { |
| NOTREACHED(); |
| return WebMimeRegistry::IsSupported; |
| } |
| |
| WebMimeRegistry::SupportsType |
| WorkerWebKitClientImpl::supportsJavaScriptMIMEType(const WebString&) { |
| NOTREACHED(); |
| return WebMimeRegistry::IsSupported; |
| } |
| |
| WebMimeRegistry::SupportsType WorkerWebKitClientImpl::supportsMediaMIMEType( |
| const WebString&, const WebString&) { |
| NOTREACHED(); |
| return WebMimeRegistry::IsSupported; |
| } |
| |
| WebMimeRegistry::SupportsType WorkerWebKitClientImpl::supportsNonImageMIMEType( |
| const WebString&) { |
| NOTREACHED(); |
| return WebMimeRegistry::IsSupported; |
| } |
| |
| WebString WorkerWebKitClientImpl::mimeTypeForExtension( |
| const WebString& file_extension) { |
| std::string mime_type; |
| SendSyncMessageFromAnyThread(new MimeRegistryMsg_GetMimeTypeFromExtension( |
| webkit_glue::WebStringToFilePathString(file_extension), &mime_type)); |
| return ASCIIToUTF16(mime_type); |
| } |
| |
| WebString WorkerWebKitClientImpl::mimeTypeFromFile( |
| const WebString& file_path) { |
| std::string mime_type; |
| SendSyncMessageFromAnyThread(new MimeRegistryMsg_GetMimeTypeFromFile( |
| FilePath(webkit_glue::WebStringToFilePathString(file_path)), |
| &mime_type)); |
| return ASCIIToUTF16(mime_type); |
| } |
| |
| WebString WorkerWebKitClientImpl::preferredExtensionForMIMEType( |
| const WebString& mime_type) { |
| FilePath::StringType file_extension; |
| SendSyncMessageFromAnyThread( |
| new MimeRegistryMsg_GetPreferredExtensionForMimeType( |
| UTF16ToASCII(mime_type), &file_extension)); |
| return webkit_glue::FilePathStringToWebString(file_extension); |
| } |
| |
| WebBlobRegistry* WorkerWebKitClientImpl::blobRegistry() { |
| if (!blob_registry_.get()) |
| blob_registry_.reset(new WebBlobRegistryImpl(WorkerThread::current())); |
| return blob_registry_.get(); |
| } |