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() {
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);
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 }
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() {
|
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.Level.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.Level.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() {
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.Level.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);
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.Level.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.Level.FINER)) {
547 xembedLog.finer("Already received " + XEmbedHelper.msgidToString(event));
548 }
549 return;
550 }
551 eventReceived = -1;
552 eventWaited = event;
553 if (xembedLog.isLoggable(PlatformLogger.Level.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.Level.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 }
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.Level.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.Level.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.Level.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.Level.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.Level.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() {
|