Skip to content
Merged
Show file tree
Hide file tree
Changes from 63 commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
7045632
add deep link auth state
popuz Jun 29, 2026
8d1ff32
dappWeb3 flow
popuz Jun 29, 2026
f326536
add deepLink handling
popuz Jun 29, 2026
b300840
handled deep link flow with tester
popuz Jun 30, 2026
fc31edd
Merge branch 'dev' into chore/authentication/deep-link-login
popuz Jun 30, 2026
3b6f35f
Merge branch 'dev' into chore/authentication/deep-link-login
popuz Jun 30, 2026
8366184
Merge remote-tracking branch 'origin/chore/authentication/deep-link-l…
popuz Jun 30, 2026
c85f914
Merge branch 'dev' into chore/authentication/deep-link-login
popuz Jun 30, 2026
9c9d093
Merge remote-tracking branch 'origin/chore/authentication/deep-link-l…
popuz Jun 30, 2026
6f985dc
not consuming signing deepLink
popuz Jul 1, 2026
48fc061
Merge branch 'dev' into chore/authentication/deep-link-login
popuz Jul 1, 2026
7f5237d
not deleting the file
popuz Jul 1, 2026
bcd19a6
enabled logging categories
popuz Jul 1, 2026
9750311
replaced socket with POST request
popuz Jul 1, 2026
233291d
moved to its own class
popuz Jul 1, 2026
2cf2a27
clean up from Dapp old flow
popuz Jul 2, 2026
add0163
removing bridge file; -logs cleanup
popuz Jul 2, 2026
abf574e
renaming of old Dapp auth
popuz Jul 2, 2026
93950b1
spacing
popuz Jul 2, 2026
b29abe0
simplified comments
popuz Jul 2, 2026
14ecb96
removed interface
popuz Jul 2, 2026
cfef516
clean up logs and comments
popuz Jul 2, 2026
8c84cdc
more cleanup
popuz Jul 2, 2026
0dab6f3
Merge remote-tracking branch 'refs/remotes/origin/dev' into chore/aut…
popuz Jul 2, 2026
ecc5b31
add sanity-check for received address
popuz Jul 2, 2026
91a0d4e
addressed several reviewer requests
popuz Jul 2, 2026
64fa111
removed IWebBrowser and renamed method
popuz Jul 2, 2026
3df3783
removed no-op logout across authentificators
popuz Jul 2, 2026
8ca9f99
Merge branch 'dev' into chore/authentication/deep-link-login
popuz Jul 2, 2026
918e9c8
add retries and exception handling
popuz Jul 2, 2026
289960d
harden deep-link sign-in against stale signin ids, fix local-scene lo…
popuz Jul 2, 2026
7f4bdc2
fixed last comment
popuz Jul 2, 2026
b374e1a
fix warningsat DappDeepLinkAuthenticator
lorux0 Jul 7, 2026
6036187
fix null check warnings at Bootstrapper
lorux0 Jul 7, 2026
8538e11
fix multiple explorer instances authentication: defer deep link consu…
lorux0 Jul 8, 2026
b5bb6fa
add bridge-only param on editor
lorux0 Jul 8, 2026
4c39b26
comments updating
lorux0 Jul 8, 2026
04841c8
fix comments
lorux0 Jul 9, 2026
d2b6b92
Merge branch 'dev' into chore/authentication/deep-link-login
lorux0 Jul 9, 2026
8c96b23
fix merge errors
lorux0 Jul 9, 2026
3035d28
wait for matching auth request id
lorux0 Jul 9, 2026
db0dc5b
reduce compilation warnings
lorux0 Jul 9, 2026
3533102
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 9, 2026
dc68e6e
Update Explorer/Assets/DCL/RuntimeDeepLink/DeepLinkSentinel.cs
lorux0 Jul 9, 2026
42a670d
Update Explorer/Assets/DCL/Infrastructure/Global/Dynamic/BootstrapCon…
lorux0 Jul 9, 2026
d30b0ba
Update Explorer/Assets/DCL/Infrastructure/Global/AppArgs/AppArgsFlags.cs
lorux0 Jul 9, 2026
2978f3c
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 9, 2026
20de70b
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 9, 2026
eca8587
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 9, 2026
65f8a23
Update Explorer/Assets/DCL/Infrastructure/Global/AppArgs/AppArgsFlags.cs
lorux0 Jul 9, 2026
85b7967
Update Explorer/Assets/DCL/Infrastructure/Global/Dynamic/BootstrapCon…
lorux0 Jul 9, 2026
6786673
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 9, 2026
dc79f08
dont request auth id anymore
lorux0 Jul 13, 2026
78154ca
Merge branch 'dev' into chore/authentication/deep-link-login
lorux0 Jul 13, 2026
f3500ea
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 13, 2026
8493198
fix compilation err
lorux0 Jul 14, 2026
13925cc
Merge branch 'dev' into chore/authentication/deep-link-login
lorux0 Jul 14, 2026
29a0dbb
Update Explorer/Assets/DCL/RuntimeDeepLink/DeepLinkSentinel.cs
lorux0 Jul 15, 2026
4df5a24
Update Explorer/Assets/DCL/RuntimeDeepLink/DeepLinkSentinel.cs
lorux0 Jul 15, 2026
427efd4
review fixes
lorux0 Jul 16, 2026
63aab99
Merge branch 'dev' into chore/authentication/deep-link-login
lorux0 Jul 16, 2026
afbf784
delete iwebbrowser file
lorux0 Jul 16, 2026
f55ff5e
Merge branch 'dev' into chore/authentication/deep-link-login
mikhail-dcl Jul 16, 2026
2328a7f
Update Explorer/Assets/DCL/Web3/Authenticators/Implementations/Dapp/D…
lorux0 Jul 16, 2026
822f0bb
Merge branch 'dev' into chore/authentication/deep-link-login
lorux0 Jul 17, 2026
884fc77
fix web browser naming
lorux0 Jul 17, 2026
fb85cd1
fix credit purchase tests due web browser
lorux0 Jul 17, 2026
96e54e5
reduce warnings
lorux0 Jul 17, 2026
084cf9d
Merge branch 'dev' into chore/authentication/deep-link-login
lorux0 Jul 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class BannedNotificationHandler : IDisposable
private readonly IWeb3IdentityCache identityCache;
private readonly ModerationDataProvider moderationDataProvider;
private readonly IMVCManager mvcManager;
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;

private CancellationTokenSource cts = new ();

Expand All @@ -30,7 +30,7 @@ public BannedNotificationHandler(
IWeb3IdentityCache identityCache,
ModerationDataProvider moderationDataProvider,
IMVCManager mvcManager,
IWebBrowser webBrowser)
UnityAppWebBrowser webBrowser)
{
this.webRequestController = webRequestController;
this.urlsSource = urlsSource;
Expand All @@ -47,7 +47,7 @@ public void Dispose() =>
cts.SafeCancelAndDispose();

private void OnBanWarningNotificationClicked(object[] parameters) =>
webBrowser.OpenUrl(urlsSource.Url(DecentralandUrl.SupportLink));
webBrowser.OpenUrlMainThreadOnly(urlsSource.Url(DecentralandUrl.SupportLink));

private void OnBannedNotificationClicked(object[] parameters)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,12 +14,12 @@ public class BlockedScreenController : ControllerBase<BlockedScreenView, Blocked
{
private const string DEFAULT_INFO_TEXT = "Contact Support for more information.";

private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;
private readonly StringBuilder infoTextBuilder = new ();

public override CanvasOrdering.SortingLayer Layer => CanvasOrdering.SortingLayer.OVERLAY;

public BlockedScreenController(ViewFactoryMethod viewFactory, IWebBrowser webBrowser) : base(viewFactory)
public BlockedScreenController(ViewFactoryMethod viewFactory, UnityAppWebBrowser webBrowser) : base(viewFactory)
{
this.webBrowser = webBrowser;
}
Expand Down Expand Up @@ -66,7 +66,7 @@ public override void Dispose()

private void OnSupportClicked()
{
webBrowser.OpenUrl(DecentralandUrl.Help);
webBrowser.OpenUrlMainThreadOnly(DecentralandUrl.Help);
}

private static string FormatRemainingBanTime(string expiresAt)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ namespace DCL.ApplicationGuards
{
public class MinimumSpecsScreenController : ControllerBase<MinimumSpecsScreenView>
{
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;
private readonly IAnalyticsController analytics;
private readonly IReadOnlyList<SpecResult> specResult;
public override CanvasOrdering.SortingLayer Layer => CanvasOrdering.SortingLayer.OVERLAY;
Expand All @@ -20,7 +20,7 @@ public class MinimumSpecsScreenController : ControllerBase<MinimumSpecsScreenVie
private MinimumSpecsTablePresenter specsTablePresenter;

public MinimumSpecsScreenController(ViewFactoryMethod viewFactory,
IWebBrowser webBrowser,
UnityAppWebBrowser webBrowser,
IAnalyticsController analytics,
IReadOnlyList<SpecResult> specResult) : base(viewFactory)
{
Expand Down Expand Up @@ -66,7 +66,7 @@ private void OnContinueClicked()

private void OnReadMoreClicked()
{
webBrowser.OpenUrl(DecentralandUrl.MinimumSpecs);
webBrowser.OpenUrlMainThreadOnly(DecentralandUrl.MinimumSpecs);
}

protected override UniTask WaitForCloseIntentAsync(CancellationToken ct) =>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,9 @@ public class ApplicationVersionGuard
private const string DECENTRALAND_LEGACY_LAUNCHER_MAC_X_64_DMG = "Decentraland Outdated-mac-x64.dmg";

private readonly IWebRequestController webRequestController;
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;

public ApplicationVersionGuard(IWebRequestController webRequestController, IWebBrowser webBrowser)
public ApplicationVersionGuard(IWebRequestController webRequestController, UnityAppWebBrowser webBrowser)
{
this.webRequestController = webRequestController;
this.webBrowser = webBrowser;
Expand Down Expand Up @@ -89,7 +89,7 @@ private void DownloadLauncher()
string downloadUrl = $"{GetLauncherDownloadPath()}/{assetName}";

if (!string.IsNullOrEmpty(downloadUrl))
webBrowser.OpenUrl(downloadUrl);
webBrowser.OpenUrlMainThreadOnly(downloadUrl);
else
ReportHub.LogError(ReportCategory.VERSION_CONTROL, "Failed to get launcher download URL.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public enum AuthStatus

private readonly ICompositeWeb3Provider web3Authenticator;
private readonly ISelfProfile selfProfile;
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;
private readonly IWeb3IdentityCache storedIdentityProvider;
private readonly ICharacterPreviewFactory characterPreviewFactory;
private readonly SplashScreen splashScreen;
Expand Down Expand Up @@ -99,7 +99,7 @@ public AuthenticationScreenController(
ViewFactoryMethod viewFactory,
ICompositeWeb3Provider web3Authenticator,
ISelfProfile selfProfile,
IWebBrowser webBrowser,
UnityAppWebBrowser webBrowser,
IWeb3IdentityCache storedIdentityProvider,
ICharacterPreviewFactory characterPreviewFactory,
SplashScreen splashScreen,
Expand Down Expand Up @@ -165,7 +165,7 @@ protected override void OnViewInstantiated()
new InitAuthState(viewInstance, installSource),
new LoginSelectionAuthState(fsm, viewInstance, this, CurrentState, splashScreen, web3Authenticator, webBrowser, enableEmailOTP),
new ProfileFetchingAuthState(fsm, viewInstance, this, CurrentState, selfProfile, storedIdentityProvider),
new IdentityVerificationDappAuthState(fsm, viewInstance, this, CurrentState, web3Authenticator),
new IdentityVerificationDappDeepLinkAuthState(fsm, viewInstance, this, CurrentState, web3Authenticator),
new LobbyForExistingAccountAuthState(fsm, viewInstance, this, splashScreen, CurrentState, characterPreviewController),
new LobbyForNewAccountAuthState(fsm, viewInstance, this, CurrentState, characterPreviewController, selfProfile, wearablesProvider, webBrowser, webRequestController, decentralandUrlsSource, profileChangesBus)
);
Expand Down Expand Up @@ -289,7 +289,7 @@ async UniTaskVoid ChangeAccountAsync(CancellationToken ct)

private void OpenSupportUrl()
{
webBrowser.OpenUrl(DecentralandUrl.SupportLink);
webBrowser.OpenUrlMainThreadOnly(DecentralandUrl.SupportLink);
DiscordButtonClicked?.Invoke();
}

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Cysharp.Threading.Tasks;
using DCL.Diagnostics;
using DCL.PerformanceAndDiagnostics;
using DCL.Utilities;
using DCL.Web3;
using DCL.Web3.Authenticators;
Expand All @@ -14,25 +13,23 @@

namespace DCL.AuthenticationScreenFlow
{
public class IdentityVerificationDappAuthState : AuthStateBase, IPayloadedState<(LoginMethod method, CancellationToken ct)>
public class IdentityVerificationDappDeepLinkAuthState : AuthStateBase, IPayloadedState<(LoginMethod method, CancellationToken ct)>
{
private readonly MVCStateMachine<AuthStateBase> machine;
private readonly VerificationDappAuthView view;
private readonly AuthenticationScreenController controller;
private readonly ReactiveProperty<AuthStatus> currentState;
private readonly ICompositeWeb3Provider compositeWeb3Provider;

private Exception? loginException;

public IdentityVerificationDappAuthState(
public IdentityVerificationDappDeepLinkAuthState(
MVCStateMachine<AuthStateBase> machine,
AuthenticationScreenView viewInstance,
AuthenticationScreenController controller,
ReactiveProperty<AuthStatus> currentState,
ICompositeWeb3Provider compositeWeb3Provider) : base(viewInstance)
{
this.machine = machine;
view = viewInstance.VerificationDappAuthView;
this.controller = controller;
this.currentState = currentState;
this.compositeWeb3Provider = compositeWeb3Provider;
Expand All @@ -49,68 +46,57 @@ public void Enter((LoginMethod method, CancellationToken ct) payload)

controller.CurrentRequestID = string.Empty;

currentState.Value = AuthStatus.VerificationRequested;
AuthenticateAsync(payload.method, payload.ct).Forget();
}

public override void Exit()
{
if (loginException == null)
if (loginException != null)
{
view.Hide(OUT);

// Hide login selection view if still visible (social logins skip the verification step,
// so ShowVerification is never called and the login selection view remains active)
if (viewInstance.LoginSelectionAuthView.gameObject.activeSelf)
viewInstance.LoginSelectionAuthView.Hide();
}
else
{
if (currentState.Value == AuthStatus.VerificationRequested)
view.Hide(SLIDE);

spanErrorInfo = loginException switch
{
OperationCanceledException => new SpanErrorInfo("Login process was cancelled by user"),
SignatureExpiredException ex => new SpanErrorInfo("Web3 signature expired during authentication", ex),
Web3SignatureException ex => new SpanErrorInfo("Web3 signature validation failed", ex),
CodeVerificationException ex => new SpanErrorInfo("Code verification failed during authentication", ex),
Web3Exception ex => new SpanErrorInfo("Connection error during authentication flow", ex),
Exception ex => new SpanErrorInfo("Unexpected error during authentication flow", ex),
OperationCanceledException ex => new SpanErrorInfo("Login process was cancelled by user", ex),
TimeoutException ex => new SpanErrorInfo("Deep-link sign-in timed out waiting for the browser to deliver the signin deep link", ex),
SignatureExpiredException ex => new SpanErrorInfo("Web3 signature expired during deep-link authentication", ex),
Web3SignatureException ex => new SpanErrorInfo("Web3 signature validation failed during deep-link authentication", ex),
DeeplinkSigninRetrievalException ex => new SpanErrorInfo($"Signin identity retrieval failed: {ex.Reason}", ex),
Web3Exception ex => new SpanErrorInfo("Connection error during deep-link authentication flow", ex),
{ } ex => new SpanErrorInfo("Unexpected error during deep-link authentication flow", ex),
};

if (loginException is not OperationCanceledException)
ReportHub.LogException(loginException, new ReportData(ReportCategory.AUTHENTICATION));
}

NativeWindowManager.ReleaseTemporaryWindowMode();
view.BackButton.onClick.RemoveListener(controller.CancelLoginProcess);
base.Exit();
}

private async UniTaskVoid AuthenticateAsync(LoginMethod method, CancellationToken ct)
{
try
{
compositeWeb3Provider.VerificationRequired += ShowVerification;
IWeb3Identity identity = await compositeWeb3Provider.LoginAsync(LoginPayload.ForDappFlow(method), ct);
viewInstance.LoginSelectionAuthView.Hide();
machine.Enter<ProfileFetchingAuthState, ProfileFetchingPayload>(new (identity, false, ct));
}
catch (OperationCanceledException e)
Comment thread
popuz marked this conversation as resolved.
{
loginException = e;
machine.Enter<LoginSelectionAuthState, int>(SLIDE);
}
catch (SignatureExpiredException e)
catch (TimeoutException e)
{
loginException = e;
machine.Enter<LoginSelectionAuthState, int>(SLIDE);
}
catch (Web3SignatureException e)
catch (SignatureExpiredException e)
{
loginException = e;
machine.Enter<LoginSelectionAuthState, int>(SLIDE);
}
catch (CodeVerificationException e)
catch (Web3SignatureException e)
{
loginException = e;
machine.Enter<LoginSelectionAuthState, int>(SLIDE);
Expand All @@ -125,32 +111,6 @@ private async UniTaskVoid AuthenticateAsync(LoginMethod method, CancellationToke
loginException = e;
machine.Enter<LoginSelectionAuthState, ErrorType>(ErrorType.CONNECTION_ERROR);
}
finally
{
compositeWeb3Provider.VerificationRequired -= ShowVerification;
}
}

private void ShowVerification((int code, DateTime expiration, string requestId) data)
{
compositeWeb3Provider.VerificationRequired -= ShowVerification;

controller.CurrentRequestID = data.requestId;
currentState.Value = AuthStatus.VerificationRequested;

SentryTransactionNameMapping.Instance.StartSpan(LOADING_TRANSACTION_NAME, new SpanData
{
SpanName = "CodeVerification",
SpanOperation = "auth.code_verification",
Depth = STATE_SPAN_DEPTH + 1,
});

// Hide non-interactable Login Screen
viewInstance.LoginSelectionAuthView.Hide();

// Show Verification Screen
view.Show(data.code, data.expiration);
view.BackButton.onClick.AddListener(controller.CancelLoginProcess);
}
}
}

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class LobbyForNewAccountAuthState : AuthStateBase, IPayloadedState<(Profi
private readonly LobbyForNewAccountAuthView view;

private readonly IWearablesProvider wearablesProvider;
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;
private readonly IWebRequestController webRequestController;
private readonly IDecentralandUrlsSource decentralandUrlsSource;
private readonly ProfileChangesBus profileChangesBus;
Expand All @@ -57,7 +57,7 @@ public LobbyForNewAccountAuthState(MVCStateMachine<AuthStateBase> fsm,
AuthenticationScreenCharacterPreviewController characterPreviewController,
ISelfProfile selfProfile,
IWearablesProvider wearablesProvider,
IWebBrowser webBrowser,
UnityAppWebBrowser webBrowser,
IWebRequestController webRequestController,
IDecentralandUrlsSource decentralandUrlsSource,
ProfileChangesBus profileChangesBus) : base(viewInstance)
Expand Down Expand Up @@ -161,7 +161,7 @@ private void ReparentCharacterPreview()
}

private void OpenClickableURL(string url) =>
webBrowser.OpenUrl(url);
webBrowser.OpenUrlMainThreadOnly(url);

private async UniTask InitializeAvatarAsync()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ public class LoginSelectionAuthState : AuthStateBase, IState, IPayloadedState<Er
private readonly ReactiveProperty<AuthStatus> currentState;
private readonly SplashScreen splashScreen;
private readonly ICompositeWeb3Provider compositeWeb3Provider;
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;
private readonly bool enableEmailOTP;

public LoginSelectionAuthState(MVCStateMachine<AuthStateBase> machine,
AuthenticationScreenView viewInstance, AuthenticationScreenController controller,
ReactiveProperty<AuthStatus> currentState, SplashScreen splashScreen,
ICompositeWeb3Provider compositeWeb3Provider, IWebBrowser webBrowser, bool enableEmailOTP) : base(viewInstance)
ICompositeWeb3Provider compositeWeb3Provider, UnityAppWebBrowser webBrowser, bool enableEmailOTP) : base(viewInstance)
{
view = viewInstance.LoginSelectionAuthView;

Expand Down Expand Up @@ -174,7 +174,7 @@ private void Login(LoginMethod method)
currentState.Value = AuthStatus.LoginRequested;

view.SetLoadingSpinnerVisibility(true);
machine.Enter<IdentityVerificationDappAuthState, (LoginMethod, CancellationToken)>((method, controller.GetRestartedLoginToken()));
machine.Enter<IdentityVerificationDappDeepLinkAuthState, (LoginMethod, CancellationToken)>((method, controller.GetRestartedLoginToken()));
}

private void OTPLogin()
Expand Down Expand Up @@ -202,7 +202,7 @@ private void CloseErrorPopup() =>
view.ErrorPopupRoot.SetActive(false);

private void RequestAlphaAccess() =>
webBrowser.OpenUrl(REQUEST_BETA_ACCESS_LINK);
webBrowser.OpenUrlMainThreadOnly(REQUEST_BETA_ACCESS_LINK);
}

public enum ErrorType
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public class AvatarController : ISection, IDisposable
{
private readonly AvatarView view;
private readonly RectTransform rectTransform;
private readonly IWebBrowser webBrowser;
private readonly UnityAppWebBrowser webBrowser;
private readonly BackpackSlotsController slotsController;
private readonly CategoriesPresenter categoriesPresenter;
private readonly OutfitsPresenter outfitsPresenter;
Expand All @@ -28,7 +28,7 @@ public class AvatarController : ISection, IDisposable
private readonly URLParameter marketplaceSourceParam = new ("utm_source", "backpack");

public AvatarController(AvatarView view,
IWebBrowser webBrowser,
UnityAppWebBrowser webBrowser,
AvatarSlotView[] slotViews,
NftTypeIconSO rarityBackgrounds,
BackpackCommandBus backpackCommandBus,
Expand Down Expand Up @@ -77,7 +77,7 @@ private void OnOpenMarketplace()
urlBuilder.Clear();
urlBuilder.AppendDomain(URLDomain.FromString(decentralandUrlsSource.Url(DecentralandUrl.Market)));
urlBuilder.AppendParameter(marketplaceSourceParam);
webBrowser.OpenUrl(urlBuilder.Build());
webBrowser.OpenUrlMainThreadOnly(urlBuilder.Build());
}

public void Dispose()
Expand Down
Loading
Loading