Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
openanolis
dragonwell8_jdk
提交
67c0d3ff
D
dragonwell8_jdk
项目概览
openanolis
/
dragonwell8_jdk
通知
4
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
dragonwell8_jdk
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
67c0d3ff
编写于
3月 30, 2015
作者:
A
anashaty
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
8071668: [macosx] Clipboard does not work with 3rd parties Clipboard Managers
Reviewed-by: ant, serb
上级
cb914a68
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
246 addition
and
41 deletion
+246
-41
src/macosx/classes/sun/lwawt/macosx/CClipboard.java
src/macosx/classes/sun/lwawt/macosx/CClipboard.java
+20
-1
src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java
src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java
+1
-1
src/macosx/native/sun/awt/CClipboard.m
src/macosx/native/sun/awt/CClipboard.m
+21
-5
src/share/classes/sun/awt/datatransfer/SunClipboard.java
src/share/classes/sun/awt/datatransfer/SunClipboard.java
+33
-34
test/java/awt/datatransfer/ClipboardInterVMTest/ClipboardInterVMTest.java
...tatransfer/ClipboardInterVMTest/ClipboardInterVMTest.java
+171
-0
未找到文件。
src/macosx/classes/sun/lwawt/macosx/CClipboard.java
浏览文件 @
67c0d3ff
...
...
@@ -56,6 +56,18 @@ final class CClipboard extends SunClipboard {
// Leaving Empty, as WClipboard.clearNativeContext is empty as well.
}
@Override
public
synchronized
Transferable
getContents
(
Object
requestor
)
{
checkPasteboardAndNotify
();
return
super
.
getContents
(
requestor
);
}
@Override
protected
synchronized
Transferable
getContextContents
()
{
checkPasteboardAndNotify
();
return
super
.
getContextContents
();
}
@Override
protected
void
setContentsNative
(
Transferable
contents
)
{
FlavorTable
flavorMap
=
getDefaultFlavorTable
();
...
...
@@ -116,13 +128,20 @@ final class CClipboard extends SunClipboard {
private
native
void
declareTypes
(
long
[]
formats
,
SunClipboard
newOwner
);
private
native
void
setData
(
byte
[]
data
,
long
format
);
void
checkPasteboardAndNotify
()
{
if
(
checkPasteboardWithoutNotification
())
{
notifyChanged
();
lostOwnershipNow
(
null
);
}
}
/**
* Invokes native check whether a change count on the general pasteboard is different
* than when we set it. The different count value means the current owner lost
* pasteboard ownership and someone else put data on the clipboard.
* @since 1.7
*/
native
void
checkPasteboard
();
native
boolean
checkPasteboardWithoutNotification
();
/*** Native Callbacks ***/
private
void
notifyLostOwnership
()
{
...
...
src/macosx/classes/sun/lwawt/macosx/CEmbeddedFrame.java
浏览文件 @
67c0d3ff
...
...
@@ -120,7 +120,7 @@ public class CEmbeddedFrame extends EmbeddedFrame {
// it won't be invoced if focuse is moved to a html element
// on the same page.
CClipboard
clipboard
=
(
CClipboard
)
Toolkit
.
getDefaultToolkit
().
getSystemClipboard
();
clipboard
.
checkPasteboard
();
clipboard
.
checkPasteboard
AndNotify
();
}
if
(
parentWindowActive
)
{
responder
.
handleWindowFocusEvent
(
focused
,
null
);
...
...
src/macosx/native/sun/awt/CClipboard.m
浏览文件 @
67c0d3ff
...
...
@@ -171,6 +171,8 @@ static CClipboard *sClipboard = nil;
else
[
args
removeLastObject
];
}
-
(
void
)
checkPasteboard
:(
id
)
application
{
AWT_ASSERT_APPKIT_THREAD
;
...
...
@@ -202,6 +204,19 @@ static CClipboard *sClipboard = nil;
}
}
-
(
BOOL
)
checkPasteboardWithoutNotification
:(
id
)
application
{
AWT_ASSERT_APPKIT_THREAD
;
NSInteger
newChangeCount
=
[[
NSPasteboard
generalPasteboard
]
changeCount
];
if
(
fChangeCount
!=
newChangeCount
)
{
fChangeCount
=
newChangeCount
;
return
YES
;
}
else
{
return
NO
;
}
}
@end
/*
...
...
@@ -348,16 +363,17 @@ JNF_COCOA_EXIT(env);
* Method: checkPasteboard
* Signature: ()V
*/
JNIEXPORT
void
JNICALL
Java_sun_lwawt_macosx_CClipboard_checkPasteboard
(
JNIEnv
*
env
,
jobject
inObject
)
JNIEXPORT
jboolean
JNICALL
Java_sun_lwawt_macosx_CClipboard_checkPasteboardWithoutNotification
(
JNIEnv
*
env
,
jobject
inObject
)
{
__block
BOOL
ret
=
NO
;
JNF_COCOA_ENTER
(
env
);
[
ThreadUtilities
performOnMainThreadWaiting
:
YES
block
:
^
(){
[[
CClipboard
sharedClipboard
]
checkPasteboard
:
nil
];
ret
=
[[
CClipboard
sharedClipboard
]
checkPasteboardWithoutNotification
:
nil
];
}];
JNF_COCOA_EXIT
(
env
);
return
ret
;
}
src/share/classes/sun/awt/datatransfer/SunClipboard.java
浏览文件 @
67c0d3ff
...
...
@@ -150,7 +150,7 @@ public abstract class SunClipboard extends Clipboard
* AppContext as it is currently retrieved or null otherwise
* @since 1.5
*/
pr
ivate
synchronized
Transferable
getContextContents
()
{
pr
otected
synchronized
Transferable
getContextContents
()
{
AppContext
context
=
AppContext
.
getAppContext
();
return
(
context
==
contentsContext
)
?
contents
:
null
;
}
...
...
@@ -281,42 +281,41 @@ public abstract class SunClipboard extends Clipboard
return
;
}
final
Runnable
runnable
=
new
Runnable
()
{
public
void
run
()
{
final
SunClipboard
sunClipboard
=
SunClipboard
.
this
;
ClipboardOwner
owner
=
null
;
Transferable
contents
=
null
;
synchronized
(
sunClipboard
)
{
final
AppContext
context
=
sunClipboard
.
contentsContext
;
if
(
context
==
null
)
{
return
;
}
if
(
disposedContext
==
null
||
context
==
disposedContext
)
{
owner
=
sunClipboard
.
owner
;
contents
=
sunClipboard
.
contents
;
sunClipboard
.
contentsContext
=
null
;
sunClipboard
.
owner
=
null
;
sunClipboard
.
contents
=
null
;
sunClipboard
.
clearNativeContext
();
context
.
removePropertyChangeListener
(
AppContext
.
DISPOSED_PROPERTY_NAME
,
sunClipboard
);
}
else
{
return
;
}
}
if
(
owner
!=
null
)
{
owner
.
lostOwnership
(
sunClipboard
,
contents
);
}
}
};
SunToolkit
.
postEvent
(
context
,
new
PeerEvent
(
this
,
runnable
,
SunToolkit
.
postEvent
(
context
,
new
PeerEvent
(
this
,
()
->
lostOwnershipNow
(
disposedContext
),
PeerEvent
.
PRIORITY_EVENT
));
}
protected
void
lostOwnershipNow
(
final
AppContext
disposedContext
)
{
final
SunClipboard
sunClipboard
=
SunClipboard
.
this
;
ClipboardOwner
owner
=
null
;
Transferable
contents
=
null
;
synchronized
(
sunClipboard
)
{
final
AppContext
context
=
sunClipboard
.
contentsContext
;
if
(
context
==
null
)
{
return
;
}
if
(
disposedContext
==
null
||
context
==
disposedContext
)
{
owner
=
sunClipboard
.
owner
;
contents
=
sunClipboard
.
contents
;
sunClipboard
.
contentsContext
=
null
;
sunClipboard
.
owner
=
null
;
sunClipboard
.
contents
=
null
;
sunClipboard
.
clearNativeContext
();
context
.
removePropertyChangeListener
(
AppContext
.
DISPOSED_PROPERTY_NAME
,
sunClipboard
);
}
else
{
return
;
}
}
if
(
owner
!=
null
)
{
owner
.
lostOwnership
(
sunClipboard
,
contents
);
}
}
protected
abstract
void
clearNativeContext
();
protected
abstract
void
setContentsNative
(
Transferable
contents
);
...
...
test/java/awt/datatransfer/ClipboardInterVMTest/ClipboardInterVMTest.java
0 → 100644
浏览文件 @
67c0d3ff
/*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
@test
@bug 8071668
@summary Check whether clipboard see changes from external process after taking ownership
@author Anton Nashatyrev: area=datatransfer
@library /lib/testlibrary
@build jdk.testlibrary.Utils
@run main ClipboardInterVMTest
*/
import
jdk.testlibrary.Utils
;
import
java.awt.*
;
import
java.awt.datatransfer.*
;
import
java.io.BufferedReader
;
import
java.io.File
;
import
java.io.IOException
;
import
java.io.Reader
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
java.util.concurrent.CountDownLatch
;
import
java.util.concurrent.TimeUnit
;
public
class
ClipboardInterVMTest
{
static
CountDownLatch
lostOwnershipMonitor
=
new
CountDownLatch
(
1
);
static
CountDownLatch
flavorChangedMonitor
=
new
CountDownLatch
(
1
);
static
Process
process
;
public
static
void
main
(
String
[]
args
)
throws
Throwable
{
Clipboard
clip
=
Toolkit
.
getDefaultToolkit
().
getSystemClipboard
();
if
(
args
.
length
>
0
)
{
System
.
out
.
println
(
"Changing clip..."
);
clip
.
setContents
(
new
StringSelection
(
"pong"
),
null
);
System
.
out
.
println
(
"done"
);
// keeping this process running for a while since on Mac the clipboard
// will be invalidated via NSApplicationDidBecomeActiveNotification
// callback in the main process after this child process finishes
Thread
.
sleep
(
60
*
1000
);
return
;
};
clip
.
setContents
(
new
CustomSelection
(),
new
ClipboardOwner
()
{
@Override
public
void
lostOwnership
(
Clipboard
clipboard
,
Transferable
contents
)
{
System
.
out
.
println
(
"ClipboardInterVMTest.lostOwnership"
);
lostOwnershipMonitor
.
countDown
();
}
});
clip
.
addFlavorListener
(
new
FlavorListener
()
{
@Override
public
void
flavorsChanged
(
FlavorEvent
e
)
{
System
.
out
.
println
(
"ClipboardInterVMTest.flavorsChanged"
);
flavorChangedMonitor
.
countDown
();
}
});
System
.
out
.
println
(
"Starting external clipborad modifier..."
);
new
Thread
(()
->
runTest
(
ClipboardInterVMTest
.
class
.
getCanonicalName
(),
"pong"
)).
start
();
String
content
=
""
;
long
startTime
=
System
.
currentTimeMillis
();
while
(
System
.
currentTimeMillis
()
-
startTime
<
30
*
1000
)
{
Transferable
c
=
clip
.
getContents
(
null
);
if
(
c
.
isDataFlavorSupported
(
DataFlavor
.
plainTextFlavor
))
{
Reader
reader
=
DataFlavor
.
plainTextFlavor
.
getReaderForText
(
c
);
content
=
new
BufferedReader
(
reader
).
readLine
();
System
.
out
.
println
(
content
);
if
(
content
.
equals
(
"pong"
))
{
break
;
}
}
Thread
.
sleep
(
200
);
}
if
(!
lostOwnershipMonitor
.
await
(
10
,
TimeUnit
.
SECONDS
))
{
throw
new
RuntimeException
(
"No LostOwnership event received."
);
};
if
(!
flavorChangedMonitor
.
await
(
10
,
TimeUnit
.
SECONDS
))
{
throw
new
RuntimeException
(
"No LostOwnership event received."
);
};
if
(!
content
.
equals
(
"pong"
))
{
throw
new
RuntimeException
(
"Content was not passed."
);
}
process
.
destroy
();
System
.
out
.
println
(
"Passed."
);
}
private
static
void
runTest
(
String
main
,
String
...
args
)
{
try
{
List
<
String
>
opts
=
new
ArrayList
<>();
opts
.
add
(
getJavaExe
());
opts
.
addAll
(
Arrays
.
asList
(
Utils
.
getTestJavaOpts
()));
opts
.
add
(
"-cp"
);
opts
.
add
(
System
.
getProperty
(
"test.class.path"
,
System
.
getProperty
(
"java.class.path"
)));
opts
.
add
(
main
);
opts
.
addAll
(
Arrays
.
asList
(
args
));
ProcessBuilder
pb
=
new
ProcessBuilder
(
opts
.
toArray
(
new
String
[
0
]));
process
=
pb
.
start
();
}
catch
(
Throwable
throwable
)
{
throw
new
RuntimeException
(
throwable
);
}
}
private
static
String
getJavaExe
()
throws
IOException
{
File
p
=
new
File
(
System
.
getProperty
(
"java.home"
),
"bin"
);
File
j
=
new
File
(
p
,
"java"
);
if
(!
j
.
canRead
())
{
j
=
new
File
(
p
,
"java.exe"
);
}
if
(!
j
.
canRead
())
{
throw
new
RuntimeException
(
"Can't find java executable in "
+
p
);
}
return
j
.
getCanonicalPath
();
}
static
class
CustomSelection
implements
Transferable
{
private
static
final
DataFlavor
[]
flavors
=
{
DataFlavor
.
allHtmlFlavor
};
public
DataFlavor
[]
getTransferDataFlavors
()
{
return
flavors
;
}
public
boolean
isDataFlavorSupported
(
DataFlavor
flavor
)
{
return
flavors
[
0
].
equals
(
flavor
);
}
public
Object
getTransferData
(
DataFlavor
flavor
)
throws
UnsupportedFlavorException
,
java
.
io
.
IOException
{
if
(
isDataFlavorSupported
(
flavor
))
{
return
"ping"
;
}
else
{
throw
new
UnsupportedFlavorException
(
flavor
);
}
}
}
}
\ No newline at end of file
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录