src/solaris/classes/sun/awt/X11/XEmbedServerTester.java

Print this page




  64         this.parent = parent;
  65         focusedKind = -1;
  66         focusedServerComponent = -1;
  67         reparent = false;
  68         windowActive = false;
  69         xembedActive = false;
  70         my_version = XEmbedHelper.XEMBED_VERSION;
  71         mapped = XEmbedHelper.XEMBED_MAPPED;
  72         this.serverBounds = serverBounds;
  73         if (serverBounds.length < 5) {
  74             throw new IllegalArgumentException("There must be at least five areas: server-activation, server-deactivation, server-focus, " +
  75                                                "server-modal show, modal-close");
  76         }
  77         try {
  78             robot = new Robot();
  79             robot.setAutoDelay(100);
  80         } catch (Exception e) {
  81             throw new RuntimeException("Can't create robot");
  82         }
  83         initAccel();

  84         xembedLog.finer("XEmbed client(tester), embedder window: " + Long.toHexString(parent));
  85     }

  86 
  87     public static XEmbedServerTester getTester(Rectangle serverBounds[], long parent) {
  88         return new XEmbedServerTester(serverBounds, parent);
  89     }
  90 
  91     private void dumpReceivedEvents() {

  92         xembedLog.finer("Events received so far:");
  93         int pos = 0;
  94         for (Integer event : events) {
  95             xembedLog.finer((pos++) + ":" + XEmbedHelper.msgidToString(event));
  96         }
  97         xembedLog.finer("End of event dump");
  98     }

  99 
 100     public void test1_1() {
 101         int res = embedCompletely();
 102         waitWindowActivated(res);
 103         requestFocus();
 104         deactivateServer();
 105         res = activateServer(getEventPos());
 106         waitFocusGained(res);
 107         checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
 108     }
 109 
 110     public void test1_2() {
 111         int res = embedCompletely();
 112         waitWindowActivated(res);
 113         requestFocus();
 114         checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
 115     }
 116 
 117     public void test1_3() {
 118         embedCompletely();


 374         embedCompletely();
 375         requestFocus();
 376         int res = pressAccelKey();
 377         waitForEvent(res, SYSTEM_EVENT_MASK | KeyPress);
 378     }
 379 
 380     private int embed() {
 381         int res = getEventPos();
 382         XToolkit.awtLock();
 383         try {
 384             XCreateWindowParams params =
 385                 new XCreateWindowParams(new Object[] {
 386                     XBaseWindow.PARENT_WINDOW, Long.valueOf(reparent?XToolkit.getDefaultRootWindow():parent),
 387                     XBaseWindow.BOUNDS, initialBounds,
 388                     XBaseWindow.EMBEDDED, Boolean.TRUE,
 389                     XBaseWindow.VISIBLE, Boolean.valueOf(mapped == XEmbedHelper.XEMBED_MAPPED),
 390                     XBaseWindow.EVENT_MASK, Long.valueOf(VisibilityChangeMask | StructureNotifyMask |
 391                                                      SubstructureNotifyMask | KeyPressMask)});
 392             window = new XBaseWindow(params);
 393 

 394             xembedLog.finer("Created tester window: " + window);

 395 
 396             XToolkit.addEventDispatcher(window.getWindow(), this);
 397             updateEmbedInfo();
 398             if (reparent) {
 399                 xembedLog.finer("Reparenting to embedder");
 400                 XlibWrapper.XReparentWindow(XToolkit.getDisplay(), window.getWindow(), parent, 0, 0);
 401             }
 402         } finally {
 403             XToolkit.awtUnlock();
 404         }
 405         return res;
 406     }
 407 
 408     private void updateEmbedInfo() {
 409         long[] info = new long[] { my_version, mapped };
 410         long data = Native.card32ToData(info);
 411         try {
 412             XEmbedHelper.XEmbedInfo.setAtomData(window.getWindow(), data, info.length);
 413         } finally {
 414             XEmbedHelper.unsafe.freeMemory(data);


 512         waitForEvent(pos, XEmbedHelper.XEMBED_FOCUS_IN);
 513     }
 514     private void waitFocusLost(int pos) {
 515         waitForEvent(pos, XEmbedHelper.XEMBED_FOCUS_OUT);
 516     }
 517     private void waitWindowActivated(int pos) {
 518         waitForEvent(pos, XEmbedHelper.XEMBED_WINDOW_ACTIVATE);
 519     }
 520     private void waitWindowDeactivated(int pos) {
 521         waitForEvent(pos, XEmbedHelper.XEMBED_WINDOW_DEACTIVATE);
 522     }
 523 
 524     private void waitSystemEvent(int position, int event) {
 525         waitForEvent(position, event | SYSTEM_EVENT_MASK);
 526     }
 527 
 528     private void waitForEvent(int position, int event) {
 529         synchronized(EVENT_LOCK) {
 530             // Check for already received events after the request
 531             if (checkEventList(position, event) != -1) {

 532                 xembedLog.finer("The event " + XEmbedHelper.msgidToString(event) + " has already been received");

 533                 return;
 534             }
 535 
 536             if (eventReceived == event) {
 537                 // Already received

 538                 xembedLog.finer("Already received " + XEmbedHelper.msgidToString(event));

 539                 return;
 540             }
 541             eventReceived = -1;
 542             eventWaited = event;

 543             xembedLog.finer("Waiting for " + XEmbedHelper.msgidToString(event) + " starting from " + position);

 544             try {
 545                 EVENT_LOCK.wait(3000);
 546             } catch (InterruptedException ie) {
 547                 xembedLog.warning("Event wait interrupted", ie);
 548             }
 549             eventWaited = -1;
 550             if (checkEventList(position, event) == -1) {
 551                 dumpReceivedEvents();
 552                 throw new RuntimeException("Didn't receive event " + XEmbedHelper.msgidToString(event) + " but recevied " + XEmbedHelper.msgidToString(eventReceived));
 553             } else {

 554                 xembedLog.finer("Successfully recevied " + XEmbedHelper.msgidToString(event));
 555             }
 556         }
 557     }

 558     /**
 559      * Checks if the <code>event</code> is already in a list at position >= <code>position</code>
 560      */
 561     private int checkEventList(int position, int event) {
 562         if (position == -1) {
 563             return -1;
 564         }
 565         synchronized(EVENT_LOCK) {
 566             for (int i = position; i < events.size(); i++) {
 567                 if (events.get(i) == event) {
 568                     return i;
 569                 }
 570             }
 571             return -1;
 572         }
 573     }
 574 
 575     private void checkFocusedServerNext() {
 576         if (focusedServerComponent != 0) {
 577             throw new RuntimeException("Wrong focused server component, should be 0, but it is " + focusedServerComponent);


 617             throw new RuntimeException("Client is not mapped");
 618         }
 619     }
 620     private void checkNotMapped() {
 621         if (XlibUtil.getWindowMapState(window.getWindow()) != IsUnmapped) {
 622             throw new RuntimeException("Client is mapped");
 623         }
 624     }
 625 
 626     private void sendMessage(int message) {
 627         xembed.sendMessage(parent, message);
 628     }
 629     private void sendMessage(int message, int detail, long data1, long data2) {
 630         xembed.sendMessage(parent, message, detail, data1, data2);
 631     }
 632 
 633     public void dispatchEvent(XEvent ev) {
 634         if (ev.get_type() == ClientMessage) {
 635             XClientMessageEvent msg = ev.get_xclient();
 636             if (msg.get_message_type() == xembed.XEmbed.getAtom()) {
 637                 if (xembedLog.isLoggable(PlatformLogger.FINE)) xembedLog.fine("Embedded message: " + XEmbedHelper.msgidToString((int)msg.get_data(1)));


 638                 switch ((int)msg.get_data(1)) {
 639                   case XEmbedHelper.XEMBED_EMBEDDED_NOTIFY: // Notification about embedding protocol start
 640                       xembedActive = true;
 641                       server_version = (int)msg.get_data(3);
 642                       break;
 643                   case XEmbedHelper.XEMBED_WINDOW_ACTIVATE:
 644                       windowActive = true;
 645                       break;
 646                   case XEmbedHelper.XEMBED_WINDOW_DEACTIVATE:
 647                       windowActive = false;
 648                       break;
 649                   case XEmbedHelper.XEMBED_FOCUS_IN: // We got focus!
 650                       focused = true;
 651                       focusedKind = (int)msg.get_data(2);
 652                       break;
 653                   case XEmbedHelper.XEMBED_FOCUS_OUT:
 654                       focused = false;
 655                       focusedKind = XEmbedHelper.XEMBED_FOCUS_OUT;
 656                       focusedServerComponent = (int)msg.get_data(2);
 657                       break;
 658                 }
 659                 synchronized(EVENT_LOCK) {
 660                     events.add((int)msg.get_data(1));
 661 

 662                     xembedLog.finer("Tester is waiting for " +  XEmbedHelper.msgidToString(eventWaited));

 663                     if ((int)msg.get_data(1) == eventWaited) {
 664                         eventReceived = (int)msg.get_data(1);

 665                         xembedLog.finer("Notifying waiting object for event " + System.identityHashCode(EVENT_LOCK));

 666                         EVENT_LOCK.notifyAll();
 667                     }
 668                 }
 669             }
 670         } else {
 671             synchronized(EVENT_LOCK) {
 672                 int eventID = (int)ev.get_type() | SYSTEM_EVENT_MASK;
 673                 events.add(eventID);
 674 

 675                 xembedLog.finer("Tester is waiting for " + XEmbedHelper.msgidToString(eventWaited) + ", but we received " + ev + "(" + XEmbedHelper.msgidToString(eventID) + ")");

 676                 if (eventID == eventWaited) {
 677                     eventReceived = eventID;

 678                     xembedLog.finer("Notifying waiting object" + System.identityHashCode(EVENT_LOCK));

 679                     EVENT_LOCK.notifyAll();
 680                 }
 681             }
 682         }
 683     }
 684 
 685     private void sleep(int amount) {
 686         try {
 687             Thread.sleep(amount);
 688         } catch (Exception e) {
 689         }
 690     }
 691 
 692     private void registerAccelerator() {
 693         sendMessage(XEmbedHelper.XEMBED_REGISTER_ACCELERATOR, 1, accel_keysym, accel_mods);
 694     }
 695 
 696     private void unregisterAccelerator() {
 697         sendMessage(XEmbedHelper.XEMBED_UNREGISTER_ACCELERATOR, 1, 0, 0);
 698     }




  64         this.parent = parent;
  65         focusedKind = -1;
  66         focusedServerComponent = -1;
  67         reparent = false;
  68         windowActive = false;
  69         xembedActive = false;
  70         my_version = XEmbedHelper.XEMBED_VERSION;
  71         mapped = XEmbedHelper.XEMBED_MAPPED;
  72         this.serverBounds = serverBounds;
  73         if (serverBounds.length < 5) {
  74             throw new IllegalArgumentException("There must be at least five areas: server-activation, server-deactivation, server-focus, " +
  75                                                "server-modal show, modal-close");
  76         }
  77         try {
  78             robot = new Robot();
  79             robot.setAutoDelay(100);
  80         } catch (Exception e) {
  81             throw new RuntimeException("Can't create robot");
  82         }
  83         initAccel();
  84         if (xembedLog.isLoggable(PlatformLogger.FINER)) {
  85             xembedLog.finer("XEmbed client(tester), embedder window: " + Long.toHexString(parent));
  86         }
  87     }
  88 
  89     public static XEmbedServerTester getTester(Rectangle serverBounds[], long parent) {
  90         return new XEmbedServerTester(serverBounds, parent);
  91     }
  92 
  93     private void dumpReceivedEvents() {
  94         if (xembedLog.isLoggable(PlatformLogger.FINER)) {
  95             xembedLog.finer("Events received so far:");
  96             int pos = 0;
  97             for (Integer event : events) {
  98                 xembedLog.finer((pos++) + ":" + XEmbedHelper.msgidToString(event));
  99             }
 100             xembedLog.finer("End of event dump");
 101         }
 102     }
 103 
 104     public void test1_1() {
 105         int res = embedCompletely();
 106         waitWindowActivated(res);
 107         requestFocus();
 108         deactivateServer();
 109         res = activateServer(getEventPos());
 110         waitFocusGained(res);
 111         checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
 112     }
 113 
 114     public void test1_2() {
 115         int res = embedCompletely();
 116         waitWindowActivated(res);
 117         requestFocus();
 118         checkFocusGained(XEmbedHelper.XEMBED_FOCUS_CURRENT);
 119     }
 120 
 121     public void test1_3() {
 122         embedCompletely();


 378         embedCompletely();
 379         requestFocus();
 380         int res = pressAccelKey();
 381         waitForEvent(res, SYSTEM_EVENT_MASK | KeyPress);
 382     }
 383 
 384     private int embed() {
 385         int res = getEventPos();
 386         XToolkit.awtLock();
 387         try {
 388             XCreateWindowParams params =
 389                 new XCreateWindowParams(new Object[] {
 390                     XBaseWindow.PARENT_WINDOW, Long.valueOf(reparent?XToolkit.getDefaultRootWindow():parent),
 391                     XBaseWindow.BOUNDS, initialBounds,
 392                     XBaseWindow.EMBEDDED, Boolean.TRUE,
 393                     XBaseWindow.VISIBLE, Boolean.valueOf(mapped == XEmbedHelper.XEMBED_MAPPED),
 394                     XBaseWindow.EVENT_MASK, Long.valueOf(VisibilityChangeMask | StructureNotifyMask |
 395                                                      SubstructureNotifyMask | KeyPressMask)});
 396             window = new XBaseWindow(params);
 397 
 398             if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 399                 xembedLog.finer("Created tester window: " + window);
 400             }
 401 
 402             XToolkit.addEventDispatcher(window.getWindow(), this);
 403             updateEmbedInfo();
 404             if (reparent) {
 405                 xembedLog.finer("Reparenting to embedder");
 406                 XlibWrapper.XReparentWindow(XToolkit.getDisplay(), window.getWindow(), parent, 0, 0);
 407             }
 408         } finally {
 409             XToolkit.awtUnlock();
 410         }
 411         return res;
 412     }
 413 
 414     private void updateEmbedInfo() {
 415         long[] info = new long[] { my_version, mapped };
 416         long data = Native.card32ToData(info);
 417         try {
 418             XEmbedHelper.XEmbedInfo.setAtomData(window.getWindow(), data, info.length);
 419         } finally {
 420             XEmbedHelper.unsafe.freeMemory(data);


 518         waitForEvent(pos, XEmbedHelper.XEMBED_FOCUS_IN);
 519     }
 520     private void waitFocusLost(int pos) {
 521         waitForEvent(pos, XEmbedHelper.XEMBED_FOCUS_OUT);
 522     }
 523     private void waitWindowActivated(int pos) {
 524         waitForEvent(pos, XEmbedHelper.XEMBED_WINDOW_ACTIVATE);
 525     }
 526     private void waitWindowDeactivated(int pos) {
 527         waitForEvent(pos, XEmbedHelper.XEMBED_WINDOW_DEACTIVATE);
 528     }
 529 
 530     private void waitSystemEvent(int position, int event) {
 531         waitForEvent(position, event | SYSTEM_EVENT_MASK);
 532     }
 533 
 534     private void waitForEvent(int position, int event) {
 535         synchronized(EVENT_LOCK) {
 536             // Check for already received events after the request
 537             if (checkEventList(position, event) != -1) {
 538                 if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 539                     xembedLog.finer("The event " + XEmbedHelper.msgidToString(event) + " has already been received");
 540                 }
 541                 return;
 542             }
 543 
 544             if (eventReceived == event) {
 545                 // Already received
 546                 if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 547                     xembedLog.finer("Already received " + XEmbedHelper.msgidToString(event));
 548                 }
 549                 return;
 550             }
 551             eventReceived = -1;
 552             eventWaited = event;
 553             if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 554                 xembedLog.finer("Waiting for " + XEmbedHelper.msgidToString(event) + " starting from " + position);
 555             }
 556             try {
 557                 EVENT_LOCK.wait(3000);
 558             } catch (InterruptedException ie) {
 559                 xembedLog.warning("Event wait interrupted", ie);
 560             }
 561             eventWaited = -1;
 562             if (checkEventList(position, event) == -1) {
 563                 dumpReceivedEvents();
 564                 throw new RuntimeException("Didn't receive event " + XEmbedHelper.msgidToString(event) + " but recevied " + XEmbedHelper.msgidToString(eventReceived));
 565             } else {
 566                 if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 567                     xembedLog.finer("Successfully recevied " + XEmbedHelper.msgidToString(event));
 568                 }
 569             }
 570         }
 571     }
 572     /**
 573      * Checks if the <code>event</code> is already in a list at position >= <code>position</code>
 574      */
 575     private int checkEventList(int position, int event) {
 576         if (position == -1) {
 577             return -1;
 578         }
 579         synchronized(EVENT_LOCK) {
 580             for (int i = position; i < events.size(); i++) {
 581                 if (events.get(i) == event) {
 582                     return i;
 583                 }
 584             }
 585             return -1;
 586         }
 587     }
 588 
 589     private void checkFocusedServerNext() {
 590         if (focusedServerComponent != 0) {
 591             throw new RuntimeException("Wrong focused server component, should be 0, but it is " + focusedServerComponent);


 631             throw new RuntimeException("Client is not mapped");
 632         }
 633     }
 634     private void checkNotMapped() {
 635         if (XlibUtil.getWindowMapState(window.getWindow()) != IsUnmapped) {
 636             throw new RuntimeException("Client is mapped");
 637         }
 638     }
 639 
 640     private void sendMessage(int message) {
 641         xembed.sendMessage(parent, message);
 642     }
 643     private void sendMessage(int message, int detail, long data1, long data2) {
 644         xembed.sendMessage(parent, message, detail, data1, data2);
 645     }
 646 
 647     public void dispatchEvent(XEvent ev) {
 648         if (ev.get_type() == ClientMessage) {
 649             XClientMessageEvent msg = ev.get_xclient();
 650             if (msg.get_message_type() == xembed.XEmbed.getAtom()) {
 651                 if (xembedLog.isLoggable(PlatformLogger.FINE)) {
 652                     xembedLog.fine("Embedded message: " + XEmbedHelper.msgidToString((int)msg.get_data(1)));
 653                 }
 654                 switch ((int)msg.get_data(1)) {
 655                   case XEmbedHelper.XEMBED_EMBEDDED_NOTIFY: // Notification about embedding protocol start
 656                       xembedActive = true;
 657                       server_version = (int)msg.get_data(3);
 658                       break;
 659                   case XEmbedHelper.XEMBED_WINDOW_ACTIVATE:
 660                       windowActive = true;
 661                       break;
 662                   case XEmbedHelper.XEMBED_WINDOW_DEACTIVATE:
 663                       windowActive = false;
 664                       break;
 665                   case XEmbedHelper.XEMBED_FOCUS_IN: // We got focus!
 666                       focused = true;
 667                       focusedKind = (int)msg.get_data(2);
 668                       break;
 669                   case XEmbedHelper.XEMBED_FOCUS_OUT:
 670                       focused = false;
 671                       focusedKind = XEmbedHelper.XEMBED_FOCUS_OUT;
 672                       focusedServerComponent = (int)msg.get_data(2);
 673                       break;
 674                 }
 675                 synchronized(EVENT_LOCK) {
 676                     events.add((int)msg.get_data(1));
 677 
 678                     if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 679                         xembedLog.finer("Tester is waiting for " +  XEmbedHelper.msgidToString(eventWaited));
 680                     }
 681                     if ((int)msg.get_data(1) == eventWaited) {
 682                         eventReceived = (int)msg.get_data(1);
 683                         if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 684                             xembedLog.finer("Notifying waiting object for event " + System.identityHashCode(EVENT_LOCK));
 685                         }
 686                         EVENT_LOCK.notifyAll();
 687                     }
 688                 }
 689             }
 690         } else {
 691             synchronized(EVENT_LOCK) {
 692                 int eventID = (int)ev.get_type() | SYSTEM_EVENT_MASK;
 693                 events.add(eventID);
 694 
 695                 if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 696                     xembedLog.finer("Tester is waiting for " + XEmbedHelper.msgidToString(eventWaited) + ", but we received " + ev + "(" + XEmbedHelper.msgidToString(eventID) + ")");
 697                 }
 698                 if (eventID == eventWaited) {
 699                     eventReceived = eventID;
 700                     if (xembedLog.isLoggable(PlatformLogger.FINER)) {
 701                         xembedLog.finer("Notifying waiting object" + System.identityHashCode(EVENT_LOCK));
 702                     }
 703                     EVENT_LOCK.notifyAll();
 704                 }
 705             }
 706         }
 707     }
 708 
 709     private void sleep(int amount) {
 710         try {
 711             Thread.sleep(amount);
 712         } catch (Exception e) {
 713         }
 714     }
 715 
 716     private void registerAccelerator() {
 717         sendMessage(XEmbedHelper.XEMBED_REGISTER_ACCELERATOR, 1, accel_keysym, accel_mods);
 718     }
 719 
 720     private void unregisterAccelerator() {
 721         sendMessage(XEmbedHelper.XEMBED_UNREGISTER_ACCELERATOR, 1, 0, 0);
 722     }