Mercurial > projects > dwt-linux
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)) { |