diff --git a/js/ui/autorunManager.js b/js/ui/autorunManager.js index 368467c22..5ba4868da 100644 --- a/js/ui/autorunManager.js +++ b/js/ui/autorunManager.js @@ -205,20 +205,35 @@ AutorunManager.prototype = { ejectMount: function(mount) { let mountOp = new ShellMountOperation.ShellMountOperation(mount); - if (mount.can_eject()) - mount.eject_with_operation(0, mountOp.mountOp, null, - Lang.bind(this, this._onMountEject)); - else - mount.unmount_with_operation(0, mountOp.mountOp, null, - Lang.bind(this, this._onMountEject)); + // first, see if we have a drive + let drive = mount.get_drive(); + let volume = mount.get_volume(); + + if (drive && + drive.get_start_stop_type() == Gio.DriveStartStopType.SHUTDOWN && + drive.can_stop()) { + drive.stop(0, mountOp.mountOp, null, + Lang.bind(this, this._onStop)); + } else { + if (mount.can_eject()) { + mount.eject_with_operation(0, mountOp.mountOp, null, + Lang.bind(this, this._onEject)); + } else if (volume && volume.can_eject()) { + volume.eject_with_operation(0, mountOp.mountOp, null, + Lang.bind(this, this._onEject)); + } else if (drive && drive.can_eject()) { + drive.eject_with_operation(0, mountOp.mountOp, null, + Lang.bind(this, this._onEject)); + } else if (mount.can_unmount()) { + mount.unmount_with_operation(0, mountOp.mountOp, null, + Lang.bind(this, this._onUnmount)); + } + } }, - _onMountEject: function(mount, res) { + _onUnmount: function(mount, res) { try { - if (mount.can_eject()) - mount.eject_with_operation_finish(res); - else - mount.unmount_with_operation_finish(res); + mount.unmount_with_operation_finish(res); } catch (e) { // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here // but we can't access the error code from JS. @@ -227,6 +242,30 @@ AutorunManager.prototype = { + ': ' + e.toString()); } }, + + _onEject: function(source, res) { + try { + source.eject_with_operation_finish(res); + } catch (e) { + // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here + // but we can't access the error code from JS. + // See https://bugzilla.gnome.org/show_bug.cgi?id=591480 + log('Unable to eject the drive ' + source.get_name() + + ': ' + e.toString()); + } + }, + + _onStop: function(drive, res) { + try { + drive.stop_finish(res); + } catch (e) { + // FIXME: we need to ignore G_IO_ERROR_FAILED_HANDLED errors here + // but we can't access the error code from JS. + // See https://bugzilla.gnome.org/show_bug.cgi?id=591480 + log('Unable to stop the drive ' + drive.get_name() + + ': ' + e.toString()); + } + }, } function AutorunResidentSource() {