Feature/hide browser behind feature flag #20022 (#20082)

This commit is contained in:
flexsurfer 2024-05-23 10:12:39 +02:00 committed by GitHub
parent c19f170239
commit 5eba373c3c
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 197 additions and 195 deletions

View File

@ -36,5 +36,4 @@ STICKERS_TEST_ENABLED=1
LOCAL_PAIRING_ENABLED=1 LOCAL_PAIRING_ENABLED=1
FAST_CREATE_COMMUNITY_ENABLED=1 FAST_CREATE_COMMUNITY_ENABLED=1
TEST_NETWORKS_ENABLED=1 TEST_NETWORKS_ENABLED=1
SHOW_NOT_IMPLEMENTED_FEATURES=1
ENABLE_ALERT_BANNER=1 ENABLE_ALERT_BANNER=1

View File

@ -11,9 +11,11 @@
[legacy.status-im.utils.random :as random] [legacy.status-im.utils.random :as random]
[native-module.core :as native-module] [native-module.core :as native-module]
[re-frame.core :as re-frame] [re-frame.core :as re-frame]
[react-native.core :as react]
[react-native.platform :as platform] [react-native.platform :as platform]
[status-im.common.json-rpc.events :as json-rpc] [status-im.common.json-rpc.events :as json-rpc]
[status-im.common.universal-links :as links] [status-im.common.universal-links :as links]
[status-im.config :as config]
[status-im.constants :as constants] [status-im.constants :as constants]
[status-im.contexts.chat.events :as chat.events] [status-im.contexts.chat.events :as chat.events]
[status-im.navigation.events :as navigation] [status-im.navigation.events :as navigation]
@ -302,16 +304,18 @@
:history [normalized-url]}] :history [normalized-url]}]
(if (links/universal-link? normalized-url) (if (links/universal-link? normalized-url)
{:dispatch [:universal-links/handle-url normalized-url]} {:dispatch [:universal-links/handle-url normalized-url]}
(rf/merge cofx (if config/show-not-implemented-features?
{:db (assoc db (rf/merge cofx
:browser/options {:db (assoc db
{:browser-id (:browser-id browser)} :browser/options
:browser/screen-id :browser)} {:browser-id (:browser-id browser)}
(navigation/pop-to-root :shell-stack) :browser/screen-id :browser)}
(chat.events/close-chat) (navigation/pop-to-root :shell-stack)
(navigation/change-tab :browser-stack) (chat.events/close-chat)
(update-browser browser) (navigation/change-tab :browser-stack)
(resolve-url nil))))) (update-browser browser)
(resolve-url nil))
(.openURL ^js react/linking (url/normalize-url url))))))
(rf/defn open-existing-browser (rf/defn open-existing-browser
"Opens an existing browser with it's history" "Opens an existing browser with it's history"

View File

@ -1,8 +1,5 @@
(ns legacy.status-im.browser.core-test (ns legacy.status-im.browser.core-test
(:require (:require
[cljs.test :refer-macros [deftest is testing]]
[legacy.status-im.browser.core :as browser]
[utils.i18n :as i18n]
[utils.url :as url])) [utils.url :as url]))
(defn has-wrong-properties? (defn has-wrong-properties?
@ -21,101 +18,103 @@
(some #(when (= (url/normalize-and-decode-url dapp-url) (first (:history %))) (:browser-id %)) (some #(when (= (url/normalize-and-decode-url dapp-url) (first (:history %))) (:browser-id %))
(vals (get-in result [:db :browser/browsers])))) (vals (get-in result [:db :browser/browsers]))))
(deftest browser-test #_(deftest browser-test
(let [dapp1-url "cryptokitties.co" (let [dapp1-url "cryptokitties.co"
dapp2-url "http://test2.com"] dapp2-url "http://test2.com"]
(testing "user opens a dapp" (testing "user opens a dapp"
(let [result-open (browser/open-url {:db {} :now 1} dapp1-url) (let [result-open (browser/open-url {:db {} :now 1} dapp1-url)
dapp1-id (get-dapp-id result-open dapp1-url)] dapp1-id (get-dapp-id result-open dapp1-url)]
(is (= dapp1-id (get-in result-open [:db :browser/options :browser-id])) (is (= dapp1-id (get-in result-open [:db :browser/options :browser-id]))
"browser-id should be dapp1-url") "browser-id should be dapp1-url")
(is (not (has-wrong-properties? result-open (is (not (has-wrong-properties? result-open
dapp1-id dapp1-id
{:browser-id dapp1-id {:browser-id dapp1-id
:history-index 0 :history-index 0
:history ["https://cryptokitties.co"] :history ["https://cryptokitties.co"]
:dapp? false :dapp? false
:name (i18n/label :t/browser)})) :name (i18n/label :t/browser)}))
"some properties of the browser are not correct") "some properties of the browser are not correct")
(testing "then a second dapp" (testing "then a second dapp"
(let [result-open-2 (browser/open-url {:db (:db result-open) (let [result-open-2 (browser/open-url {:db (:db result-open)
:now 2} :now 2}
dapp2-url) dapp2-url)
dapp2-id (get-dapp-id result-open-2 dapp2-url)] dapp2-id (get-dapp-id result-open-2 dapp2-url)]
(is (= dapp2-id (get-in result-open-2 [:db :browser/options :browser-id])) (is (= dapp2-id (get-in result-open-2 [:db :browser/options :browser-id]))
"browser-id should be dapp2 host") "browser-id should be dapp2 host")
(is (not (has-wrong-properties? result-open-2 (is (not (has-wrong-properties? result-open-2
dapp2-id dapp2-id
{:browser-id dapp2-id {:browser-id dapp2-id
:history-index 0 :history-index 0
:history ["http://test2.com"] :history ["http://test2.com"]
:dapp? false})) :dapp? false}))
"some properties of the browser are not correct") "some properties of the browser are not correct")
(testing "then removes the second dapp" (testing "then removes the second dapp"
(let [result-remove-2 (browser/remove-browser {:db (:db result-open-2)} dapp2-id)] (let [result-remove-2 (browser/remove-browser {:db (:db result-open-2)} dapp2-id)]
(is (= #{dapp1-id} (is (= #{dapp1-id}
(set (keys (get-in result-remove-2 [:db :browser/browsers])))) (set (keys (get-in result-remove-2 [:db :browser/browsers]))))
"the second dapp shouldn't be in the browser list anymore"))))) "the second dapp shouldn't be in the browser list anymore")))))
(testing "then opens the dapp again" (testing "then opens the dapp again"
(let [result-open-existing (browser/open-existing-browser {:db (:db result-open) (let [result-open-existing (browser/open-existing-browser {:db (:db result-open)
:now 2} :now 2}
dapp1-id) dapp1-id)
dapp1-url2 (str "https://" dapp1-url "/nav2")] dapp1-url2 (str "https://" dapp1-url "/nav2")]
(is (not (has-wrong-properties? result-open-existing (is (not (has-wrong-properties? result-open-existing
dapp1-id dapp1-id
{:browser-id dapp1-id {:browser-id dapp1-id
:history-index 0 :history-index 0
:history ["https://cryptokitties.co"] :history ["https://cryptokitties.co"]
:dapp? false :dapp? false
:name (i18n/label :t/browser)})) :name (i18n/label :t/browser)}))
"some properties of the browser are not correct") "some properties of the browser are not correct")
(is (nil? (browser/navigate-to-next-page result-open-existing)) (is (nil? (browser/navigate-to-next-page result-open-existing))
"nothing should happen if user tries to navigate to next page") "nothing should happen if user tries to navigate to next page")
(is (nil? (browser/navigate-to-previous-page result-open-existing)) (is (nil? (browser/navigate-to-previous-page result-open-existing))
"nothing should happen if user tries to navigate to previous page") "nothing should happen if user tries to navigate to previous page")
(testing "then navigates to a new url in the dapp" (testing "then navigates to a new url in the dapp"
(let [result-navigate (browser/navigation-state-changed (let [result-navigate (browser/navigation-state-changed
{:db (:db result-open-existing) {:db (:db result-open-existing)
:now 4} :now 4}
(clj->js {"url" dapp1-url2 (clj->js {"url" dapp1-url2
"loading" false}) "loading" false})
false)] false)]
(is (not (has-wrong-properties? result-navigate (is (not (has-wrong-properties? result-navigate
dapp1-id
{:browser-id dapp1-id
:history-index 1
:history ["https://cryptokitties.co" dapp1-url2]
:dapp? false
:name (i18n/label :t/browser)}))
"some properties of the browser are not correct")
(testing "then navigates to previous page"
(let [result-previous (browser/navigate-to-previous-page {:db (:db result-navigate)
:now 5})]
(is
(not (has-wrong-properties? result-previous
dapp1-id
{:browser-id dapp1-id
:history-index 0
:history ["https://cryptokitties.co" dapp1-url2]
:dapp? false
:name (i18n/label :t/browser)}))
"some properties of the browser are not correct")
(testing "then navigates to next page")
(let [result-next (browser/navigate-to-next-page {:db (:db result-previous)
:now 6})]
(is (not
(has-wrong-properties? result-next
dapp1-id dapp1-id
{:browser-id dapp1-id {:browser-id dapp1-id
:history-index 1 :history-index 1
:history ["https://cryptokitties.co" dapp1-url2] :history ["https://cryptokitties.co" dapp1-url2]
:dapp? false :dapp? false
:name (i18n/label :t/browser)})) :name (i18n/label :t/browser)}))
"some properties of the browser are not correct")))))))))))) "some properties of the browser are not correct")
(testing "then navigates to previous page"
(let [result-previous (browser/navigate-to-previous-page {:db (:db result-navigate)
:now 5})]
(is
(not (has-wrong-properties? result-previous
dapp1-id
{:browser-id dapp1-id
:history-index 0
:history ["https://cryptokitties.co"
dapp1-url2]
:dapp? false
:name (i18n/label :t/browser)}))
"some properties of the browser are not correct")
(testing "then navigates to next page")
(let [result-next (browser/navigate-to-next-page {:db (:db result-previous)
:now 6})]
(is (not
(has-wrong-properties? result-next
dapp1-id
{:browser-id dapp1-id
:history-index 1
:history ["https://cryptokitties.co"
dapp1-url2]
:dapp? false
:name (i18n/label :t/browser)}))
"some properties of the browser are not correct"))))))))))))

View File

@ -1,96 +1,90 @@
(ns legacy.status-im.browser.permissions-test (ns legacy.status-im.browser.permissions-test)
(:require
[cljs.test :refer-macros [deftest is testing]]
[legacy.status-im.browser.core :as browser]
[legacy.status-im.browser.core-test :as core.tests]
[legacy.status-im.browser.permissions :as permissions]
[legacy.status-im.utils.deprecated-types :as types]))
(deftest permissions-test #_(deftest permissions-test
(let [dapp-name "test.com" (let [dapp-name "test.com"
dapp-name2 "test2.org" dapp-name2 "test2.org"
cofx {:db (assoc-in (:db (browser/open-url {:db {}} dapp-name)) cofx {:db (assoc-in (:db (browser/open-url {:db {}} dapp-name))
[:profile/profile :public-key] [:profile/profile :public-key]
"public-key")} "public-key")}
dapp-id (core.tests/get-dapp-id cofx dapp-name)] dapp-id (core.tests/get-dapp-id cofx dapp-name)]
(testing "dapps permissions are initialized" (testing "dapps permissions are initialized"
(is (zero? (count (get-in cofx [:db :dapps/permissions])))) (is (zero? (count (get-in cofx [:db :dapps/permissions]))))
(is (= dapp-id (get-in cofx [:db :browser/options :browser-id])))) (is (= dapp-id (get-in cofx [:db :browser/options :browser-id]))))
(testing "receiving an unsupported permission" (testing "receiving an unsupported permission"
(let [result-ask (browser/process-bridge-message cofx (let [result-ask (browser/process-bridge-message cofx
(types/clj->json (types/clj->json
{:type "api-request" {:type "api-request"
:host dapp-name :host dapp-name
:messageId 0 :messageId 0
:permission "FAKE_PERMISSION"}))] :permission "FAKE_PERMISSION"}))]
(is (not (get-in result-ask [:browser/send-to-bridge :isAllowed]))))) (is (not (get-in result-ask [:browser/send-to-bridge :isAllowed])))))
(testing "receiving a supported permission" (testing "receiving a supported permission"
(let [result-ask (browser/process-bridge-message cofx (let [result-ask (browser/process-bridge-message cofx
(types/clj->json {:type "api-request" (types/clj->json {:type "api-request"
:host dapp-name
:messageId 1
:permission "contact-code"}))]
(is (= (get-in result-ask [:db :browser/options :show-permission])
{:requested-permission "contact-code"
:dapp-name "test.com"
:message-id 1
:yield-control? nil}))
(is (zero? (count (get-in result-ask [:db :dapps/permissions]))))
(testing "then user accepts the supported permission"
(let [accept-result (permissions/allow-permission {:db (:db result-ask)})]
(is (= (get accept-result :browser/send-to-bridge)
{:type "api-response"
:messageId 1
:isAllowed true
:data "public-key"
:permission "contact-code"})
"the data should have been sent to the bridge")
(is (= (get-in accept-result [:db :dapps/permissions])
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
"the dapp should now have CONTACT_CODE permission")
(testing "then dapp asks for permission again"
(let [result-ask-again (browser/process-bridge-message {:db (:db accept-result)}
(types/clj->json
{:type "api-request"
:host dapp-name :host dapp-name
:messageId 1 :messageId 2
:permission "contact-code"}))] :permission "contact-code"}))]
(is (= (get-in result-ask [:db :browser/options :show-permission]) (is (= (get result-ask-again :browser/send-to-bridge)
{:requested-permission "contact-code" {:type "api-response"
:dapp-name "test.com" :isAllowed true
:message-id 1 :messageId 2
:yield-control? nil})) :data "public-key"
(is (zero? (count (get-in result-ask [:db :dapps/permissions])))) :permission "contact-code"})
"the response should be immediatly sent to the bridge")))
(testing "then user accepts the supported permission" (testing "then user switch to another dapp that asks for permissions"
(let [accept-result (permissions/allow-permission {:db (:db result-ask)})] (let [new-dapp (browser/open-url {:db (:db accept-result)} dapp-name2)
(is (= (get accept-result :browser/send-to-bridge) result-ask2 (browser/process-bridge-message {:db (:db new-dapp)}
{:type "api-response" (types/clj->json
:messageId 1 {:type "api-request"
:isAllowed true :host dapp-name2
:data "public-key" :messageId 3
:permission "contact-code"}) :permission "contact-code"}))]
"the data should have been sent to the bridge") (is (= (get-in result-ask2 [:db :dapps/permissions])
(is (= (get-in accept-result [:db :dapps/permissions]) {"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}}) "there should only be permissions for dapp-name at that point")
"the dapp should now have CONTACT_CODE permission") (is (nil? (get result-ask2 :browser/send-to-bridge))
"no message should be sent to the bridge")
(testing "then dapp asks for permission again" (testing "then user accepts permission for dapp-name2"
(let [result-ask-again (browser/process-bridge-message {:db (:db accept-result)} (let [accept-result2 (permissions/allow-permission {:db (:db result-ask2)})]
(types/clj->json (is (= (get-in accept-result2 [:db :dapps/permissions])
{:type "api-request" {"test.com" {:dapp "test.com" :permissions ["contact-code"]}
:host dapp-name "test2.org" {:dapp "test2.org" :permissions ["contact-code"]}})
:messageId 2 "there should be permissions for both dapps now")
:permission "contact-code"}))] (is (= (get accept-result2 :browser/send-to-bridge)
(is (= (get result-ask-again :browser/send-to-bridge) {:type "api-response"
{:type "api-response" :isAllowed true
:isAllowed true :messageId 3
:messageId 2 :data "public-key"
:data "public-key" :permission "contact-code"})
:permission "contact-code"}) "the response should be sent to the bridge")))))))))))
"the response should be immediatly sent to the bridge")))
(testing "then user switch to another dapp that asks for permissions"
(let [new-dapp (browser/open-url {:db (:db accept-result)} dapp-name2)
result-ask2 (browser/process-bridge-message {:db (:db new-dapp)}
(types/clj->json
{:type "api-request"
:host dapp-name2
:messageId 3
:permission "contact-code"}))]
(is (= (get-in result-ask2 [:db :dapps/permissions])
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}})
"there should only be permissions for dapp-name at that point")
(is (nil? (get result-ask2 :browser/send-to-bridge))
"no message should be sent to the bridge")
(testing "then user accepts permission for dapp-name2"
(let [accept-result2 (permissions/allow-permission {:db (:db result-ask2)})]
(is (= (get-in accept-result2 [:db :dapps/permissions])
{"test.com" {:dapp "test.com" :permissions ["contact-code"]}
"test2.org" {:dapp "test2.org" :permissions ["contact-code"]}})
"there should be permissions for both dapps now")
(is (= (get accept-result2 :browser/send-to-bridge)
{:type "api-response"
:isAllowed true
:messageId 3
:data "public-key"
:permission "contact-code"})
"the response should be sent to the bridge")))))))))))

View File

@ -5,6 +5,7 @@
[legacy.status-im.ui.components.react :as react] [legacy.status-im.ui.components.react :as react]
[re-frame.core :as re-frame] [re-frame.core :as re-frame]
[react-native.platform :as platform] [react-native.platform :as platform]
[status-im.config :as config]
[utils.i18n :as i18n] [utils.i18n :as i18n]
[utils.url :as url])) [utils.url :as url]))
@ -27,10 +28,13 @@
(defn browse (defn browse
[link] [link]
(show {:title (i18n/label :t/browsing-title) (show {:title (i18n/label :t/browsing-title)
:options [{:label (i18n/label :t/browsing-open-in-status) :options (if config/show-not-implemented-features?
:action #(re-frame/dispatch [:browser.ui/open-url link])} [{:label (i18n/label :t/browsing-open-in-status)
{:label (i18n/label (platform-web-browser)) :action #(re-frame/dispatch [:browser.ui/open-url link])}
:action #(.openURL ^js react/linking (url/normalize-url link))}] {:label (i18n/label (platform-web-browser))
:action #(.openURL ^js react/linking (url/normalize-url link))}]
[{:label (i18n/label (platform-web-browser))
:action #(.openURL ^js react/linking (url/normalize-url link))}])
:cancel-text (i18n/label :t/browsing-cancel)})) :cancel-text (i18n/label :t/browsing-cancel)}))
(defn browse-in-web-browser (defn browse-in-web-browser

View File

@ -6,6 +6,7 @@
[react-native.gesture :as gesture] [react-native.gesture :as gesture]
[react-native.platform :as platform] [react-native.platform :as platform]
[react-native.reanimated :as reanimated] [react-native.reanimated :as reanimated]
[status-im.config :as config]
[status-im.contexts.shell.jump-to.animation :as animation] [status-im.contexts.shell.jump-to.animation :as animation]
[status-im.contexts.shell.jump-to.components.bottom-tabs.style :as style] [status-im.contexts.shell.jump-to.components.bottom-tabs.style :as style]
[status-im.contexts.shell.jump-to.constants :as shell.constants] [status-im.contexts.shell.jump-to.constants :as shell.constants]
@ -70,4 +71,5 @@
[gesture/gesture-detector {:gesture messages-double-tap-gesture} [gesture/gesture-detector {:gesture messages-double-tap-gesture}
[bottom-tab :i/messages :chats-stack shared-values notifications-data]] [bottom-tab :i/messages :chats-stack shared-values notifications-data]]
[bottom-tab :i/wallet :wallet-stack shared-values notifications-data] [bottom-tab :i/wallet :wallet-stack shared-values notifications-data]
[bottom-tab :i/browser :browser-stack shared-values notifications-data]]]])) (when config/show-not-implemented-features?
[bottom-tab :i/browser :browser-stack shared-values notifications-data])]]]))