diff --git a/Extension/Info.plist b/Extension/Info.plist
index 0a39f69..7307c1d 100644
--- a/Extension/Info.plist
+++ b/Extension/Info.plist
@@ -5,7 +5,7 @@
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
- Extension
+ Backspace
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
@@ -44,6 +44,6 @@
NSHumanReadableCopyright
Copyright © 2018 Yannick Weiss. All rights reserved.
NSHumanReadableDescription
- Extension brings back the Backspace
+ This extension brings back the Backspace.
diff --git a/Extension/script.js b/Extension/script.js
index e5c8245..57d9b1f 100644
--- a/Extension/script.js
+++ b/Extension/script.js
@@ -1,7 +1,9 @@
document.addEventListener("DOMContentLoaded", function(event) {
function handleBackspace(e) {
if (e.keyCode === 8 && !e.ctrlKey && !e.shiftKey
- && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') {
+ && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA'
+ && e.target.contentEditable !== 'true' // TinyMCE
+ ) {
e.preventDefault();
window.history.go(-1);
}
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..88dd301
--- /dev/null
+++ b/README.md
@@ -0,0 +1,26 @@
+# Safari Backspace
+
+Because macOS Mojave removed the Backspace.
+
+## The injected script
+```javascript
+function handleBackspace(e) {
+ if (e.keyCode === 8 && !e.ctrlKey && !e.shiftKey
+ && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA'
+ && e.target.contentEditable !== 'true' // TinyMCE
+ ) {
+ e.preventDefault();
+ window.history.go(-1);
+ }
+}
+window.addEventListener('keydown', handleBackspace, false);
+
+```
+
+## Paranoid People 🙈
+I am recording your text inputs and send it to my servers, so I can laugh about your spelling mistakes.
+
+You can find the scripts in the release by inspecting the package contents.
+
+`open Safari\ Backspace.app/Contents/PlugIns/Backspace.appex/Contents/Resources/`
+
diff --git a/Safari Backspace.xcodeproj/project.pbxproj b/Safari Backspace.xcodeproj/project.pbxproj
index 55b8e74..70a564b 100644
--- a/Safari Backspace.xcodeproj/project.pbxproj
+++ b/Safari Backspace.xcodeproj/project.pbxproj
@@ -11,8 +11,39 @@
ACEBD69B2178DFC60051E5E6 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = ACEBD69A2178DFC60051E5E6 /* Assets.xcassets */; };
ACEBD69E2178DFC60051E5E6 /* MainMenu.xib in Resources */ = {isa = PBXBuildFile; fileRef = ACEBD69C2178DFC60051E5E6 /* MainMenu.xib */; };
ACEBD6A12178DFC60051E5E6 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = ACEBD6A02178DFC60051E5E6 /* main.m */; };
+ ACEBD6AF2178DFDB0051E5E6 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = ACEBD6AE2178DFDB0051E5E6 /* Cocoa.framework */; };
+ ACEBD6B32178DFDB0051E5E6 /* SafariExtensionHandler.m in Sources */ = {isa = PBXBuildFile; fileRef = ACEBD6B22178DFDB0051E5E6 /* SafariExtensionHandler.m */; };
+ ACEBD6B62178DFDB0051E5E6 /* SafariExtensionViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = ACEBD6B52178DFDB0051E5E6 /* SafariExtensionViewController.m */; };
+ ACEBD6B92178DFDB0051E5E6 /* SafariExtensionViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = ACEBD6B72178DFDB0051E5E6 /* SafariExtensionViewController.xib */; };
+ ACEBD6BC2178DFDB0051E5E6 /* script.js in Resources */ = {isa = PBXBuildFile; fileRef = ACEBD6BB2178DFDB0051E5E6 /* script.js */; };
+ ACEBD6BE2178DFDB0051E5E6 /* ToolbarItemIcon.pdf in Resources */ = {isa = PBXBuildFile; fileRef = ACEBD6BD2178DFDB0051E5E6 /* ToolbarItemIcon.pdf */; };
+ ACEBD6C22178DFDB0051E5E6 /* Backspace.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = ACEBD6AC2178DFDB0051E5E6 /* Backspace.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
+/* Begin PBXContainerItemProxy section */
+ ACEBD6C02178DFDB0051E5E6 /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = ACEBD68C2178DFC50051E5E6 /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = ACEBD6AB2178DFDB0051E5E6;
+ remoteInfo = Extension;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXCopyFilesBuildPhase section */
+ ACEBD6C62178DFDB0051E5E6 /* Embed App Extensions */ = {
+ isa = PBXCopyFilesBuildPhase;
+ buildActionMask = 2147483647;
+ dstPath = "";
+ dstSubfolderSpec = 13;
+ files = (
+ ACEBD6C22178DFDB0051E5E6 /* Backspace.appex in Embed App Extensions */,
+ );
+ name = "Embed App Extensions";
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXCopyFilesBuildPhase section */
+
/* Begin PBXFileReference section */
ACEBD6942178DFC50051E5E6 /* Safari Backspace.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Safari Backspace.app"; sourceTree = BUILT_PRODUCTS_DIR; };
ACEBD6972178DFC50051E5E6 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; };
@@ -22,6 +53,17 @@
ACEBD69F2178DFC60051E5E6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
ACEBD6A02178DFC60051E5E6 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; };
ACEBD6A22178DFC60051E5E6 /* Safari_Backspace.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Safari_Backspace.entitlements; sourceTree = ""; };
+ ACEBD6AC2178DFDB0051E5E6 /* Backspace.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = Backspace.appex; sourceTree = BUILT_PRODUCTS_DIR; };
+ ACEBD6AE2178DFDB0051E5E6 /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; };
+ ACEBD6B12178DFDB0051E5E6 /* SafariExtensionHandler.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SafariExtensionHandler.h; sourceTree = ""; };
+ ACEBD6B22178DFDB0051E5E6 /* SafariExtensionHandler.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SafariExtensionHandler.m; sourceTree = ""; };
+ ACEBD6B42178DFDB0051E5E6 /* SafariExtensionViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SafariExtensionViewController.h; sourceTree = ""; };
+ ACEBD6B52178DFDB0051E5E6 /* SafariExtensionViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SafariExtensionViewController.m; sourceTree = ""; };
+ ACEBD6B82178DFDB0051E5E6 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/SafariExtensionViewController.xib; sourceTree = ""; };
+ ACEBD6BA2178DFDB0051E5E6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
+ ACEBD6BB2178DFDB0051E5E6 /* script.js */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.javascript; path = script.js; sourceTree = ""; };
+ ACEBD6BD2178DFDB0051E5E6 /* ToolbarItemIcon.pdf */ = {isa = PBXFileReference; lastKnownFileType = image.pdf; path = ToolbarItemIcon.pdf; sourceTree = ""; };
+ ACEBD6BF2178DFDB0051E5E6 /* Extension.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Extension.entitlements; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
@@ -32,6 +74,14 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ ACEBD6A92178DFDB0051E5E6 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ ACEBD6AF2178DFDB0051E5E6 /* Cocoa.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
@@ -39,6 +89,8 @@
isa = PBXGroup;
children = (
ACEBD6962178DFC50051E5E6 /* Safari Backspace */,
+ ACEBD6B02178DFDB0051E5E6 /* Extension */,
+ ACEBD6AD2178DFDB0051E5E6 /* Frameworks */,
ACEBD6952178DFC50051E5E6 /* Products */,
);
sourceTree = "";
@@ -47,6 +99,7 @@
isa = PBXGroup;
children = (
ACEBD6942178DFC50051E5E6 /* Safari Backspace.app */,
+ ACEBD6AC2178DFDB0051E5E6 /* Backspace.appex */,
);
name = Products;
sourceTree = "";
@@ -65,6 +118,30 @@
path = "Safari Backspace";
sourceTree = "";
};
+ ACEBD6AD2178DFDB0051E5E6 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ ACEBD6AE2178DFDB0051E5E6 /* Cocoa.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "";
+ };
+ ACEBD6B02178DFDB0051E5E6 /* Extension */ = {
+ isa = PBXGroup;
+ children = (
+ ACEBD6B12178DFDB0051E5E6 /* SafariExtensionHandler.h */,
+ ACEBD6B22178DFDB0051E5E6 /* SafariExtensionHandler.m */,
+ ACEBD6B42178DFDB0051E5E6 /* SafariExtensionViewController.h */,
+ ACEBD6B52178DFDB0051E5E6 /* SafariExtensionViewController.m */,
+ ACEBD6B72178DFDB0051E5E6 /* SafariExtensionViewController.xib */,
+ ACEBD6BA2178DFDB0051E5E6 /* Info.plist */,
+ ACEBD6BB2178DFDB0051E5E6 /* script.js */,
+ ACEBD6BD2178DFDB0051E5E6 /* ToolbarItemIcon.pdf */,
+ ACEBD6BF2178DFDB0051E5E6 /* Extension.entitlements */,
+ );
+ path = Extension;
+ sourceTree = "";
+ };
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
@@ -75,16 +152,35 @@
ACEBD6902178DFC50051E5E6 /* Sources */,
ACEBD6912178DFC50051E5E6 /* Frameworks */,
ACEBD6922178DFC50051E5E6 /* Resources */,
+ ACEBD6C62178DFDB0051E5E6 /* Embed App Extensions */,
);
buildRules = (
);
dependencies = (
+ ACEBD6C12178DFDB0051E5E6 /* PBXTargetDependency */,
);
name = "Safari Backspace";
productName = "Safari Backspace";
productReference = ACEBD6942178DFC50051E5E6 /* Safari Backspace.app */;
productType = "com.apple.product-type.application";
};
+ ACEBD6AB2178DFDB0051E5E6 /* Backspace */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = ACEBD6C32178DFDB0051E5E6 /* Build configuration list for PBXNativeTarget "Backspace" */;
+ buildPhases = (
+ ACEBD6A82178DFDB0051E5E6 /* Sources */,
+ ACEBD6A92178DFDB0051E5E6 /* Frameworks */,
+ ACEBD6AA2178DFDB0051E5E6 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = Backspace;
+ productName = Extension;
+ productReference = ACEBD6AC2178DFDB0051E5E6 /* Backspace.appex */;
+ productType = "com.apple.product-type.app-extension";
+ };
/* End PBXNativeTarget section */
/* Begin PBXProject section */
@@ -97,6 +193,9 @@
ACEBD6932178DFC50051E5E6 = {
CreatedOnToolsVersion = 10.0;
};
+ ACEBD6AB2178DFDB0051E5E6 = {
+ CreatedOnToolsVersion = 10.0;
+ };
};
};
buildConfigurationList = ACEBD68F2178DFC50051E5E6 /* Build configuration list for PBXProject "Safari Backspace" */;
@@ -113,6 +212,7 @@
projectRoot = "";
targets = (
ACEBD6932178DFC50051E5E6 /* Safari Backspace */,
+ ACEBD6AB2178DFDB0051E5E6 /* Backspace */,
);
};
/* End PBXProject section */
@@ -127,6 +227,16 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ ACEBD6AA2178DFDB0051E5E6 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ ACEBD6BE2178DFDB0051E5E6 /* ToolbarItemIcon.pdf in Resources */,
+ ACEBD6B92178DFDB0051E5E6 /* SafariExtensionViewController.xib in Resources */,
+ ACEBD6BC2178DFDB0051E5E6 /* script.js in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXResourcesBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
@@ -139,8 +249,25 @@
);
runOnlyForDeploymentPostprocessing = 0;
};
+ ACEBD6A82178DFDB0051E5E6 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ ACEBD6B62178DFDB0051E5E6 /* SafariExtensionViewController.m in Sources */,
+ ACEBD6B32178DFDB0051E5E6 /* SafariExtensionHandler.m in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
/* End PBXSourcesBuildPhase section */
+/* Begin PBXTargetDependency section */
+ ACEBD6C12178DFDB0051E5E6 /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = ACEBD6AB2178DFDB0051E5E6 /* Backspace */;
+ targetProxy = ACEBD6C02178DFDB0051E5E6 /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
/* Begin PBXVariantGroup section */
ACEBD69C2178DFC60051E5E6 /* MainMenu.xib */ = {
isa = PBXVariantGroup;
@@ -150,6 +277,14 @@
name = MainMenu.xib;
sourceTree = "";
};
+ ACEBD6B72178DFDB0051E5E6 /* SafariExtensionViewController.xib */ = {
+ isa = PBXVariantGroup;
+ children = (
+ ACEBD6B82178DFDB0051E5E6 /* Base */,
+ );
+ name = SafariExtensionViewController.xib;
+ sourceTree = "";
+ };
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
@@ -321,6 +456,15 @@
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
+ ACEBD6C32178DFDB0051E5E6 /* Build configuration list for PBXNativeTarget "Backspace" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ ACEBD6C42178DFDB0051E5E6 /* Debug */,
+ ACEBD6C52178DFDB0051E5E6 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
/* End XCConfigurationList section */
};
rootObject = ACEBD68C2178DFC50051E5E6 /* Project object */;
diff --git a/Safari Backspace.xcodeproj/xcuserdata/yannick.xcuserdatad/xcschemes/xcschememanagement.plist b/Safari Backspace.xcodeproj/xcuserdata/yannick.xcuserdatad/xcschemes/xcschememanagement.plist
index 40225c2..16104aa 100644
--- a/Safari Backspace.xcodeproj/xcuserdata/yannick.xcuserdatad/xcschemes/xcschememanagement.plist
+++ b/Safari Backspace.xcodeproj/xcuserdata/yannick.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -4,6 +4,16 @@
SchemeUserState
+ Backspace.xcscheme
+
+ orderHint
+ 1
+
+ Extension.xcscheme
+
+ orderHint
+ 1
+
Safari Backspace.xcscheme
orderHint
diff --git a/Safari Backspace/Base.lproj/MainMenu.xib b/Safari Backspace/Base.lproj/MainMenu.xib
index 0a48bb9..2a3468f 100644
--- a/Safari Backspace/Base.lproj/MainMenu.xib
+++ b/Safari Backspace/Base.lproj/MainMenu.xib
@@ -11,7 +11,7 @@
-
+
@@ -682,40 +682,32 @@
-
-
+
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
+
- Please open Safari > Extension and enable the extension.
-If the app is not signed you have to enable: Develop > Allow unsigned Extensions
+ Please open Safari > Preferences > Extensions and enable the Backspace Extension.
+
+
-
+