summaryrefslogtreecommitdiff
path: root/Source/WebKit2/WebProcess/Plugins
diff options
context:
space:
mode:
authorSimon Hausmann <simon.hausmann@digia.com>2012-11-30 16:58:06 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2012-11-30 17:03:09 +0100
commit32ea33253afbbdefd2680aa95ab5f57455272ae7 (patch)
tree2389569585b666c310fbb36d3fb8e6ab94462967 /Source/WebKit2/WebProcess/Plugins
parent41c25f231cbca1babc445187283524cc6c751c71 (diff)
downloadqtwebkit-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')
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.h1
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PDF/PDFPlugin.mm50
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.cpp3
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginProcessConnection.h11
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.cpp23
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginProcessConnectionManager.h7
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp9
-rw-r--r--Source/WebKit2/WebProcess/Plugins/PluginProxy.h7
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