comparison dwt/browser/Mozilla.d @ 354:59b54fea05d0

Fixes for XPCOM 1.9 and anonymous classes
author john@andLinux
date Sun, 14 Dec 2008 02:13:20 -0500
parents a3c5f744d03f
children 8ebacc5c07dc
comparison
equal deleted inserted replaced
353:7f3013c93a95 354:59b54fea05d0
405 if (rc !is XPCOM.NS_OK) { 405 if (rc !is XPCOM.NS_OK) {
406 browser.dispose (); 406 browser.dispose ();
407 error (rc, __FILE__, __LINE__); 407 error (rc, __FILE__, __LINE__);
408 } 408 }
409 +/ // No need for double layer initialization in DWT; XPCOMInit was glued 409 +/ // No need for double layer initialization in DWT; XPCOMInit was glued
410 // At this stage we know that XULRunner is available, but we don't know
411 // TODO: determine if
412 XPCOMWasGlued = true; 410 XPCOMWasGlued = true;
413 411
414 /* 412 /*
415 * Remove the trailing xpcom lib name from mozillaPath because the 413 * Remove the trailing xpcom lib name from mozillaPath because the
416 * Mozilla.initialize and NS_InitXPCOM2 invocations require a directory name only. 414 * Mozilla.initialize and NS_InitXPCOM2 invocations require a directory name only.
1058 Initialized = true; 1056 Initialized = true;
1059 } 1057 }
1060 1058
1061 if (display.getData (DISPOSE_LISTENER_HOOKED) is null) { 1059 if (display.getData (DISPOSE_LISTENER_HOOKED) is null) {
1062 display.setData (DISPOSE_LISTENER_HOOKED, stringcast(DISPOSE_LISTENER_HOOKED)); 1060 display.setData (DISPOSE_LISTENER_HOOKED, stringcast(DISPOSE_LISTENER_HOOKED));
1063 display.addListener (DWT.Dispose, new class() Listener { 1061 display.addListener (DWT.Dispose, dgListener( &handleDisposeEvent, display ) );
1064 public void handleEvent (Event event) {
1065 if (BrowserCount > 0) return; /* another display is still active */
1066
1067 nsIServiceManager serviceManager;
1068 //int /*long*/[] result = new int /*long*/[1];
1069 int rc = XPCOM.NS_GetServiceManager (&serviceManager);
1070 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1071 if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
1072
1073 //nsIServiceManager serviceManager = new nsIServiceManager (result[0]);
1074 //result[0] = 0;
1075 //byte[] buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_OBSERVER_CONTRACTID, true);
1076 nsIObserverService observerService;
1077 rc = serviceManager.GetServiceByContractID (XPCOM.NS_OBSERVER_CONTRACTID.ptr, &nsIObserverService.IID, cast(void**)&observerService);
1078 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1079 if (observerService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
1080
1081 //nsIObserverService observerService = new nsIObserverService (result[0]);
1082 //result[0] = 0;
1083 //buffer = MozillaDelegate.wcsToMbcs (null, PROFILE_BEFORE_CHANGE, true);
1084 //int length = SHUTDOWN_PERSIST.length ();
1085 //char[] chars = new char [length + 1];
1086 //SHUTDOWN_PERSIST.getChars (0, length, chars, 0);
1087 rc = observerService.NotifyObservers (null, PROFILE_BEFORE_CHANGE.ptr, SHUTDOWN_PERSIST.toString16().toString16z());
1088 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1089 observerService.Release ();
1090
1091 if (LocationProvider !is null) {
1092 String prefsLocation = LocationProvider.profilePath ~ AppFileLocProvider.PREFERENCES_FILE;
1093 scope auto pathString = new nsEmbedString (prefsLocation.toString16());
1094 nsILocalFile localFile;
1095 rc = XPCOM.NS_NewLocalFile (cast(nsAString*)pathString, 1, &localFile);
1096 if (rc !is XPCOM.NS_OK) Mozilla.error (rc, __FILE__, __LINE__);
1097 if (localFile is null) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER);
1098 //pathString.dispose ();
1099
1100 //nsILocalFile localFile = new nsILocalFile (result [0]);
1101 //result[0] = 0;
1102 nsIFile prefFile;
1103 rc = localFile.QueryInterface (&nsIFile.IID, cast(void**)&prefFile);
1104 if (rc !is XPCOM.NS_OK) Mozilla.error (rc, __FILE__, __LINE__);
1105 if (prefFile is null) Mozilla.error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
1106 localFile.Release ();
1107
1108 //nsIFile prefFile = new nsIFile (result[0]);
1109 //result[0] = 0;
1110 nsIPrefService prefService;
1111 //buffer = MozillaDelegate.wcsToMbcs (null, XPCOM.NS_PREFSERVICE_CONTRACTID, true);
1112 rc = serviceManager.GetServiceByContractID (XPCOM.NS_PREFSERVICE_CONTRACTID.ptr, &nsIPrefService.IID, cast(void**)&prefService);
1113 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1114 if (prefService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
1115
1116 //nsIPrefService prefService = new nsIPrefService (result[0]);
1117 //result[0] = 0;
1118 rc = prefService.SavePrefFile(prefFile);
1119 prefService.Release ();
1120 prefFile.Release ();
1121 }
1122 serviceManager.Release ();
1123
1124 if (XPCOMWasGlued) {
1125 // TODO: is there a difference between two startup methhods? Glue functions are same.
1126 /*
1127 * XULRunner 1.9 can crash on Windows if XPCOMGlueShutdown is invoked here,
1128 * presumably because one or more of its unloaded symbols are referenced when
1129 * this callback returns. The workaround is to delay invoking XPCOMGlueShutdown
1130 * so that its symbols are still available once this callback returns.
1131 */
1132 display.asyncExec (new class() Runnable {
1133 public void run () {
1134 XPCOMInit.XPCOMGlueShutdown ();
1135 }
1136 });
1137 XPCOMWasGlued = false;
1138 }
1139 if (XPCOMInitWasGlued) {
1140 XPCOMInit.XPCOMGlueShutdown ();
1141 XPCOMInitWasGlued = false;
1142 }
1143 Initialized = false;
1144 }
1145 });
1146 } 1062 }
1147 1063
1148 BrowserCount++; 1064 BrowserCount++;
1149 nsIComponentManager componentManager; 1065 nsIComponentManager componentManager;
1150 int rc = XPCOM.NS_GetComponentManager (&componentManager); 1066 int rc = XPCOM.NS_GetComponentManager (&componentManager);
1350 browser.dispose (); 1266 browser.dispose ();
1351 error (rc, __FILE__, __LINE__); 1267 error (rc, __FILE__, __LINE__);
1352 } 1268 }
1353 1269
1354 mozDelegate.init (); 1270 mozDelegate.init ();
1355 1271
1356 listener = new class () Listener { 1272 int[] folderEvents = [
1357 public void handleEvent (Event event) { 1273 DWT.Dispose,
1358 Control control = cast(Control)this.outer.browser; 1274 DWT.Resize,
1359 Browser browser = this.outer.browser; 1275 DWT.FocusIn,
1276 DWT.Activate,
1277 DWT.Deactivate,
1278 DWT.Show,
1279 DWT.KeyDown // needed to make browser traversable
1280 ];
1281
1282 for (int i = 0; i < folderEvents.length; i++) {
1283 browser.addListener (folderEvents[i], dgListener( &handleFolderEvent ));
1284 }
1285 }
1286
1287 extern(D)
1288 private void handleDisposeEvent (Event event, Display display) {
1289 if (BrowserCount > 0) return; /* another display is still active */
1290
1291 nsIServiceManager serviceManager;
1292
1293 int rc = XPCOM.NS_GetServiceManager (&serviceManager);
1294 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1295 if (serviceManager is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
1296
1297 nsIObserverService observerService;
1298 rc = serviceManager.GetServiceByContractID (XPCOM.NS_OBSERVER_CONTRACTID.ptr, &nsIObserverService.IID, cast(void**)&observerService);
1299 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1300 if (observerService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
1301
1302 rc = observerService.NotifyObservers (null, PROFILE_BEFORE_CHANGE.ptr, SHUTDOWN_PERSIST.toString16().toString16z());
1303 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1304 observerService.Release ();
1305
1306 if (LocationProvider !is null) {
1307 String prefsLocation = LocationProvider.profilePath ~ AppFileLocProvider.PREFERENCES_FILE;
1308 scope auto pathString = new nsEmbedString (prefsLocation.toString16());
1309 nsILocalFile localFile;
1310 rc = XPCOM.NS_NewLocalFile (cast(nsAString*)pathString, 1, &localFile);
1311 if (rc !is XPCOM.NS_OK) Mozilla.error (rc, __FILE__, __LINE__);
1312 if (localFile is null) Mozilla.error (XPCOM.NS_ERROR_NULL_POINTER);
1313
1314 nsIFile prefFile;
1315 rc = localFile.QueryInterface (&nsIFile.IID, cast(void**)&prefFile);
1316 if (rc !is XPCOM.NS_OK) Mozilla.error (rc, __FILE__, __LINE__);
1317 if (prefFile is null) Mozilla.error (XPCOM.NS_ERROR_NO_INTERFACE, __FILE__, __LINE__);
1318 localFile.Release ();
1319
1320 nsIPrefService prefService;
1321 rc = serviceManager.GetServiceByContractID (XPCOM.NS_PREFSERVICE_CONTRACTID.ptr, &nsIPrefService.IID, cast(void**)&prefService);
1322 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
1323 if (prefService is null) error (XPCOM.NS_NOINTERFACE, __FILE__, __LINE__);
1324
1325 rc = prefService.SavePrefFile(prefFile);
1326 prefService.Release ();
1327 prefFile.Release ();
1328 }
1329 serviceManager.Release ();
1330
1331 if (XPCOMWasGlued) {
1332 /*
1333 * XULRunner 1.9 can crash on Windows if XPCOMGlueShutdown is invoked here,
1334 * presumably because one or more of its unloaded symbols are referenced when
1335 * this callback returns. The workaround is to delay invoking XPCOMGlueShutdown
1336 * so that its symbols are still available once this callback returns.
1337 */
1338 display.asyncExec (new class() Runnable {
1339 public void run () {
1340 XPCOMInit.XPCOMGlueShutdown ();
1341 }
1342 });
1343 XPCOMWasGlued = XPCOMInitWasGlued = false;
1344 }
1345
1346 Initialized = false;
1347 }
1348
1349
1350 extern(D)
1351 private void handleFolderEvent (Event event) {
1352 Control control = cast(Control)browser;
1360 switch (event.type) { 1353 switch (event.type) {
1361 case DWT.Dispose: { 1354 case DWT.Dispose: {
1362 /* make this handler run after other dispose listeners */ 1355 /* make this handler run after other dispose listeners */
1363 if (ignoreDispose) { 1356 if (ignoreDispose) {
1364 ignoreDispose = false; 1357 ignoreDispose = false;
1392 onResize (); 1385 onResize ();
1393 } 1386 }
1394 }); 1387 });
1395 break; 1388 break;
1396 } 1389 }
1397 } 1390 default: break;
1398 } 1391 }
1399 }; 1392 }
1400 int[] folderEvents = [ 1393
1401 DWT.Dispose,
1402 DWT.Resize,
1403 DWT.FocusIn,
1404 DWT.Activate,
1405 DWT.Deactivate,
1406 DWT.Show,
1407 DWT.KeyDown // needed to make browser traversable
1408 ];
1409 for (int i = 0; i < folderEvents.length; i++) {
1410 browser.addListener (folderEvents[i], listener);
1411 }
1412 }
1413
1414 extern(D) 1394 extern(D)
1415 public bool back () { 1395 public bool back () {
1416 if (awaitingNavigate) return false; 1396 if (awaitingNavigate) return false;
1417 1397
1418 //int /*long*/[] result = new int /*long*/[1]; 1398 //int /*long*/[] result = new int /*long*/[1];
2777 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__); 2757 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
2778 rc = domMouseEvent.GetScreenY (&aScreenY); 2758 rc = domMouseEvent.GetScreenY (&aScreenY);
2779 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__); 2759 if (rc !is XPCOM.NS_OK) error (rc, __FILE__, __LINE__);
2780 domMouseEvent.Release (); 2760 domMouseEvent.Release ();
2781 2761
2782 Event event; 2762 auto event = new Event;
2783 event.x = aScreenX; 2763 event.x = aScreenX;
2784 event.y = aScreenY; 2764 event.y = aScreenY;
2785 browser.notifyListeners (DWT.MenuDetect, event); 2765 browser.notifyListeners (DWT.MenuDetect, event);
2786 if (!event.doit) return XPCOM.NS_OK; 2766 if (!event.doit) return XPCOM.NS_OK;
2787 Menu menu = browser.getMenu (); 2767 Menu menu = browser.getMenu ();
3116 */ 3096 */
3117 switch (lastKeyCode) { 3097 switch (lastKeyCode) {
3118 case DWT.CAPS_LOCK: 3098 case DWT.CAPS_LOCK:
3119 case DWT.NUM_LOCK: 3099 case DWT.NUM_LOCK:
3120 case DWT.SCROLL_LOCK: return XPCOM.NS_OK; 3100 case DWT.SCROLL_LOCK: return XPCOM.NS_OK;
3101 default: break;
3121 } 3102 }
3122 3103
3123 //int /*long*/[] result = new int /*long*/[1]; 3104 //int /*long*/[] result = new int /*long*/[1];
3124 nsIDOMKeyEvent domKeyEvent; 3105 nsIDOMKeyEvent domKeyEvent;
3125 rc = event.QueryInterface (&nsIDOMKeyEvent.IID, cast(void**)&domKeyEvent); 3106 rc = event.QueryInterface (&nsIDOMKeyEvent.IID, cast(void**)&domKeyEvent);
3148 case DWT.TAB: lastCharCode = DWT.TAB; break; 3129 case DWT.TAB: lastCharCode = DWT.TAB; break;
3149 case DWT.CR: lastCharCode = DWT.CR; break; 3130 case DWT.CR: lastCharCode = DWT.CR; break;
3150 case DWT.BS: lastCharCode = DWT.BS; break; 3131 case DWT.BS: lastCharCode = DWT.BS; break;
3151 case DWT.ESC: lastCharCode = DWT.ESC; break; 3132 case DWT.ESC: lastCharCode = DWT.ESC; break;
3152 case DWT.DEL: lastCharCode = DWT.DEL; break; 3133 case DWT.DEL: lastCharCode = DWT.DEL; break;
3134 default: break;
3153 } 3135 }
3154 } 3136 }
3155 if (aCtrlKey !is 0 && (0 <= lastCharCode && lastCharCode <= 0x7F)) { 3137 if (aCtrlKey !is 0 && (0 <= lastCharCode && lastCharCode <= 0x7F)) {
3156 if ('a' <= lastCharCode && lastCharCode <= 'z') lastCharCode -= 'a' - 'A'; 3138 if ('a' <= lastCharCode && lastCharCode <= 'z') lastCharCode -= 'a' - 'A';
3157 if (64 <= lastCharCode && lastCharCode <= 95) lastCharCode -= 64; 3139 if (64 <= lastCharCode && lastCharCode <= 95) lastCharCode -= 64;
3216 case DWT.CONTROL: 3198 case DWT.CONTROL:
3217 case DWT.ALT: 3199 case DWT.ALT:
3218 case DWT.COMMAND: { 3200 case DWT.COMMAND: {
3219 keyEvent.stateMask |= lastKeyCode; 3201 keyEvent.stateMask |= lastKeyCode;
3220 } 3202 }
3203 default: break;
3221 } 3204 }
3222 browser.notifyListeners (keyEvent.type, keyEvent); 3205 browser.notifyListeners (keyEvent.type, keyEvent);
3223 if (!keyEvent.doit) { 3206 if (!keyEvent.doit) {
3224 event.PreventDefault (); 3207 event.PreventDefault ();
3225 } 3208 }
3315 case 1: mouseEvent.stateMask |= DWT.BUTTON1; break; 3298 case 1: mouseEvent.stateMask |= DWT.BUTTON1; break;
3316 case 2: mouseEvent.stateMask |= DWT.BUTTON2; break; 3299 case 2: mouseEvent.stateMask |= DWT.BUTTON2; break;
3317 case 3: mouseEvent.stateMask |= DWT.BUTTON3; break; 3300 case 3: mouseEvent.stateMask |= DWT.BUTTON3; break;
3318 case 4: mouseEvent.stateMask |= DWT.BUTTON4; break; 3301 case 4: mouseEvent.stateMask |= DWT.BUTTON4; break;
3319 case 5: mouseEvent.stateMask |= DWT.BUTTON5; break; 3302 case 5: mouseEvent.stateMask |= DWT.BUTTON5; break;
3303 default: break;
3320 } 3304 }
3321 } 3305 }
3322 3306
3323 browser.notifyListeners (mouseEvent.type, mouseEvent); 3307 browser.notifyListeners (mouseEvent.type, mouseEvent);
3324 if (aDetail is 2 && XPCOM.DOMEVENT_MOUSEDOWN.equals (typeString)) { 3308 if (aDetail is 2 && XPCOM.DOMEVENT_MOUSEDOWN.equals (typeString)) {