1/*
2 * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24/*
25 @test
26 @bug 4980592 8171363
27 @summary   switching user in XP causes an NPE in
28            sun.awt.windows.WWindowPeer.displayChanged
29 @requires (os.family == "windows")
30 @modules java.desktop/java.awt.peer
31 @modules java.desktop/sun.awt.windows:open
32 @modules java.desktop/sun.awt
33 @author son@sparc.spb.su: area=embedded
34 @run main DisplayChangedTest
35 */
36/**
37 * DisplayChangedTest.java
38 *
39 * summary: switching user in XP causes an NPE in
40 * sun.awt.windows.WWindowPeer.displayChanged
41 */
42import java.awt.Frame;
43import java.awt.Dialog;
44import java.awt.TextArea;
45import java.awt.peer.ComponentPeer;
46import java.awt.peer.FramePeer;
47import java.lang.reflect.Constructor;
48import java.lang.reflect.Method;
49import java.lang.reflect.Field;
50
51import sun.awt.AWTAccessor;
52
53public class DisplayChangedTest {
54
55    /**
56     * Test fails if it throws any exception.
57     *
58     * @throws Exception
59     */
60    private void init() throws Exception {
61
62        if (!System.getProperty("os.name").startsWith("Windows")) {
63            System.out.println("This is Windows only test.");
64            return;
65        }
66
67        Frame frame = new Frame("AWT Frame");
68        frame.pack();
69
70        FramePeer frame_peer = AWTAccessor.getComponentAccessor()
71                .getPeer(frame);
72        Class comp_peer_class = Class.forName("sun.awt.windows.WComponentPeer");
73        Field hwnd_field = comp_peer_class.getDeclaredField("hwnd");
74        hwnd_field.setAccessible(true);
75        long hwnd = hwnd_field.getLong(frame_peer);
76
77        Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame");
78        Constructor constructor = clazz
79                .getConstructor(new Class[]{long.class});
80        Frame embedded_frame = (Frame) constructor
81                .newInstance(new Object[]{new Long(hwnd)});
82        frame.setVisible(true);
83
84        ComponentPeer peer = AWTAccessor.getComponentAccessor().getPeer(
85                embedded_frame);
86        Class peerClass = peer.getClass();
87        Method displayChangedM = peerClass.getMethod("displayChanged",
88                new Class[0]);
89        displayChangedM.invoke(peer, null);
90        embedded_frame.dispose();
91        frame.dispose();
92
93    }
94
95    public static void main(String args[]) throws Exception {
96        new DisplayChangedTest().init();
97    }
98
99}
100