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. + + - +