diff options
author | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-30 16:58:06 +0100 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@digia.com> | 2012-11-30 17:03:09 +0100 |
commit | 32ea33253afbbdefd2680aa95ab5f57455272ae7 (patch) | |
tree | 2389569585b666c310fbb36d3fb8e6ab94462967 /Source/WebKit2/WebProcess/Plugins | |
parent | 41c25f231cbca1babc445187283524cc6c751c71 (diff) | |
download | qtwebkit-32ea33253afbbdefd2680aa95ab5f57455272ae7.tar.gz |
Imported WebKit commit 6a4a1d32e1d779548c726c4826cba9d69eb87601 (http://svn.webkit.org/repository/webkit/trunk@136242)
Final import for the Qt 5.x series that implements the QtWebKit / QtWebKitWidgets split
Extra fixes will be cherry-picked.
Change-Id: I844f1ebb99c6d6b75db31d6538c2acd628e79681
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'Source/WebKit2/WebProcess/Plugins')
8 files changed, 78 insertions, 33 deletions
diff --git a/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h b/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h index 132c28774..67f53d241 100644 --- a/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h +++ b/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h @@ -67,6 +67,7 @@ public: void clickedLink(NSURL *); void saveToPDF(); + void writeItemsToPasteboard(NSArray *items, NSArray *types); private: explicit PDFPlugin(WebFrame*); diff --git a/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm b/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm index f50fb8c0e..7417929bc 100644 --- a/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm +++ b/Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm @@ -36,10 +36,12 @@ #import "PDFPluginAnnotation.h" #import "PluginView.h" #import "ShareableBitmap.h" +#import "WebContextMessages.h" #import "WebEvent.h" #import "WebEventConversion.h" #import "WebPage.h" #import "WebPageProxyMessages.h" +#import "WebProcess.h" #import <PDFKit/PDFKit.h> #import <QuartzCore/QuartzCore.h> #import <WebCore/ArchiveResource.h> @@ -154,15 +156,7 @@ static const char* annotationStyle = - (void)writeItemsToPasteboard:(NSArray *)items withTypes:(NSArray *)types { - // FIXME: Handle types other than plain text. - - for (NSUInteger i = 0, count = items.count; i < count; ++i) { - NSString *type = [types objectAtIndex:i]; - if ([type isEqualToString:NSStringPboardType] || [type isEqualToString:NSPasteboardTypeString]) { - RetainPtr<NSString> plainTextString(AdoptNS, [[NSString alloc] initWithData:[items objectAtIndex:i] encoding:NSUTF8StringEncoding]); - Pasteboard::generalPasteboard()->writePlainText(plainTextString.get(), Pasteboard::CannotSmartReplace); - } - } + _pdfPlugin->writeItemsToPasteboard(items, types); } - (void)showDefinitionForAttributedString:(NSAttributedString *)string atPoint:(CGPoint)point @@ -765,6 +759,44 @@ void PDFPlugin::saveToPDF() webFrame()->page()->send(Messages::WebPageProxy::SavePDFToFileInDownloadsFolder(suggestedFilename(), webFrame()->url(), dataReference)); } +void PDFPlugin::writeItemsToPasteboard(NSArray *items, NSArray *types) +{ + Vector<String> pasteboardTypes; + + for (NSString *type in types) + pasteboardTypes.append(type); + + WebProcess::shared().connection()->send(Messages::WebContext::SetPasteboardTypes(NSGeneralPboard, pasteboardTypes), 0); + + for (NSUInteger i = 0, count = items.count; i < count; ++i) { + NSString *type = [types objectAtIndex:i]; + NSData *data = [items objectAtIndex:i]; + + // We don't expect the data for any items to be empty, but aren't completely sure. + // Avoid crashing in the SharedMemory constructor in release builds if we're wrong. + ASSERT(data.length); + if (!data.length) + continue; + + if ([type isEqualToString:NSStringPboardType] || [type isEqualToString:NSPasteboardTypeString]) { + RetainPtr<NSString> plainTextString(AdoptNS, [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); + WebProcess::shared().connection()->send(Messages::WebContext::SetPasteboardStringForType(NSGeneralPboard, type, plainTextString.get()), 0); + } else { + RefPtr<SharedBuffer> buffer = SharedBuffer::wrapNSData(data); + + if (!buffer) + continue; + + SharedMemory::Handle handle; + RefPtr<SharedMemory> sharedMemory = SharedMemory::create(buffer->size()); + memcpy(sharedMemory->data(), buffer->data(), buffer->size()); + sharedMemory->createHandle(handle, SharedMemory::ReadOnly); + WebProcess::shared().connection()->send(Messages::WebContext::SetPasteboardBufferForType(NSGeneralPboard, type, handle, buffer->size()), 0); + } + } + +} + } // namespace WebKit #endif // ENABLE(PDFKIT_PLUGIN) diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp index 648a51eb8..b75c5a876 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp +++ b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp @@ -41,10 +41,11 @@ using namespace WebCore; namespace WebKit { -PluginProcessConnection::PluginProcessConnection(PluginProcessConnectionManager* pluginProcessConnectionManager, const String& pluginPath, CoreIPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousPluginInitialization) +PluginProcessConnection::PluginProcessConnection(PluginProcessConnectionManager* pluginProcessConnectionManager, const String& pluginPath, PluginProcess::Type processType, CoreIPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousPluginInitialization) : m_pluginProcessConnectionManager(pluginProcessConnectionManager) , m_pluginPath(pluginPath) , m_supportsAsynchronousPluginInitialization(supportsAsynchronousPluginInitialization) + , m_processType(processType) { m_connection = CoreIPC::Connection::createClientConnection(connectionIdentifier, this, WebProcess::shared().runLoop()); diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h index bc6558ffd..35993d45e 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h +++ b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h @@ -30,6 +30,7 @@ #include "Connection.h" #include "Plugin.h" +#include "PluginProcess.h" #include <wtf/RefCounted.h> #include <wtf/text/WTFString.h> @@ -43,9 +44,9 @@ class PluginProxy; class PluginProcessConnection : public RefCounted<PluginProcessConnection>, CoreIPC::Connection::Client { public: - static PassRefPtr<PluginProcessConnection> create(PluginProcessConnectionManager* pluginProcessConnectionManager, const String& pluginPath, CoreIPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousPluginInitialization) + static PassRefPtr<PluginProcessConnection> create(PluginProcessConnectionManager* pluginProcessConnectionManager, const String& pluginPath, PluginProcess::Type processType, CoreIPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousPluginInitialization) { - return adoptRef(new PluginProcessConnection(pluginProcessConnectionManager, pluginPath, connectionIdentifier, supportsAsynchronousPluginInitialization)); + return adoptRef(new PluginProcessConnection(pluginProcessConnectionManager, pluginPath, processType, connectionIdentifier, supportsAsynchronousPluginInitialization)); } ~PluginProcessConnection(); @@ -60,8 +61,10 @@ public: bool supportsAsynchronousPluginInitialization() const { return m_supportsAsynchronousPluginInitialization; } + PluginProcess::Type processType() const { return m_processType; } + private: - PluginProcessConnection(PluginProcessConnectionManager*, const String& pluginPath, CoreIPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousInitialization); + PluginProcessConnection(PluginProcessConnectionManager*, const String& pluginPath, PluginProcess::Type, CoreIPC::Connection::Identifier connectionIdentifier, bool supportsAsynchronousInitialization); // CoreIPC::Connection::Client virtual void didReceiveMessage(CoreIPC::Connection*, CoreIPC::MessageID, CoreIPC::MessageDecoder&) OVERRIDE; @@ -85,6 +88,8 @@ private: RefPtr<NPRemoteObjectMap> m_npRemoteObjectMap; bool m_supportsAsynchronousPluginInitialization; + + PluginProcess::Type m_processType; }; } // namespace WebKit diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp index b77050992..64bfc2b7d 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp +++ b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp @@ -49,16 +49,17 @@ PluginProcessConnectionManager::~PluginProcessConnectionManager() { } -PluginProcessConnection* PluginProcessConnectionManager::getPluginProcessConnection(const String& pluginPath) +PluginProcessConnection* PluginProcessConnectionManager::getPluginProcessConnection(const String& pluginPath, PluginProcess::Type processType) { for (size_t i = 0; i < m_pluginProcessConnections.size(); ++i) { - if (m_pluginProcessConnections[i]->pluginPath() == pluginPath) - return m_pluginProcessConnections[i].get(); + RefPtr<PluginProcessConnection>& pluginProcessConnection = m_pluginProcessConnections[i]; + if (pluginProcessConnection->pluginPath() == pluginPath && pluginProcessConnection->processType() == processType) + return pluginProcessConnection.get(); } CoreIPC::Attachment encodedConnectionIdentifier; bool supportsAsynchronousInitialization; - if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::GetPluginProcessConnection(pluginPath), + if (!WebProcess::shared().connection()->sendSync(Messages::WebProcessProxy::GetPluginProcessConnection(pluginPath, processType), Messages::WebProcessProxy::GetPluginProcessConnection::Reply(encodedConnectionIdentifier, supportsAsynchronousInitialization), 0)) return 0; @@ -72,14 +73,14 @@ PluginProcessConnection* PluginProcessConnectionManager::getPluginProcessConnect return 0; #endif - RefPtr<PluginProcessConnection> pluginProcessConnection = PluginProcessConnection::create(this, pluginPath, connectionIdentifier, supportsAsynchronousInitialization); + RefPtr<PluginProcessConnection> pluginProcessConnection = PluginProcessConnection::create(this, pluginPath, processType, connectionIdentifier, supportsAsynchronousInitialization); m_pluginProcessConnections.append(pluginProcessConnection); { MutexLocker locker(m_pathsAndConnectionsMutex); - ASSERT(!m_pathsAndConnections.contains(pluginProcessConnection->pluginPath())); + ASSERT(!m_pathsAndConnections.contains(std::make_pair(pluginProcessConnection->pluginPath(), processType))); - m_pathsAndConnections.set(pluginPath, pluginProcessConnection->connection()); + m_pathsAndConnections.set(std::make_pair(pluginPath, processType), pluginProcessConnection->connection()); } return pluginProcessConnection.get(); @@ -92,18 +93,18 @@ void PluginProcessConnectionManager::removePluginProcessConnection(PluginProcess { MutexLocker locker(m_pathsAndConnectionsMutex); - ASSERT(m_pathsAndConnections.contains(pluginProcessConnection->pluginPath())); + ASSERT(m_pathsAndConnections.contains(std::make_pair(pluginProcessConnection->pluginPath(), pluginProcessConnection->processType()))); - m_pathsAndConnections.remove(pluginProcessConnection->pluginPath()); + m_pathsAndConnections.remove(std::make_pair(pluginProcessConnection->pluginPath(), pluginProcessConnection->processType())); } m_pluginProcessConnections.remove(vectorIndex); } -void PluginProcessConnectionManager::pluginProcessCrashed(const String& pluginPath) +void PluginProcessConnectionManager::pluginProcessCrashed(const String& pluginPath, PluginProcess::Type processType) { MutexLocker locker(m_pathsAndConnectionsMutex); - CoreIPC::Connection* connection = m_pathsAndConnections.get(pluginPath).get(); + CoreIPC::Connection* connection = m_pathsAndConnections.get(std::make_pair(pluginPath, processType)).get(); // It's OK for connection to be null here; it will happen if this web process doesn't know // anything about the plug-in process. diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h index 45515cdf1..86449f651 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h +++ b/Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h @@ -28,6 +28,7 @@ #if ENABLE(PLUGIN_PROCESS) +#include "PluginProcess.h" #include <wtf/Forward.h> #include <wtf/HashMap.h> #include <wtf/Noncopyable.h> @@ -51,17 +52,17 @@ public: PluginProcessConnectionManager(); ~PluginProcessConnectionManager(); - PluginProcessConnection* getPluginProcessConnection(const String& pluginPath); + PluginProcessConnection* getPluginProcessConnection(const String& pluginPath, PluginProcess::Type); void removePluginProcessConnection(PluginProcessConnection*); // Called on the web process connection work queue. - void pluginProcessCrashed(const String& pluginPath); + void pluginProcessCrashed(const String& pluginPath, PluginProcess::Type); private: Vector<RefPtr<PluginProcessConnection> > m_pluginProcessConnections; Mutex m_pathsAndConnectionsMutex; - HashMap<String, RefPtr<CoreIPC::Connection> > m_pathsAndConnections; + HashMap<std::pair<String, PluginProcess::Type>, RefPtr<CoreIPC::Connection> > m_pathsAndConnections; }; } diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp b/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp index f7ead5664..6633d8247 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp +++ b/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp @@ -55,12 +55,12 @@ static uint64_t generatePluginInstanceID() return ++uniquePluginInstanceID; } -PassRefPtr<PluginProxy> PluginProxy::create(const String& pluginPath) +PassRefPtr<PluginProxy> PluginProxy::create(const String& pluginPath, PluginProcess::Type processType) { - return adoptRef(new PluginProxy(pluginPath)); + return adoptRef(new PluginProxy(pluginPath, processType)); } -PluginProxy::PluginProxy(const String& pluginPath) +PluginProxy::PluginProxy(const String& pluginPath, PluginProcess::Type processType) : m_pluginPath(pluginPath) , m_pluginInstanceID(generatePluginInstanceID()) , m_pluginBackingStoreContainsValidData(false) @@ -69,6 +69,7 @@ PluginProxy::PluginProxy(const String& pluginPath) , m_wantsWheelEvents(false) , m_remoteLayerClientID(0) , m_waitingOnAsynchronousInitialization(false) + , m_processType(processType) { } @@ -84,7 +85,7 @@ void PluginProxy::pluginProcessCrashed() bool PluginProxy::initialize(const Parameters& parameters) { ASSERT(!m_connection); - m_connection = WebProcess::shared().pluginProcessConnectionManager().getPluginProcessConnection(m_pluginPath); + m_connection = WebProcess::shared().pluginProcessConnectionManager().getPluginProcessConnection(m_pluginPath, m_processType); if (!m_connection) return false; diff --git a/Source/WebKit2/WebProcess/Plugins/PluginProxy.h b/Source/WebKit2/WebProcess/Plugins/PluginProxy.h index 535c8c7fe..af1d5e1ed 100644 --- a/Source/WebKit2/WebProcess/Plugins/PluginProxy.h +++ b/Source/WebKit2/WebProcess/Plugins/PluginProxy.h @@ -30,6 +30,7 @@ #include "Connection.h" #include "Plugin.h" +#include "PluginProcess.h" #include <WebCore/AffineTransform.h> #include <WebCore/IntRect.h> #include <WebCore/SecurityOrigin.h> @@ -54,7 +55,7 @@ struct PluginCreationParameters; class PluginProxy : public Plugin { public: - static PassRefPtr<PluginProxy> create(const String& pluginPath); + static PassRefPtr<PluginProxy> create(const String& pluginPath, PluginProcess::Type); ~PluginProxy(); uint64_t pluginInstanceID() const { return m_pluginInstanceID; } @@ -66,7 +67,7 @@ public: bool isBeingAsynchronouslyInitialized() const { return m_waitingOnAsynchronousInitialization; } private: - explicit PluginProxy(const String& pluginPath); + explicit PluginProxy(const String& pluginPath, PluginProcess::Type); // Plugin virtual bool initialize(const Parameters&); @@ -205,6 +206,8 @@ private: #if PLATFORM(MAC) RetainPtr<CALayer> m_pluginLayer; #endif + + PluginProcess::Type m_processType; }; } // namespace WebKit |