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
  27   @summary switching user in XP causes an NPE in sun.awt.windows.WWindowPeer.displayChanged
  28   @requires (os.family == "windows")
  29   @modules java.desktop/java.awt.peer
  30   @modules java.desktop/sun.awt.windows
  31   @modules java.desktop/sun.awt
  32   @author son@sparc.spb.su: area=embedded
  33   @run main DisplayChangedTest
  34 */
  35 
  36 /**
  37  * DisplayChangedTest.java
  38  *
  39  * summary: switching user in XP causes an NPE in sun.awt.windows.WWindowPeer.displayChanged
  40  */
  41 
  42 import java.awt.Frame;
  43 import java.awt.Dialog;
  44 import java.awt.TextArea;
  45 import java.awt.peer.ComponentPeer;
  46 import java.awt.peer.FramePeer;
  47 import java.lang.reflect.Constructor;
  48 import java.lang.reflect.Method;
  49 import java.lang.reflect.Field;
  50 
  51 import sun.awt.AWTAccessor;
  52 
  53 public class DisplayChangedTest {
  54         
  55         /**
  56          * Test fails if it throws any exception.
  57          * @throws Exception
  58          */
  59         private void init() throws Exception    {
  60                 
  61                 if (!System.getProperty("os.name").startsWith("Windows")) {
  62                         System.out.println("This is Windows only test.");
  63                         return;
  64                 }
  65 
  66                 Frame frame = new Frame("AWT Frame");
  67                 frame.pack();
  68 
  69                 FramePeer frame_peer = AWTAccessor.getComponentAccessor().getPeer(frame);
  70                 Class comp_peer_class =
  71                                 Class.forName("sun.awt.windows.WComponentPeer");
  72                 Field hwnd_field = comp_peer_class.getDeclaredField("hwnd");
  73                 hwnd_field.setAccessible(true);
  74                 long hwnd = hwnd_field.getLong(frame_peer);
  75                 
  76                 Class clazz = Class.forName("sun.awt.windows.WEmbeddedFrame");
  77                 Constructor constructor = clazz.getConstructor (new Class [] {long.class});
  78                 Frame embedded_frame =
  79                                 (Frame) constructor.newInstance (new Object[] {new Long(hwnd)});;
  80                 frame.setVisible(true);
  81 
  82                 ComponentPeer peer = AWTAccessor.getComponentAccessor().getPeer(embedded_frame);
  83                 Class peerClass = peer.getClass();
  84 
  85                 Method displayChangedM =
  86                                 peerClass.getMethod("displayChanged", new Class[0]);
  87                 displayChangedM.invoke(peer, null);
  88                 embedded_frame.dispose();
  89                 frame.dispose();       
  90 
  91         }
  92 
  93 
  94         public static void main( String args[] ) throws Exception    {
  95                 new DisplayChangedTest().init();
  96         }
  97 
  98 }