You can turn on cookie-slayer’s Safari extension in Settings.
+
+
diff --git a/cookie-slayer/cookie-slayer/Base.lproj/Main.storyboard b/cookie-slayer/cookie-slayer/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..618dfce
--- /dev/null
+++ b/cookie-slayer/cookie-slayer/Base.lproj/Main.storyboard
@@ -0,0 +1,38 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cookie-slayer/cookie-slayer/Info.plist b/cookie-slayer/cookie-slayer/Info.plist
new file mode 100644
index 0000000..dd3c9af
--- /dev/null
+++ b/cookie-slayer/cookie-slayer/Info.plist
@@ -0,0 +1,25 @@
+
+
+
+
+ UIApplicationSceneManifest
+
+ UIApplicationSupportsMultipleScenes
+
+ UISceneConfigurations
+
+ UIWindowSceneSessionRoleApplication
+
+
+ UISceneConfigurationName
+ Default Configuration
+ UISceneDelegateClassName
+ $(PRODUCT_MODULE_NAME).SceneDelegate
+ UISceneStoryboardFile
+ Main
+
+
+
+
+
+
diff --git a/cookie-slayer/cookie-slayer/Resources/Icon.png b/cookie-slayer/cookie-slayer/Resources/Icon.png
new file mode 100644
index 0000000..423b491
Binary files /dev/null and b/cookie-slayer/cookie-slayer/Resources/Icon.png differ
diff --git a/cookie-slayer/cookie-slayer/Resources/Style.css b/cookie-slayer/cookie-slayer/Resources/Style.css
new file mode 100644
index 0000000..4cefc75
--- /dev/null
+++ b/cookie-slayer/cookie-slayer/Resources/Style.css
@@ -0,0 +1,29 @@
+* {
+ -webkit-user-select: none;
+ -webkit-user-drag: none;
+ cursor: default;
+}
+
+:root {
+ color-scheme: light dark;
+
+ --spacing: 20px;
+}
+
+html {
+ height: 100%;
+}
+
+body {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ flex-direction: column;
+
+ gap: var(--spacing);
+ margin: 0 calc(var(--spacing) * 2);
+ height: 100%;
+
+ font: -apple-system-short-body;
+ text-align: center;
+}
diff --git a/cookie-slayer/cookie-slayer/SceneDelegate.swift b/cookie-slayer/cookie-slayer/SceneDelegate.swift
new file mode 100644
index 0000000..8f014ac
--- /dev/null
+++ b/cookie-slayer/cookie-slayer/SceneDelegate.swift
@@ -0,0 +1,18 @@
+//
+// SceneDelegate.swift
+// cookie-slayer
+//
+// Created by katie on 5/21/24.
+//
+
+import UIKit
+
+class SceneDelegate: UIResponder, UIWindowSceneDelegate {
+
+ var window: UIWindow?
+
+ func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
+ guard let _ = (scene as? UIWindowScene) else { return }
+ }
+
+}
diff --git a/cookie-slayer/cookie-slayer/ViewController.swift b/cookie-slayer/cookie-slayer/ViewController.swift
new file mode 100644
index 0000000..f8703da
--- /dev/null
+++ b/cookie-slayer/cookie-slayer/ViewController.swift
@@ -0,0 +1,34 @@
+//
+// ViewController.swift
+// cookie-slayer
+//
+// Created by katie on 5/21/24.
+//
+
+import UIKit
+import WebKit
+
+class ViewController: UIViewController, WKNavigationDelegate, WKScriptMessageHandler {
+
+ @IBOutlet var webView: WKWebView!
+
+ override func viewDidLoad() {
+ super.viewDidLoad()
+
+ self.webView.navigationDelegate = self
+ self.webView.scrollView.isScrollEnabled = false
+
+ self.webView.configuration.userContentController.add(self, name: "controller")
+
+ self.webView.loadFileURL(Bundle.main.url(forResource: "Main", withExtension: "html")!, allowingReadAccessTo: Bundle.main.resourceURL!)
+ }
+
+ func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
+ // Override point for customization.
+ }
+
+ func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
+ // Override point for customization.
+ }
+
+}
diff --git a/cookie-slayer/cookie-slayerTests/cookie_slayerTests.swift b/cookie-slayer/cookie-slayerTests/cookie_slayerTests.swift
new file mode 100644
index 0000000..cbd97e1
--- /dev/null
+++ b/cookie-slayer/cookie-slayerTests/cookie_slayerTests.swift
@@ -0,0 +1,36 @@
+//
+// cookie_slayerTests.swift
+// cookie-slayerTests
+//
+// Created by katie on 5/21/24.
+//
+
+import XCTest
+@testable import cookie_slayer
+
+final class cookie_slayerTests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() throws {
+ // This is an example of a functional test case.
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ // Any test you write for XCTest can be annotated as throws and async.
+ // Mark your test throws to produce an unexpected failure when your test encounters an uncaught error.
+ // Mark your test async to allow awaiting for asynchronous code to complete. Check the results with assertions afterwards.
+ }
+
+ func testPerformanceExample() throws {
+ // This is an example of a performance test case.
+ self.measure {
+ // Put the code you want to measure the time of here.
+ }
+ }
+
+}
diff --git a/cookie-slayer/cookie-slayerUITests/cookie_slayerUITests.swift b/cookie-slayer/cookie-slayerUITests/cookie_slayerUITests.swift
new file mode 100644
index 0000000..cfdefc8
--- /dev/null
+++ b/cookie-slayer/cookie-slayerUITests/cookie_slayerUITests.swift
@@ -0,0 +1,41 @@
+//
+// cookie_slayerUITests.swift
+// cookie-slayerUITests
+//
+// Created by katie on 5/21/24.
+//
+
+import XCTest
+
+final class cookie_slayerUITests: XCTestCase {
+
+ override func setUpWithError() throws {
+ // Put setup code here. This method is called before the invocation of each test method in the class.
+
+ // In UI tests it is usually best to stop immediately when a failure occurs.
+ continueAfterFailure = false
+
+ // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this.
+ }
+
+ override func tearDownWithError() throws {
+ // Put teardown code here. This method is called after the invocation of each test method in the class.
+ }
+
+ func testExample() throws {
+ // UI tests must launch the application that they test.
+ let app = XCUIApplication()
+ app.launch()
+
+ // Use XCTAssert and related functions to verify your tests produce the correct results.
+ }
+
+ func testLaunchPerformance() throws {
+ if #available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 7.0, *) {
+ // This measures how long it takes to launch your application.
+ measure(metrics: [XCTApplicationLaunchMetric()]) {
+ XCUIApplication().launch()
+ }
+ }
+ }
+}
diff --git a/cookie-slayer/cookie-slayerUITests/cookie_slayerUITestsLaunchTests.swift b/cookie-slayer/cookie-slayerUITests/cookie_slayerUITestsLaunchTests.swift
new file mode 100644
index 0000000..98b419a
--- /dev/null
+++ b/cookie-slayer/cookie-slayerUITests/cookie_slayerUITestsLaunchTests.swift
@@ -0,0 +1,32 @@
+//
+// cookie_slayerUITestsLaunchTests.swift
+// cookie-slayerUITests
+//
+// Created by katie on 5/21/24.
+//
+
+import XCTest
+
+final class cookie_slayerUITestsLaunchTests: XCTestCase {
+
+ override class var runsForEachTargetApplicationUIConfiguration: Bool {
+ true
+ }
+
+ override func setUpWithError() throws {
+ continueAfterFailure = false
+ }
+
+ func testLaunch() throws {
+ let app = XCUIApplication()
+ app.launch()
+
+ // Insert steps here to perform after app launch but before taking a screenshot,
+ // such as logging into a test account or navigating somewhere in the app
+
+ let attachment = XCTAttachment(screenshot: app.screenshot())
+ attachment.name = "Launch Screen"
+ attachment.lifetime = .keepAlways
+ add(attachment)
+ }
+}