Merge remote-tracking branch 'upstream/master' into ELECTRON-445

# Conflicts:
#	js/mainApiMgr.js
#	js/memoryMonitor.js
#	js/preload/preloadMain.js
This commit is contained in:
Kiran Niranjan 2018-06-05 16:17:27 +05:30
commit 6af47e9fef
17 changed files with 307 additions and 250 deletions

View File

@ -7,6 +7,7 @@
"whitelistUrl": "*",
"isCustomTitleBar": true,
"memoryRefresh": true,
"ctWhitelist": [],
"notificationSettings": {
"position": "upper-right",
"display": ""

View File

@ -377,8 +377,8 @@
<ROW Dialog_="AdminInstallPointDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="900" MsiKey="AdminInstallPointDlg#BannerBitmap"/>
<ROW Dialog_="AdminWelcomeDlg" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="Welcome to the [ProductName] [Wizard]" TextStyle="VerdanaBold13" Order="500" TextLocId="Control.Text.AdminWelcomeDlg#Title" MsiKey="AdminWelcomeDlg#Title"/>
<ROW Dialog_="AdminWelcomeDlg" Control="Description" Type="Text" X="132" Y="61" Width="220" Height="40" Attributes="196611" Text="The [Wizard] will create a server image of [ProductName], at a specified network location. Click &quot;[Text_Next]&quot; to continue or &quot;Cancel&quot; to exit the [Wizard]." Order="600" TextLocId="Control.Text.AdminWelcomeDlg#Description" MsiKey="AdminWelcomeDlg#Description"/>
<ROW Dialog_="AdvanceSettings" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="OK" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Next" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="OK" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="2" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="2" Text="[ButtonText_Back]" Order="300" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="AdvanceSettings" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
@ -416,7 +416,7 @@
<ROW Dialog_="ExitDialog" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="Installation of [ProductName] is complete" TextStyle="VerdanaBold13" Order="600" TextLocId="Control.Text.ExitDialog#Title" MsiKey="ExitDialog#Title"/>
<ROW Dialog_="ExitDialog" Control="LaunchProdText" Type="Text" X="148" Y="170" Width="220" Height="20" Attributes="196611" Text="Launch [ProductName]" Order="700" TextLocId="Control.Text.ExitDialog#LaunchProdText" MsiKey="ExitDialog#LaunchProdText"/>
<ROW Dialog_="ExitDialog" Control="LaunchProdCheckBox" Type="CheckBox" X="135" Y="170" Width="10" Height="10" Attributes="3" Property="RUNAPPLICATION" Order="800" MsiKey="ExitDialog#LaunchProdCheckBox" Options="1"/>
<ROW Dialog_="ExitDialog" Control="Description" Type="Text" X="132" Y="60" Width="220" Height="20" Attributes="196611" Text="Click &quot;Finish&quot;to get started!" Order="900" TextLocId="Control.Text.ExitDialog#Description" MsiKey="ExitDialog#Description"/>
<ROW Dialog_="ExitDialog" Control="Description" Type="Text" X="132" Y="60" Width="220" Height="20" Attributes="196611" Text="Click &quot;Finish&quot; to get started!" Order="900" TextLocId="Control.Text.ExitDialog#Description" MsiKey="ExitDialog#Description"/>
<ROW Dialog_="ExitDialog" Control="BottomLine" Type="Line" X="0" Y="234" Width="372" Height="0" Attributes="1" Order="1000" MsiKey="ExitDialog#BottomLine"/>
<ROW Dialog_="FatalError" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="The [ProductName] [Wizard] ended prematurely" TextStyle="VerdanaBold13" Order="800" TextLocId="Control.Text.FatalError#Title" MsiKey="FatalError#Title"/>
<ROW Dialog_="FilesInUse" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400" MsiKey="FilesInUse#BannerBitmap"/>
@ -434,6 +434,7 @@
<ROW Dialog_="InstallTypeDlg" Control="Text_3" Type="Text" X="135" Y="60" Width="203" Height="12" Attributes="196611" Text="- Collaborate securely" Order="1100" TextLocId="Control.Text.WelcomeDlg#Description"/>
<ROW Dialog_="InstallTypeDlg" Control="Text_4" Type="Text" X="135" Y="72" Width="198" Height="12" Attributes="196611" Text="- Communicate via messages, voice, and video" Order="1200" TextLocId="Control.Text.WelcomeDlg#Description"/>
<ROW Dialog_="InstallTypeDlg" Control="Text_5" Type="Text" X="135" Y="84" Width="204" Height="19" Attributes="196611" Text="- Connect with colleagues and coworkers" Order="1300" TextLocId="Control.Text.WelcomeDlg#Description"/>
<ROW Dialog_="InstallationDlg" Control="InstallationDlgDialogInitializer" Type="DialogInitializer" X="0" Y="0" Width="0" Height="0" Attributes="0" Order="-1" TextLocId="-" HelpLocId="-" ExtDataLocId="-"/>
<ROW Dialog_="InstallationDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="Next &gt;" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="InstallationDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="InstallationDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="[DialogBitmap]" Order="300"/>
@ -442,7 +443,7 @@
<ROW Dialog_="InstallationDlg" Control="FolderEdit" Type="PathEdit" X="129" Y="106" Width="134" Height="18" Attributes="7" Property="APPDIR" Help="|" Order="600" HelpLocId="Control.Help.FolderDlg#FolderEdit"/>
<ROW Dialog_="InstallationDlg" Control="Browse" Type="PushButton" X="269" Y="106" Width="90" Height="18" Attributes="3" Text="[ButtonText_Browse]" Help="|" Order="700" TextLocId="-" HelpLocId="Control.Help.FolderDlg#Browse"/>
<ROW Dialog_="InstallationDlg" Control="Edit_POD_URL" Type="Edit" X="128" Y="157" Width="231" Height="18" Attributes="3" Property="POD_URL" Text="{260}" Order="800"/>
<ROW Dialog_="InstallationDlg" Control="Text_2" Type="Text" X="129" Y="142" Width="131" Height="11" Attributes="65539" Property="TEXT_2_PROP_1" Text="[ProductName] POD URL:" Order="900"/>
<ROW Dialog_="InstallationDlg" Control="Text_2" Type="Text" X="129" Y="142" Width="131" Height="11" Attributes="65539" Property="TEXT_2_PROP_1" Text="[ProductName] Pod URL:" Order="900"/>
<ROW Dialog_="InstallationDlg" Control="Text_1" Type="Text" X="129" Y="52" Width="230" Height="23" Attributes="65539" Property="TEXT_1_PROP_3" Text="Click Install to install [ProductName] in the folder below. To install to a different folder, enter it below or click Browse." Order="1000"/>
<ROW Dialog_="InstallationDlg" Control="Text_3" Type="Text" X="129" Y="90" Width="75" Height="11" Attributes="65539" Property="TEXT_3_PROP_4" Text="&amp;Folder:" Order="1100"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="ChangeLabel" Type="Text" X="105" Y="65" Width="100" Height="10" Attributes="2" Text="&amp;Modify" TextStyle="[DlgTitleFont]" Order="100" TextLocId="Control.Text.MaintenanceTypeDlg#ChangeLabel" MsiKey="MaintenanceTypeDlg#ChangeLabel"/>
@ -462,24 +463,6 @@
<ROW Dialog_="MaintenanceWelcomeDlg" Control="Description" Type="Text" X="132" Y="61" Width="220" Height="40" Attributes="196611" Text="The [Wizard] will allow you to change the way [ProductName] features are installed on your computer or even to remove [ProductName] from your computer. Click &quot;[Text_Next]&quot; to continue or &quot;Cancel&quot; to exit the [Wizard]." Order="600" TextLocId="Control.Text.MaintenanceWelcomeDlg#Description" MsiKey="MaintenanceWelcomeDlg#Description"/>
<ROW Dialog_="MsiRMFilesInUse" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="300" MsiKey="MsiRMFilesInUse#BannerBitmap"/>
<ROW Dialog_="MsiRMFilesInUse" Control="Logo" Type="Text" X="4" Y="228" Width="38" Height="12" Attributes="1" Text="Symphony" Order="1100" TextLocId="Control.Text.MsiRMFilesInUse#Logo" MsiKey="MsiRMFilesInUse#Logo"/>
<ROW Dialog_="NewDialog" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="NewDialog" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="NewDialog" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" TextLocId="-" Options="1"/>
<ROW Dialog_="NewDialog" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="NewDialog" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="NewDialog" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="NewDialog" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="New Dialog Description..." Order="700"/>
<ROW Dialog_="NewDialog" Control="Logo" Type="Text" X="4" Y="228" Width="70" Height="12" Attributes="1" Text="Advanced Installer" Order="800"/>
<ROW Dialog_="NewDialog" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="New Dialog" TextStyle="[DlgTitleFont]" Order="900"/>
<ROW Dialog_="NewDialog_1" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Next]" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="NewDialog_1" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="NewDialog_1" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="300" TextLocId="-" Options="1"/>
<ROW Dialog_="NewDialog_1" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="NewDialog_1" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
<ROW Dialog_="NewDialog_1" Control="BottomLine" Type="Line" X="5" Y="234" Width="368" Height="0" Attributes="1" Order="600"/>
<ROW Dialog_="NewDialog_1" Control="Description" Type="Text" X="25" Y="23" Width="280" Height="15" Attributes="196611" Text="New Dialog Description..." Order="700"/>
<ROW Dialog_="NewDialog_1" Control="Logo" Type="Text" X="4" Y="228" Width="70" Height="12" Attributes="1" Text="Advanced Installer" Order="800"/>
<ROW Dialog_="NewDialog_1" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="New Dialog" TextStyle="[DlgTitleFont]" Order="900"/>
<ROW Dialog_="OutOfDiskDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="200" MsiKey="OutOfDiskDlg#BannerBitmap"/>
<ROW Dialog_="OutOfDiskDlg" Control="Logo" Type="Text" X="4" Y="228" Width="38" Height="12" Attributes="1" Text="Symphony" Order="400" TextLocId="Control.Text.OutOfDiskDlg#Logo" MsiKey="OutOfDiskDlg#Logo"/>
<ROW Dialog_="OutOfRbDiskDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="300" MsiKey="OutOfRbDiskDlg#BannerBitmap"/>
@ -521,6 +504,13 @@
<ROW Dialog_="SettingsDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Basic Settings" TextStyle="[DlgTitleFont]" Order="1800" TextLocId="Control.Text.FolderDlg#Title"/>
<ROW Dialog_="SettingsDlg" Control="Description" Type="Text" X="17" Y="21" Width="272" Height="14" Attributes="196611" Text="Select features for your users." Order="1900" TextLocId="Control.Text.FolderDlg#Description"/>
<ROW Dialog_="SettingsDlg" Control="PushButton_1" Type="PushButton" X="267" Y="206" Width="92" Height="17" Attributes="3" Text="Advance Settings" Order="2000"/>
<ROW Dialog_="UrlValidationDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Next]" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="UrlValidationDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="2" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="UrlValidationDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="[DialogBitmap]" Order="300"/>
<ROW Dialog_="UrlValidationDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="400" TextLocId="-" Options="1"/>
<ROW Dialog_="UrlValidationDlg" Control="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Attributes="196611" Text="Invalid Pod URL" TextStyle="VerdanaBold13" Order="500"/>
<ROW Dialog_="UrlValidationDlg" Control="Description" Type="Text" X="135" Y="86" Width="220" Height="60" Attributes="196611" Text="Sorry, the pod URL you entered is invalid. Please return to the previous screen and re-enter it." Order="600"/>
<ROW Dialog_="UrlValidationDlg" Control="BottomLine" Type="Line" X="0" Y="234" Width="372" Height="0" Attributes="1" Order="700"/>
<ROW Dialog_="UserExit" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="The [ProductName] [Wizard] was interrupted" TextStyle="VerdanaBold13" Order="500" TextLocId="Control.Text.UserExit#Title" MsiKey="UserExit#Title"/>
<ROW Dialog_="VerifyReadyDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="300" MsiKey="VerifyReadyDlg#BannerBitmap"/>
<ROW Dialog_="VerifyReadyDlg" Control="Logo" Type="Text" X="5" Y="228" Width="39" Height="12" Attributes="1" Text="Symphony" Order="500" TextLocId="Control.Text.VerifyReadyDlg#Logo" MsiKey="VerifyReadyDlg#Logo"/>
@ -556,7 +546,7 @@
<ROW Dialog_="VerifyReadyDlg" Control_="Back" Event="NewDialog" Argument="PatchWelcomeDlg" Condition="AI_PATCH" Ordering="203"/>
<ROW Dialog_="InstallTypeDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="102"/>
<ROW Dialog_="InstallationDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="4"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL AND ( INVALID_POD_URL = &quot;valid&quot; )" Ordering="6"/>
<ROW Dialog_="SettingsDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="6"/>
<ROW Dialog_="SettingsDlg" Control_="PushButton_1" Event="SpawnDialog" Argument="AdvanceSettings" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="SettingsDlg" Control_="Next" Event="SpawnDialog" Argument="OutOfRbDiskDlg" Condition="AI_INSTALL AND OutOfDiskSpace = 1 AND OutOfNoRbDiskSpace = 0 AND (PROMPTROLLBACKCOST=&quot;P&quot; OR NOT PROMPTROLLBACKCOST)" Ordering="9" Options="2"/>
@ -574,14 +564,17 @@
<ROW Dialog_="AdvanceSettings" Control_="Next" Event="EndDialog" Argument="Return" Condition="1" Ordering="1"/>
<ROW Dialog_="SettingsDlg" Control_="Next" Event="DoAction" Argument="PodUrlValidation" Condition="AI_INSTALL" Ordering="7"/>
<ROW Dialog_="InstallationDlg" Control_="Back" Event="SpawnDialog" Argument="InstallTypeDlg" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="NewDialog" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="SettingsDlg" Control_="TemplateSeqDlgDialogInitializer" Event="[AI_ButtonText_Next_Orig]" Argument="[ButtonText_Next]" Condition="AI_INSTALL" Ordering="4"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="NewDialog" Argument="SettingsDlg" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="NewDialog_1" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="NewDialog" Argument="SettingsDlg" Condition="AI_INSTALL AND ( INVALID_POD_URL = &quot;valid&quot; )" Ordering="5"/>
<ROW Dialog_="InstallTypeDlg" Control_="Next" Event="NewDialog" Argument="InstallationDlg" Condition="AI_INSTALL" Ordering="101"/>
<ROW Dialog_="SettingsDlg" Control_="Back" Event="[Text_Next]" Argument="[AI_Text_Next_Orig]" Condition="AI_INSTALL" Ordering="5" Options="2"/>
<ROW Dialog_="SettingsDlg" Control_="Back" Event="SpawnDialog" Argument="InstallationDlg" Condition="AI_INSTALL" Ordering="6"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="SetTargetPath" Argument="APPDIR" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="SetTargetPath" Argument="APPDIR" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="UrlValidationDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="InstallationDlg" Control_="InstallationDlgDialogInitializer" Event="DoAction" Argument="PodUrlValidation" Condition="AI_INSTALL" Ordering="0"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="SpawnDialog" Argument="UrlValidationDlg" Condition="AI_INSTALL AND ( INVALID_POD_URL = &quot;invalid&quot; )" Ordering="4"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="DoAction" Argument="PodUrlValidation" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="UrlValidationDlg" Control_="Back" Event="EndDialog" Argument="Return" Condition="1" Ordering="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="Symphony_Dir" Component_="Symphony" ManualDelete="false"/>
@ -621,9 +614,8 @@
<COMPONENT cid="caphyon.advinst.msicomp.MsiDialogComponent">
<ROW Dialog="AdvanceSettings" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="InstallationDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="NewDialog" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="NewDialog_1" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="SettingsDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="UrlValidationDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
<ROW Name="icon.exe" SourcePath="..\..\build\icon.ico" Index="0"/>
@ -649,9 +641,9 @@
<ROW Action="AI_DpiContentScale" Sequence="51"/>
<ROW Action="ExecuteAction" Sequence="1299" SeqType="0" MsiKey="ExecuteAction"/>
<ROW Action="AI_SETMIXINSTLOCATION" Sequence="749"/>
<ROW Action="InstallTypeDlg" Condition="AI_INSTALL" Sequence="1227" SeqType="3" MsiKey="WelcomeDlg"/>
<ROW Action="InstallTypeDlg" Condition="AI_INSTALL" Sequence="1223" SeqType="3" MsiKey="WelcomeDlg"/>
<ROW Action="UninstallPreviousVersions" Sequence="1281"/>
<ROW Action="InstallationDlg" Condition="AI_INSTALL" Sequence="1228" SeqType="3"/>
<ROW Action="InstallationDlg" Condition="AI_INSTALL" Sequence="1227" SeqType="3"/>
<ROW Action="SettingsDlg" Condition="AI_INSTALL" Sequence="1232" SeqType="3"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiLaunchConditionsComponent">

View File

@ -368,8 +368,8 @@
<ROW Dialog_="AdminInstallPointDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="900" MsiKey="AdminInstallPointDlg#BannerBitmap"/>
<ROW Dialog_="AdminWelcomeDlg" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="Welcome to the [ProductName] [Wizard]" TextStyle="VerdanaBold13" Order="500" TextLocId="Control.Text.AdminWelcomeDlg#Title" MsiKey="AdminWelcomeDlg#Title"/>
<ROW Dialog_="AdminWelcomeDlg" Control="Description" Type="Text" X="132" Y="61" Width="220" Height="40" Attributes="196611" Text="The [Wizard] will create a server image of [ProductName], at a specified network location. Click &quot;[Text_Next]&quot; to continue or &quot;Cancel&quot; to exit the [Wizard]." Order="600" TextLocId="Control.Text.AdminWelcomeDlg#Description" MsiKey="AdminWelcomeDlg#Description"/>
<ROW Dialog_="AdvanceSettings" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="OK" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Next" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="OK" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="2" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="2" Text="[ButtonText_Back]" Order="300" TextLocId="-" Options="1"/>
<ROW Dialog_="AdvanceSettings" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400"/>
<ROW Dialog_="AdvanceSettings" Control="BannerLine" Type="Line" X="0" Y="44" Width="372" Height="0" Attributes="1" Order="500"/>
@ -407,7 +407,7 @@
<ROW Dialog_="ExitDialog" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="Installation of [ProductName] is complete" TextStyle="VerdanaBold13" Order="600" TextLocId="Control.Text.ExitDialog#Title" MsiKey="ExitDialog#Title"/>
<ROW Dialog_="ExitDialog" Control="LaunchProdText" Type="Text" X="148" Y="170" Width="220" Height="20" Attributes="196611" Text="Launch [ProductName]" Order="700" TextLocId="Control.Text.ExitDialog#LaunchProdText" MsiKey="ExitDialog#LaunchProdText"/>
<ROW Dialog_="ExitDialog" Control="LaunchProdCheckBox" Type="CheckBox" X="135" Y="170" Width="10" Height="10" Attributes="3" Property="RUNAPPLICATION" Order="800" MsiKey="ExitDialog#LaunchProdCheckBox" Options="1"/>
<ROW Dialog_="ExitDialog" Control="Description" Type="Text" X="132" Y="60" Width="220" Height="20" Attributes="196611" Text="Click &quot;Finish&quot;to get started!" Order="900" TextLocId="Control.Text.ExitDialog#Description" MsiKey="ExitDialog#Description"/>
<ROW Dialog_="ExitDialog" Control="Description" Type="Text" X="132" Y="60" Width="220" Height="20" Attributes="196611" Text="Click &quot;Finish&quot; to get started!" Order="900" TextLocId="Control.Text.ExitDialog#Description" MsiKey="ExitDialog#Description"/>
<ROW Dialog_="ExitDialog" Control="BottomLine" Type="Line" X="0" Y="234" Width="372" Height="0" Attributes="1" Order="1000" MsiKey="ExitDialog#BottomLine"/>
<ROW Dialog_="FatalError" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="The [ProductName] [Wizard] ended prematurely" TextStyle="VerdanaBold13" Order="800" TextLocId="Control.Text.FatalError#Title" MsiKey="FatalError#Title"/>
<ROW Dialog_="FilesInUse" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="400" MsiKey="FilesInUse#BannerBitmap"/>
@ -425,6 +425,7 @@
<ROW Dialog_="InstallTypeDlg" Control="Text_3" Type="Text" X="135" Y="60" Width="203" Height="12" Attributes="196611" Text="- Collaborate securely" Order="1100" TextLocId="Control.Text.WelcomeDlg#Description"/>
<ROW Dialog_="InstallTypeDlg" Control="Text_4" Type="Text" X="135" Y="72" Width="198" Height="12" Attributes="196611" Text="- Communicate via messages, voice, and video" Order="1200" TextLocId="Control.Text.WelcomeDlg#Description"/>
<ROW Dialog_="InstallTypeDlg" Control="Text_5" Type="Text" X="135" Y="84" Width="204" Height="19" Attributes="196611" Text="- Connect with colleagues and coworkers" Order="1300" TextLocId="Control.Text.WelcomeDlg#Description"/>
<ROW Dialog_="InstallationDlg" Control="InstallationDlgDialogInitializer" Type="DialogInitializer" X="0" Y="0" Width="0" Height="0" Attributes="0" Order="-1" TextLocId="-" HelpLocId="-" ExtDataLocId="-"/>
<ROW Dialog_="InstallationDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="3" Text="Next &gt;" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="InstallationDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="InstallationDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="[DialogBitmap]" Order="300"/>
@ -433,7 +434,7 @@
<ROW Dialog_="InstallationDlg" Control="FolderEdit" Type="PathEdit" X="129" Y="106" Width="134" Height="18" Attributes="7" Property="APPDIR" Help="|" Order="600" HelpLocId="Control.Help.FolderDlg#FolderEdit"/>
<ROW Dialog_="InstallationDlg" Control="Browse" Type="PushButton" X="269" Y="106" Width="90" Height="18" Attributes="3" Text="[ButtonText_Browse]" Help="|" Order="700" TextLocId="-" HelpLocId="Control.Help.FolderDlg#Browse"/>
<ROW Dialog_="InstallationDlg" Control="Edit_POD_URL" Type="Edit" X="128" Y="157" Width="231" Height="18" Attributes="3" Property="POD_URL" Text="{260}" Order="800"/>
<ROW Dialog_="InstallationDlg" Control="Text_2" Type="Text" X="129" Y="142" Width="131" Height="11" Attributes="65539" Property="TEXT_2_PROP_1" Text="[ProductName] POD URL:" Order="900"/>
<ROW Dialog_="InstallationDlg" Control="Text_2" Type="Text" X="129" Y="142" Width="131" Height="11" Attributes="65539" Property="TEXT_2_PROP_1" Text="[ProductName] Pod URL:" Order="900"/>
<ROW Dialog_="InstallationDlg" Control="Text_1" Type="Text" X="129" Y="52" Width="230" Height="23" Attributes="65539" Property="TEXT_1_PROP_3" Text="Click Install to install [ProductName] in the folder below. To install to a different folder, enter it below or click Browse." Order="1000"/>
<ROW Dialog_="InstallationDlg" Control="Text_3" Type="Text" X="129" Y="90" Width="75" Height="11" Attributes="65539" Property="TEXT_3_PROP_4" Text="&amp;Folder:" Order="1100"/>
<ROW Dialog_="MaintenanceTypeDlg" Control="ChangeLabel" Type="Text" X="105" Y="65" Width="100" Height="10" Attributes="2" Text="&amp;Modify" TextStyle="[DlgTitleFont]" Order="100" TextLocId="Control.Text.MaintenanceTypeDlg#ChangeLabel" MsiKey="MaintenanceTypeDlg#ChangeLabel"/>
@ -494,6 +495,13 @@
<ROW Dialog_="SettingsDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Help="|" Order="1800" HelpLocId="Control.Help.FolderDlg#BannerBitmap"/>
<ROW Dialog_="SettingsDlg" Control="Title" Type="Text" X="15" Y="6" Width="200" Height="15" Attributes="196611" Text="Basic Settings" TextStyle="[DlgTitleFont]" Order="1900" TextLocId="Control.Text.FolderDlg#Title"/>
<ROW Dialog_="SettingsDlg" Control="Description" Type="Text" X="17" Y="21" Width="272" Height="14" Attributes="196611" Text="Select features for your users." Order="2000" TextLocId="Control.Text.FolderDlg#Description"/>
<ROW Dialog_="UrlValidationDlg" Control="Next" Type="PushButton" X="236" Y="243" Width="56" Height="17" Attributes="1" Text="[ButtonText_Next]" Order="100" TextLocId="-" Options="1"/>
<ROW Dialog_="UrlValidationDlg" Control="Cancel" Type="PushButton" X="304" Y="243" Width="56" Height="17" Attributes="2" Text="[ButtonText_Cancel]" Order="200" TextLocId="-" Options="1"/>
<ROW Dialog_="UrlValidationDlg" Control="Bitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="234" Attributes="1048577" Text="[DialogBitmap]" Order="300"/>
<ROW Dialog_="UrlValidationDlg" Control="Back" Type="PushButton" X="180" Y="243" Width="56" Height="17" Attributes="3" Text="[ButtonText_Back]" Order="400" TextLocId="-" Options="1"/>
<ROW Dialog_="UrlValidationDlg" Control="Title" Type="Text" X="135" Y="20" Width="220" Height="60" Attributes="196611" Text="Invalid Pod URL" TextStyle="VerdanaBold13" Order="500"/>
<ROW Dialog_="UrlValidationDlg" Control="Description" Type="Text" X="135" Y="86" Width="220" Height="60" Attributes="196611" Text="Sorry, the pod URL you entered is invalid. Please return to the previous screen and re-enter it." Order="600"/>
<ROW Dialog_="UrlValidationDlg" Control="BottomLine" Type="Line" X="0" Y="234" Width="372" Height="0" Attributes="1" Order="700"/>
<ROW Dialog_="UserExit" Control="Title" Type="Text" X="132" Y="10" Width="220" Height="47" Attributes="196611" Text="The [ProductName] [Wizard] was interrupted" TextStyle="VerdanaBold13" Order="500" TextLocId="Control.Text.UserExit#Title" MsiKey="UserExit#Title"/>
<ROW Dialog_="VerifyReadyDlg" Control="BannerBitmap" Type="Bitmap" X="0" Y="0" Width="370" Height="44" Attributes="1048577" Text="[BannerBitmap]" Order="300" MsiKey="VerifyReadyDlg#BannerBitmap"/>
<ROW Dialog_="VerifyReadyDlg" Control="Logo" Type="Text" X="5" Y="228" Width="39" Height="12" Attributes="1" Text="Symphony" Order="500" TextLocId="Control.Text.VerifyReadyDlg#Logo" MsiKey="VerifyReadyDlg#Logo"/>
@ -540,7 +548,7 @@
<ROW Dialog_="SettingsDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="SettingsDlg" Control_="Back" Event="[ButtonText_Next]" Argument="[AI_ButtonText_Next_Orig]" Condition="AI_INSTALL" Ordering="0" Options="2"/>
<ROW Dialog_="InstallationDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL" Ordering="3"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="EndDialog" Argument="Return" Condition="AI_INSTALL AND ( INVALID_POD_URL = &quot;valid&quot; )" Ordering="5"/>
<ROW Dialog_="InstallationDlg" Control_="Browse" Event="[_BrowseProperty]" Argument="APPDIR" Condition="1" Ordering="100"/>
<ROW Dialog_="InstallationDlg" Control_="Browse" Event="SpawnDialog" Argument="BrowseDlg" Condition="1" Ordering="200"/>
<ROW Dialog_="AdvanceSettings" Control_="Cancel" Event="EndDialog" Argument="Return" Condition="1" Ordering="0"/>
@ -551,7 +559,12 @@
<ROW Dialog_="SettingsDlg" Control_="Next" Event="DoAction" Argument="PodUrlValidation" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="SettingsDlg" Control_="Back" Event="[Text_Next]" Argument="[AI_Text_Next_Orig]" Condition="AI_INSTALL" Ordering="1" Options="2"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="SetTargetPath" Argument="APPDIR" Condition="AI_INSTALL" Ordering="1"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="NewDialog" Argument="SettingsDlg" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="NewDialog" Argument="SettingsDlg" Condition="AI_INSTALL AND ( INVALID_POD_URL = &quot;valid&quot; )" Ordering="4"/>
<ROW Dialog_="UrlValidationDlg" Control_="Cancel" Event="SpawnDialog" Argument="CancelDlg" Condition="1" Ordering="100"/>
<ROW Dialog_="InstallationDlg" Control_="InstallationDlgDialogInitializer" Event="DoAction" Argument="PodUrlValidation" Condition="AI_INSTALL" Ordering="0"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="DoAction" Argument="PodUrlValidation" Condition="AI_INSTALL" Ordering="2"/>
<ROW Dialog_="InstallationDlg" Control_="Next" Event="SpawnDialog" Argument="UrlValidationDlg" Condition="AI_INSTALL AND ( INVALID_POD_URL = &quot;invalid&quot; )" Ordering="3"/>
<ROW Dialog_="UrlValidationDlg" Control_="Back" Event="EndDialog" Argument="Return" Condition="1" Ordering="0"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiCreateFolderComponent">
<ROW Directory_="Symphony_Dir" Component_="Symphony" ManualDelete="false"/>
@ -586,6 +599,7 @@
<ROW Dialog="AdvanceSettings" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="InstallationDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="SettingsDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
<ROW Dialog="UrlValidationDlg" HCentering="50" VCentering="50" Width="370" Height="270" Attributes="3" Title="[ProductName] [Setup]" Control_Default="Next" Control_Cancel="Cancel"/>
</COMPONENT>
<COMPONENT cid="caphyon.advinst.msicomp.MsiIconsComponent">
<ROW Name="icon.exe" SourcePath="..\..\build\icon.ico" Index="0"/>
@ -607,7 +621,7 @@
<ROW Action="AI_ResolveKnownFolders" Sequence="52"/>
<ROW Action="AI_DpiContentScale" Sequence="51"/>
<ROW Action="ExecuteAction" Sequence="1299" SeqType="0" MsiKey="ExecuteAction"/>
<ROW Action="InstallTypeDlg" Condition="AI_INSTALL" Sequence="1227" SeqType="3" MsiKey="WelcomeDlg"/>
<ROW Action="InstallTypeDlg" Condition="AI_INSTALL" Sequence="1224" SeqType="3" MsiKey="WelcomeDlg"/>
<ROW Action="UninstallPreviousVersions" Sequence="1281"/>
<ROW Action="AI_SETMIXINSTLOCATION" Sequence="748"/>
<ROW Action="SettingsDlg" Condition="AI_INSTALL" Sequence="1232" SeqType="3"/>

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -27,8 +27,9 @@ function openFile(id) {
});
if (fileIndex !== -1) {
let openResponse = remote.shell.openExternal(`file:///${local.downloadItems[fileIndex].savedPath}`);
if (!openResponse) {
remote.dialog.showErrorBox("File not found", 'The file you are trying to open cannot be found in the specified path.');
let focusedWindow = remote.BrowserWindow.getFocusedWindow();
if (!openResponse && focusedWindow && !focusedWindow.isDestroyed()) {
remote.dialog.showMessageBox(focusedWindow, {type: 'error', title: 'File not found', message: 'The file you are trying to open cannot be found in the specified path.'});
}
}
}
@ -43,8 +44,9 @@ function showInFinder(id) {
});
if (showFileIndex !== -1) {
let showResponse = remote.shell.showItemInFolder(local.downloadItems[showFileIndex].savedPath);
if (!showResponse) {
remote.dialog.showErrorBox("File not found", 'The file you are trying to access cannot be found in the specified path.');
let focusedWindow = remote.BrowserWindow.getFocusedWindow();
if (!showResponse && focusedWindow && !focusedWindow.isDestroyed()) {
remote.dialog.showMessageBox(focusedWindow, {type: 'error', title: 'File not found', message: 'The file you are trying to open cannot be found in the specified path.'});
}
}
}

View File

@ -228,6 +228,16 @@ function setupThenOpenMainWindow() {
isAppAlreadyOpen = true;
getUrlAndCreateMainWindow();
// Allows a developer to set custom user data path from command line when
// launching the app. Mostly used for running automation tests with
// multiple instances
let customDataArg = getCmdLineArg(process.argv, '--userDataPath=', false);
let customDataFolder = customDataArg && customDataArg.substring(customDataArg.indexOf('=') + 1);
if (customDataArg && customDataFolder) {
app.setPath('userData', customDataFolder);
}
// Event that fixes the remote desktop issue in Windows
// by repositioning the browser window
electron.screen.on('display-removed', windowMgr.verifyDisplays);
@ -291,9 +301,12 @@ function setupFirstTimeLaunch() {
* @returns {Promise}
*/
function setStartup(lStartup) {
log.send(logLevels.INFO, `launch on startup parameter value is ${lStartup}`);
return new Promise((resolve) => {
let launchOnStartup = (lStartup === 'true');
let launchOnStartup = (String(lStartup) === 'true');
log.send(logLevels.INFO, `launchOnStartup value is ${launchOnStartup}`);
if (launchOnStartup) {
log.send(logLevels.INFO, `enabling launch on startup`);
symphonyAutoLauncher.enable();
return resolve();
}
@ -318,8 +331,8 @@ function getUrlAndCreateMainWindow() {
getConfigField('url')
.then(createWin).catch(function(err) {
let title = 'Error loading configuration';
electron.dialog.showErrorBox(title, title + ': ' + err);
log.send(logLevels.ERROR, `unable to create main window -> ${err}`);
app.quit();
});
}
@ -354,17 +367,15 @@ function processProtocolAction(argv) {
}
let protocolUri = getCmdLineArg(argv, 'symphony://', false);
log.send(logLevels.INFO, `Trying to process a protocol action for uri ${protocolUri}`);
if (protocolUri) {
const parsedURL = urlParser.parse(protocolUri);
if (!parsedURL.protocol || !parsedURL.slashes) {
return;
}
log.send(logLevels.INFO, `Parsing protocol url successful for ${parsedURL}`);
handleProtocolAction(protocolUri);
}
}
@ -374,10 +385,12 @@ function processProtocolAction(argv) {
*/
function handleProtocolAction(uri) {
if (!isAppAlreadyOpen) {
log.send(logLevels.INFO, `App started by protocol url ${uri}. We are caching this to be processed later!`);
// app is opened by the protocol url, cache the protocol url to be used later
protocolHandler.setProtocolUrl(uri);
} else {
// app is already open, so, just trigger the protocol action method
log.send(logLevels.INFO, `App opened by protocol url ${uri}`);
protocolHandler.processProtocolAction(uri);
}
}

View File

@ -2,7 +2,7 @@
const log = require('./log.js');
const logLevels = require('./enums/logLevels.js');
const { getMainWindow, setIsAutoReload } = require('./windowMgr');
const { getMainWindow } = require('./windowMgr');
const systemIdleTime = require('@paulcbetts/system-idle-time');
const { getConfigField } = require('./config');

View File

@ -24,7 +24,6 @@ let minimizeOnClose = false;
let launchOnStartup = false;
let isAlwaysOnTop = false;
let bringToFront = false;
let memoryRefresh = false;
let symphonyAutoLauncher;
@ -116,17 +115,17 @@ const template = [{
submenu: [
{
label: isMac ? 'Show Logs in Finder' : 'Show Logs in Explorer',
click() {
click(item, focusedWindow) {
const FILE_EXTENSIONS = [ '.log' ];
const MAC_LOGS_PATH = '/Library/Logs/Symphony/';
const WINDOWS_LOGS_PATH = '\\AppData\\Roaming\\Symphony\\';
const WINDOWS_LOGS_PATH = '\\AppData\\Roaming\\Symphony\\logs';
let logsPath = isMac ? MAC_LOGS_PATH : WINDOWS_LOGS_PATH;
let source = electron.app.getPath('home') + logsPath;
if (!fs.existsSync(source)) {
electron.dialog.showErrorBox('Failed!', 'No logs are available to share');
if (!fs.existsSync(source) && focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {type: 'error', title: 'Failed!', message: 'No logs are available to share'});
return;
}
@ -140,20 +139,22 @@ const template = [{
electron.shell.showItemInFolder(destination);
})
.catch((err) => {
electron.dialog.showErrorBox('Failed!', 'Unable to generate logs due to -> ' + err);
if (focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {type: 'error', title: 'Failed!', message: `Unable to generate logs due to -> ${err}`});
}
})
}
},
{
label: isMac ? 'Show crash dump in Finder' : 'Show crash dump in Explorer',
click() {
click(item, focusedWindow) {
const FILE_EXTENSIONS = isMac ? [ '.dmp' ] : [ '.dmp', '.txt' ];
const crashesDirectory = electron.crashReporter.getCrashesDirectory();
let source = isMac ? crashesDirectory + '/completed' : crashesDirectory;
if (!fs.existsSync(source) || fs.readdirSync(source).length === 0) {
electron.dialog.showErrorBox('Failed!', 'No crashes available to share');
if (!fs.existsSync(source) || fs.readdirSync(source).length === 0 && focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {type: 'error', title: 'Failed!', message: 'No crashes available to share'});
return;
}
@ -167,7 +168,9 @@ const template = [{
electron.shell.showItemInFolder(destination);
})
.catch((err) => {
electron.dialog.showErrorBox('Failed!', 'Unable to generate crash report due to -> ' + err);
if (focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {type: 'error', title: 'Failed!', message: `Unable to generate crash reports due to -> ${err}`});
}
});
}
}
@ -259,20 +262,24 @@ function getTemplate(app) {
label: 'Auto Launch On Startup',
type: 'checkbox',
checked: launchOnStartup,
click: function(item) {
click: function(item, focusedWindow) {
if (item.checked) {
symphonyAutoLauncher.enable()
.catch(function(err) {
let title = 'Error setting AutoLaunch configuration';
log.send(logLevels.ERROR, 'MenuTemplate: ' + title + ': auto launch error ' + err);
electron.dialog.showErrorBox(title, title + ': ' + err);
if (focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {type: 'error', title, message: title + ': ' + err});
}
});
} else {
symphonyAutoLauncher.disable()
.catch(function(err) {
let title = 'Error setting AutoLaunch configuration';
log.send(logLevels.ERROR, 'MenuTemplate: ' + title + ': auto launch error ' + err);
electron.dialog.showErrorBox(title, title + ': ' + err);
if (focusedWindow && !focusedWindow.isDestroyed()) {
electron.dialog.showMessageBox(focusedWindow, {type: 'error', title, message: title + ': ' + err});
}
});
}
launchOnStartup = item.checked;
@ -287,7 +294,10 @@ function getTemplate(app) {
checked: isAlwaysOnTop,
click: (item) => {
isAlwaysOnTop = item.checked;
eventEmitter.emit('isAlwaysOnTop', isAlwaysOnTop);
eventEmitter.emit('isAlwaysOnTop', {
isAlwaysOnTop,
shouldActivateMainWindow: true
});
updateConfigField('alwaysOnTop', isAlwaysOnTop);
}
});
@ -315,22 +325,6 @@ function getTemplate(app) {
}
});
// Window/View menu -> separator
template[index].submenu.push({
type: 'separator',
});
// Window - View menu -> memoryRefresh
template[index].submenu.push({
label: 'Memory Refresh',
type: 'checkbox',
checked: memoryRefresh,
click: function(item) {
memoryRefresh = item.checked;
updateConfigField('memoryRefresh', memoryRefresh);
}
});
if (!isMac) {
template[index].submenu.push({
label: 'Quit Symphony',
@ -374,7 +368,10 @@ function setCheckboxValues() {
break;
case 'alwaysOnTop':
isAlwaysOnTop = configData[key];
eventEmitter.emit('isAlwaysOnTop', configData[key]);
eventEmitter.emit('isAlwaysOnTop', {
isAlwaysOnTop: configData[key],
shouldActivateMainWindow: true
});
break;
case 'notificationSettings':
eventEmitter.emit('notificationSettings', configData[key]);
@ -382,9 +379,6 @@ function setCheckboxValues() {
case 'bringToFront':
bringToFront = configData[key];
break;
case 'memoryRefresh':
memoryRefresh = configData[key];
break;
default:
break;
}
@ -395,7 +389,9 @@ function setCheckboxValues() {
.catch((err) => {
let title = 'Error loading configuration';
log.send(logLevels.ERROR, 'MenuTemplate: error reading configuration fields, error: ' + err);
electron.dialog.showErrorBox(title, title + ': ' + err);
if (electron.BrowserWindow.getFocusedWindow() && !electron.BrowserWindow.getFocusedWindow().isDestroyed()) {
electron.dialog.showMessageBox(electron.BrowserWindow.getFocusedWindow(), {type: 'error', title, message: title + ': ' + err});
}
return resolve();
});
});

View File

@ -116,10 +116,10 @@ function setContents(event, notificationObj) {
}
// Title
titleDoc.innerHTML = notificationObj.title || '';
titleDoc.innerText = notificationObj.title || '';
// message
messageDoc.innerHTML = notificationObj.text || '';
messageDoc.innerText = notificationObj.text || '';
// Image
if (notificationObj.image) {
@ -130,7 +130,7 @@ function setContents(event, notificationObj) {
// Company
if (notificationObj.company) {
companyDoc.innerHTML = notificationObj.company
companyDoc.innerText = notificationObj.company
} else {
messageDoc.style.marginTop = '15px';
}

View File

@ -33,10 +33,7 @@ class Notify {
let emitter = new EventEmitter();
this.emitter = Queue(emitter);
// Replace strong html tags from the options.body
let message = replaceStrongTag(options.body);
// Replaces all html angle brackets w.r.t their entity name
message = replaceHTMLTags(message);
let message = options.body;
this._id = notify({
title: title,
@ -246,44 +243,4 @@ function Queue(emitter) {
return modifiedEmitter;
}
/**
* Replace HTML tags <> from messages test to prevent
* HTML injection
*
* @param message {String} main text to display in notifications
* @return {void | string | *}
*/
function replaceHTMLTags(message) {
if (typeof message !== 'string') {
return null;
}
const tagsToReplace = {
'<': '&lt;',
'>': '&gt;'
};
function replaceTag(tag) {
return tagsToReplace[tag] || tag;
}
return message.replace(/[<>]/g, replaceTag);
}
/**
* Replace strong HTML tags from the string
*
* @param message {String} main text to display in notifications
* @return {void | string | *}
*/
function replaceStrongTag(message) {
if (typeof message !== 'string') {
return null;
}
return message.replace(/(?:<strong>)|(?:<\/strong>)+/g, '');
}
module.exports = Notify;

View File

@ -11,8 +11,13 @@ let protocolUrl;
* @param {String} uri - the uri opened in the format 'symphony://...'
*/
function processProtocolAction(uri) {
log.send(logLevels.INFO, 'protocol action, uri=' + uri);
if (protocolWindow && uri && uri.startsWith('symphony://')) {
log.send(logLevels.INFO, `protocol action, uri ${uri}`);
if (!protocolWindow) {
log.send(logLevels.INFO, `protocol window not yet initialized, caching the uri ${uri}`);
setProtocolUrl(uri);
return;
}
if (uri && uri.startsWith('symphony://')) {
protocolWindow.send('protocol-action', uri);
}
}
@ -29,7 +34,9 @@ function setProtocolWindow(win) {
* checks to see if the app was opened by a uri
*/
function checkProtocolAction() {
log.send(logLevels.INFO, `checking if we have a cached protocol url`);
if (protocolUrl) {
log.send(logLevels.INFO, `found a cached protocol url, processing it!`);
processProtocolAction(protocolUrl);
protocolUrl = undefined;
}

View File

@ -70,7 +70,10 @@ class ScreenSnippet {
if (windows && windows.length > 0) {
isAlwaysOnTop = windows[ 0 ].isAlwaysOnTop();
if (isAlwaysOnTop) {
eventEmitter.emit('isAlwaysOnTop', false);
eventEmitter.emit('isAlwaysOnTop', {
isAlwaysOnTop: false,
shouldActivateMainWindow: false
});
}
}
@ -87,7 +90,10 @@ class ScreenSnippet {
child = childProcess.execFile(captureUtil, captureUtilArgs, (error) => {
// Method to reset always on top feature
if (isAlwaysOnTop) {
eventEmitter.emit('isAlwaysOnTop', true);
eventEmitter.emit('isAlwaysOnTop', {
isAlwaysOnTop: true,
shouldActivateMainWindow: false
});
}
// will be called when child process exits.
if (error && error.killed) {

View File

@ -158,6 +158,7 @@ function parseDomain(url) {
module.exports = {
isWhitelisted,
parseDomain,
// items below here are only exported for testing, do NOT use!
checkWhitelist

View File

@ -20,10 +20,10 @@ const logLevels = require('./enums/logLevels.js');
const notify = require('./notify/electron-notify.js');
const eventEmitter = require('./eventEmitter');
const throttle = require('./utils/throttle.js');
const { getConfigField, updateConfigField, getGlobalConfigField, readConfigFileSync } = require('./config.js');
const { getConfigField, updateConfigField, readConfigFileSync } = require('./config.js');
const { isMac, isNodeEnv, isWindows10, isWindowsOS } = require('./utils/misc');
const { deleteIndexFolder } = require('./search/search.js');
const { isWhitelisted } = require('./utils/whitelistHandler');
const { isWhitelisted, parseDomain } = require('./utils/whitelistHandler');
const { initCrashReporterMain, initCrashReporterRenderer } = require('./crashReporter.js');
// show dialog when certificate errors occur
@ -56,6 +56,9 @@ const MIN_HEIGHT = 300;
const DEFAULT_WIDTH = 300;
const DEFAULT_HEIGHT = 600;
// Certificate transparency whitelist
let ctWhitelist = [];
/**
* Adds a window key
* @param key
@ -93,32 +96,38 @@ function getParsedUrl(appUrl) {
* @param initialUrl
*/
function createMainWindow(initialUrl) {
Promise.all([
getConfigField('mainWinPos'),
getGlobalConfigField('isCustomTitleBar')
]).then((values) => {
doCreateMainWindow(initialUrl, values[ 0 ], values[ 1 ]);
}).catch(() => {
// failed use default bounds and frame
doCreateMainWindow(initialUrl, null, false);
});
getConfigField('mainWinPos')
.then(winPos => {
doCreateMainWindow(initialUrl, winPos);
})
.catch(() => {
// failed use default bounds and frame
doCreateMainWindow(initialUrl, null);
});
}
/**
* Creates the main window with bounds
* @param initialUrl
* @param initialBounds
* @param isCustomTitleBar {Boolean} - Global config value weather to enable custom title bar
*/
function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
function doCreateMainWindow(initialUrl, initialBounds) {
let url = initialUrl;
let key = getGuid();
// condition whether to enable custom Windows 10 title bar
const isCustomTitleBarEnabled = typeof isCustomTitleBar === 'boolean' && isCustomTitleBar && isWindows10();
log.send(logLevels.INFO, 'creating main window url: ' + url);
const config = readConfigFileSync();
// condition whether to enable custom Windows 10 title bar
const isCustomTitleBarEnabled = config
&& typeof config.isCustomTitleBar === 'boolean'
&& config.isCustomTitleBar
&& isWindows10();
log.send(logLevels.INFO, `we are configuring a custom title bar for windows -> ${isCustomTitleBarEnabled}`);
let config = readConfigFileSync();
ctWhitelist = config && config.ctWhitelist;
log.send(logLevels.INFO, `we are configuring certificate transparency whitelist for the domains -> ${ctWhitelist}`);
log.send(logLevels.INFO, `creating main window for ${url}`);
if (config && config !== null && config.customFlags) {
@ -151,7 +160,7 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
// if bounds if not fully contained in some display then use default size
// and position.
if (!isInDisplayBounds(bounds)) {
if (!isInDisplayBounds(bounds) || initialBounds.isMaximized || initialBounds.isFullScreen) {
bounds = null;
}
@ -180,10 +189,22 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
mainWindow = new BrowserWindow(newWinOpts);
mainWindow.winName = 'main';
let throttledMainWinBoundsChange = throttle(5000, saveMainWinBounds);
let throttledMainWinBoundsChange = throttle(1000, saveMainWinBounds);
mainWindow.on('move', throttledMainWinBoundsChange);
mainWindow.on('resize', throttledMainWinBoundsChange);
if (initialBounds && !isNodeEnv) {
// maximizes the application if previously maximized
if (initialBounds.isMaximized) {
mainWindow.maximize();
}
// Sets the application to full-screen if previously set to full-screen
if (isMac && initialBounds.isFullScreen) {
mainWindow.setFullScreen(true);
}
}
function retry() {
if (!isOnline) {
loadErrors.showNetworkConnectivityError(mainWindow, url, retry);
@ -306,6 +327,7 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
// open external links in default browser - a tag with href='_blank' or window.open
mainWindow.webContents.on('new-window', handleNewWindow);
mainWindow.webContents.session.setCertificateVerifyProc(handleCertificateTransparencyChecks);
function handleNewWindow(event, newWinUrl, frameName, disposition, newWinOptions) {
@ -395,21 +417,6 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
browserWin.winName = frameName;
browserWin.setAlwaysOnTop(alwaysOnTop);
let handleChildWindowClosed = () => {
removeWindowKey(newWinKey);
browserWin.removeListener('move', throttledBoundsChange);
browserWin.removeListener('resize', throttledBoundsChange);
};
browserWin.once('closed', () => {
handleChildWindowClosed();
});
browserWin.on('close', () => {
browserWin.webContents.removeListener('new-window', handleNewWindow);
browserWin.webContents.removeListener('crashed', handleChildWindowCrashEvent);
});
let handleChildWindowCrashEvent = (e) => {
const options = {
type: 'error',
@ -450,7 +457,24 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
browserWin.on('move', throttledBoundsChange);
browserWin.on('resize', throttledBoundsChange);
let handleChildWindowClosed = () => {
removeWindowKey(newWinKey);
browserWin.removeListener('move', throttledBoundsChange);
browserWin.removeListener('resize', throttledBoundsChange);
};
browserWin.on('close', () => {
browserWin.webContents.removeListener('new-window', handleNewWindow);
browserWin.webContents.removeListener('crashed', handleChildWindowCrashEvent);
});
browserWin.once('closed', () => {
handleChildWindowClosed();
});
handlePermissionRequests(browserWin.webContents);
browserWin.webContents.session.setCertificateVerifyProc(handleCertificateTransparencyChecks);
}
});
} else {
@ -494,32 +518,35 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
* @param webContents Web contents of the window
*/
function handlePermissionRequests(webContents) {
let session = webContents.session;
getConfigField('permissions')
.then((permissions) => {
if (!permissions) {
log.send(logLevels.ERROR, 'permissions configuration is invalid, so, everything will be true by default!');
return;
}
session.setPermissionRequestHandler((sessionWebContents, permission, callback) => {
function handleSessionPermissions(userPermission, message, cb) {
log.send(logLevels.INFO, 'permission is -> ' + userPermission);
if (!userPermission) {
let fullMessage = `Your administrator has disabled ${message}. Please contact your admin for help.`;
electron.dialog.showErrorBox('Permission Denied!', fullMessage);
const browserWindow = BrowserWindow.getFocusedWindow();
if (browserWindow && !browserWindow.isDestroyed()) {
electron.dialog.showMessageBox(browserWindow, {type: 'error', title: 'Permission Denied!', message: fullMessage});
}
}
return cb(userPermission);
}
let PERMISSION_MEDIA = 'media';
let PERMISSION_LOCATION = 'geolocation';
let PERMISSION_NOTIFICATIONS = 'notifications';
@ -527,40 +554,58 @@ function doCreateMainWindow(initialUrl, initialBounds, isCustomTitleBar) {
let PERMISSION_POINTER_LOCK = 'pointerLock';
let PERMISSION_FULL_SCREEN = 'fullscreen';
let PERMISSION_OPEN_EXTERNAL = 'openExternal';
switch (permission) {
case PERMISSION_MEDIA:
return handleSessionPermissions(permissions.media, 'sharing your camera, microphone, and speakers', callback);
case PERMISSION_LOCATION:
return handleSessionPermissions(permissions.geolocation, 'sharing your location', callback);
case PERMISSION_NOTIFICATIONS:
return handleSessionPermissions(permissions.notifications, 'notifications', callback);
case PERMISSION_MIDI_SYSEX:
return handleSessionPermissions(permissions.midiSysex, 'MIDI Sysex', callback);
case PERMISSION_POINTER_LOCK:
return handleSessionPermissions(permissions.pointerLock, 'Pointer Lock', callback);
case PERMISSION_FULL_SCREEN:
return handleSessionPermissions(permissions.fullscreen, 'Full Screen', callback);
case PERMISSION_OPEN_EXTERNAL:
return handleSessionPermissions(permissions.openExternal, 'Opening External App', callback);
default:
return callback(false);
}
});
}).catch((error) => {
log.send(logLevels.ERROR, 'unable to get permissions configuration, so, everything will be true by default! ' + error);
})
}
function handleCertificateTransparencyChecks(request, callback) {
const { hostname: hostUrl, errorCode } = request;
if (errorCode === 0) {
return callback(0);
}
let { tld, domain } = parseDomain(hostUrl);
let host = domain + tld;
if (ctWhitelist && Array.isArray(ctWhitelist) && ctWhitelist.length > 0 && ctWhitelist.indexOf(host) > -1) {
return callback(0);
}
return callback(-2);
}
}
@ -578,6 +623,12 @@ app.on('before-quit', function () {
function saveMainWinBounds() {
let newBounds = getWindowSizeAndPosition(mainWindow);
// set application full-screen and maximized state
if (mainWindow && !mainWindow.isDestroyed()) {
newBounds.isMaximized = mainWindow.isMaximized();
newBounds.isFullScreen = mainWindow.isFullScreen();
}
if (newBounds) {
updateConfigField('mainWinPos', newBounds);
}
@ -747,28 +798,31 @@ function openUrlInDefaultBrowser(urlToOpen) {
/**
* Called when an event is received from menu
* @param boolean weather to enable or disable alwaysOnTop.
* @param {boolean} boolean whether to enable or disable alwaysOnTop.
* @param {boolean} shouldActivateMainWindow whether to activate main window
*/
function isAlwaysOnTop(boolean) {
function isAlwaysOnTop(boolean, shouldActivateMainWindow = true) {
alwaysOnTop = boolean;
let browserWins = BrowserWindow.getAllWindows();
if (browserWins.length > 0) {
browserWins.forEach(function (browser) {
browser.setAlwaysOnTop(boolean);
});
browserWins
.filter((browser) => typeof browser.notfyObj !== 'object')
.forEach(function (browser) {
browser.setAlwaysOnTop(boolean);
});
// An issue where changing the alwaysOnTop property
// focus the pop-out window
// Issue - Electron-209
if (mainWindow && mainWindow.winName) {
// Issue - Electron-209/470
if (mainWindow && mainWindow.winName && shouldActivateMainWindow) {
activate(mainWindow.winName);
}
}
}
// node event emitter to update always on top
eventEmitter.on('isAlwaysOnTop', (boolean) => {
isAlwaysOnTop(boolean);
eventEmitter.on('isAlwaysOnTop', (params) => {
isAlwaysOnTop(params.isAlwaysOnTop, params.shouldActivateMainWindow);
});
// node event emitter for notification settings

View File

@ -10,54 +10,68 @@ const titleBar = (`
</button>
</div>
<div id="title-container">
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100px" height="32px" x="0px" y="0px"
viewBox="0 0 121 24" enable-background="new 0 0 121 24" xml:space="preserve">
<g>
<path fill="#FFFFFF" d="M36.7,10c-0.6-0.5-1.8-1.1-3.4-1.1c-1.1,0-2,0.4-2,1.3c0,1,1.3,1,2.7,1.1c1.7,0.1,4.5,0.3,4.5,3
c0,2.4-2,3.3-4.3,3.3c-2.5,0-4.2-1-5.3-2l1.1-1.3c0.8,0.7,2.2,1.7,4.2,1.7c1.3,0,2.4-0.5,2.4-1.5c0-1.1-1-1.3-2.6-1.4
c-2.1-0.2-4.6-0.3-4.6-2.7c0-2.3,2.1-3,3.9-3c2,0,3.7,0.8,4.5,1.3L36.7,10z"/>
<path fill="#FFFFFF" d="M59.4,17.2v-6.1h-0.1l-2.9,4.9h-0.4L53,11.2h-0.1v6.1h-1.8V7.6h1.9l3.3,5.5h0l3.2-5.5h1.8v9.6H59.4z"/>
<path fill="#FFFFFF" d="M75.6,17.2V7.6h1.9v3.8h4.9V7.6h1.9v9.6h-1.9v-4.2h-4.9v4.2H75.6z"/>
<path fill="#FFFFFF" d="M91.9,15.9c1.9,0,3.3-1.6,3.3-3.5c0-1.9-1.5-3.4-3.3-3.4c-1.8,0-3.3,1.5-3.3,3.4
C88.7,14.3,90.1,15.9,91.9,15.9z M91.9,7.3c2.9,0,5.3,2.3,5.3,5.1c0,2.9-2.3,5.1-5.3,5.1c-2.9,0-5.2-2.3-5.2-5.1
C86.7,9.6,89,7.3,91.9,7.3z"/>
<path fill="#FFFFFF" d="M108.3,7.6v9.6h-1.6l-5.2-6.3h0v6.3h-1.9V7.6h1.6l5.2,6.3h0V7.6H108.3z"/>
<polygon fill="#FFFFFF" points="120.1,7.6 117.9,7.6 115.2,12.2 115.1,12.2 112.4,7.6 110.1,7.6 114.2,14 114.2,17.2 116,17.2
116,14 "/>
<polygon fill="#FFFFFF" points="49.3,7.6 47.1,7.6 44.4,12.2 44.3,12.2 41.6,7.6 39.3,7.6 43.4,14 43.4,17.2 45.2,17.2 45.2,14
"/>
<path fill="#FFFFFF" d="M66.2,14.1l3.1,0c1.4,0,2.3-0.4,2.9-1c0.6-0.6,1-1.4,1-2.3c0-0.8-0.3-1.5-0.8-2.1c-0.7-0.7-1.6-1.1-3.1-1.1
h-5v9.6h1.9V14.1z M66.2,9.2h3.1c0.5,0,1.1,0.1,1.5,0.5c0.3,0.3,0.4,0.7,0.4,1.1c0,0.4-0.2,0.8-0.5,1.1c-0.5,0.4-1,0.5-1.5,0.5
l-3.1,0V9.2z"/>
</g>
<g>
<g>
<path fill="#F48DA1" d="M4,12.2c-0.1,0.5-0.1,0.9-0.1,1.4c0,1.5,0.4,2.9,1,4.1l8.1-4.1L4,12.2z"/>
</g>
<g>
<path fill="#33B9E6" d="M9.7,18.2c0.9,0.7,2.1,1.1,3.3,1.1c0.3,0,0.6,0,0.9-0.1L13,13.6L9.7,18.2z"/>
</g>
<g>
<path fill="#90D095" d="M18.2,1.1c-1.6-0.7-3.4-1-5.2-1c-0.7,0-1.4,0.1-2.1,0.2L13,13.6L18.2,1.1z"/>
</g>
<g>
<path fill="#FED05F" d="M13,13.6h11.3c0-2.5-0.8-4.8-2.2-6.7L13,13.6z"/>
</g>
<g>
<path fill="#727376" d="M2.9,7.4c-1.1,1.8-1.8,3.9-1.8,6.2H13L2.9,7.4z"/>
</g>
<g>
<path fill="#A1A2A3" d="M13,5.7c-1.7,0-3.4,0.6-4.7,1.5l4.7,6.4V5.7z"/>
</g>
<g>
<path fill="#8A8B8C" d="M13,23.8c2.2,0,4.3-0.7,6-1.9l-6-8.2V23.8z"/>
</g>
<g>
<path fill="#636466" d="M20.8,12.4L13,13.6l7.3,3c0.4-0.9,0.6-2,0.6-3C20.9,13.2,20.9,12.8,20.8,12.4z"/>
<?xml version="1.0" encoding="UTF-8"?>
<svg width="100px" height="32px" viewBox="0 0 120 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>Symphony_logo</title>
<defs>
<linearGradient x1="72.8054587%" y1="20.0451624%" x2="15.4902814%" y2="45.5271843%" id="linearGradient-1">
<stop stop-color="#197A68" offset="0%"></stop>
<stop stop-color="#329D87" offset="100%"></stop>
</linearGradient>
<linearGradient x1="0%" y1="49.9999462%" x2="100%" y2="49.9999462%" id="linearGradient-2">
<stop stop-color="#1D7E7B" offset="0%"></stop>
<stop stop-color="#35B0B7" offset="100%"></stop>
</linearGradient>
<linearGradient x1="26.4092062%" y1="82.7312532%" x2="48.5078994%" y2="9.46528209%" id="linearGradient-3">
<stop stop-color="#175952" offset="0%"></stop>
<stop stop-color="#3A8F88" offset="100%"></stop>
</linearGradient>
<linearGradient x1="29.6396432%" y1="86.849168%" x2="75.7050882%" y2="58.9371981%" id="linearGradient-4">
<stop stop-color="#39A8BA" offset="0%"></stop>
<stop stop-color="#3992B4" offset="100%"></stop>
</linearGradient>
<linearGradient x1="71.6243272%" y1="78.079356%" x2="20.750027%" y2="55.8481886%" id="linearGradient-5">
<stop stop-color="#021C3C" offset="0%"></stop>
<stop stop-color="#215180" offset="100%"></stop>
</linearGradient>
<linearGradient x1="0%" y1="49.9955545%" x2="100%" y2="49.9955545%" id="linearGradient-6">
<stop stop-color="#23796C" offset="0%"></stop>
<stop stop-color="#41BEAF" offset="100%"></stop>
</linearGradient>
<linearGradient x1="6.58475486%" y1="32.6158208%" x2="42.3714661%" y2="80.2915692%" id="linearGradient-7">
<stop stop-color="#14466A" offset="0%"></stop>
<stop stop-color="#286395" offset="100%"></stop>
</linearGradient>
<linearGradient x1="28.7298091%" y1="40.5717151%" x2="84.0259024%" y2="48.3784687%" id="linearGradient-8">
<stop stop-color="#261D49" offset="0%"></stop>
<stop stop-color="#483A6D" offset="100%"></stop>
</linearGradient>
</defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Symphony_logo" fill-rule="nonzero">
<g id="Group" transform="translate(27.000000, 7.000000)" fill="#FFFFFF">
<path d="M8.7,3 C8.1,2.5 6.9,1.9 5.3,1.9 C4.2,1.9 3.3,2.3 3.3,3.2 C3.3,4.2 4.6,4.2 6,4.3 C7.7,4.4 10.5,4.6 10.5,7.3 C10.5,9.7 8.5,10.6 6.2,10.6 C3.7,10.6 2,9.6 0.9,8.6 L2,7.3 C2.8,8 4.2,9 6.2,9 C7.5,9 8.6,8.5 8.6,7.5 C8.6,6.4 7.6,6.2 6,6.1 C3.9,5.9 1.4,5.8 1.4,3.4 C1.4,1.1 3.5,0.4 5.3,0.4 C7.3,0.4 9,1.2 9.8,1.7 L8.7,3 Z" id="Shape"></path>
<polygon id="Shape" points="31.4 10.2 31.4 4.1 31.3 4.1 28.4 9 28 9 25 4.2 24.9 4.2 24.9 10.3 23.1 10.3 23.1 0.6 25 0.6 28.3 6.1 28.3 6.1 31.5 0.6 33.3 0.6 33.3 10.2"></polygon>
<polygon id="Shape" points="47.6 10.2 47.6 0.6 49.5 0.6 49.5 4.4 54.4 4.4 54.4 0.6 56.3 0.6 56.3 10.2 54.4 10.2 54.4 6 49.5 6 49.5 10.2"></polygon>
<path d="M63.9,8.9 C65.8,8.9 67.2,7.3 67.2,5.4 C67.2,3.5 65.7,2 63.9,2 C62.1,2 60.6,3.5 60.6,5.4 C60.7,7.3 62.1,8.9 63.9,8.9 Z M63.9,0.3 C66.8,0.3 69.2,2.6 69.2,5.4 C69.2,8.3 66.9,10.5 63.9,10.5 C61,10.5 58.7,8.2 58.7,5.4 C58.7,2.6 61,0.3 63.9,0.3 Z" id="Shape"></path>
<polygon id="Shape" points="80.3 0.6 80.3 10.2 78.7 10.2 73.5 3.9 73.5 3.9 73.5 10.2 71.6 10.2 71.6 0.6 73.2 0.6 78.4 6.9 78.4 6.9 78.4 0.6"></polygon>
<polygon id="Shape" points="92.1 0.6 89.9 0.6 87.2 5.2 87.1 5.2 84.4 0.6 82.1 0.6 86.2 7 86.2 10.2 88 10.2 88 7"></polygon>
<polygon id="Shape" points="21.3 0.6 19.1 0.6 16.4 5.2 16.3 5.2 13.6 0.6 11.3 0.6 15.4 7 15.4 10.2 17.2 10.2 17.2 7"></polygon>
<path d="M38.2,7.1 L41.3,7.1 C42.7,7.1 43.6,6.7 44.2,6.1 C44.8,5.5 45.2,4.7 45.2,3.8 C45.2,3 44.9,2.3 44.4,1.7 C43.7,1 42.8,0.6 41.3,0.6 L36.3,0.6 L36.3,10.2 L38.2,10.2 L38.2,7.1 Z M38.2,2.2 L41.3,2.2 C41.8,2.2 42.4,2.3 42.8,2.7 C43.1,3 43.2,3.4 43.2,3.8 C43.2,4.2 43,4.6 42.7,4.9 C42.2,5.3 41.7,5.4 41.2,5.4 L38.1,5.4 L38.1,2.2 L38.2,2.2 Z" id="Shape"></path>
</g>
<g id="logo2">
<path d="M2.8585265,13.7071419 C2.85630496,15.1495531 3.19699055,16.5718335 3.85249917,17.8566932 L11.9973636,13.7071419 L2.8585265,13.7071419 Z" id="Shape" fill="url(#linearGradient-1)"></path>
<path d="M8.63923275,18.3280906 C9.61438114,19.0384932 10.7901678,19.4204097 11.9966428,19.4186435 L11.9966428,13.7071419 L8.63923275,18.3280906 Z" id="Shape" fill="url(#linearGradient-2)"></path>
<path d="M17.2396228,1.04297388 C15.5766877,0.35369093 13.7938873,-2.76553156e-05 11.9937597,0.00216235083 C11.2754862,0.00215229435 10.558302,0.0580618177 9.84870765,0.169384149 L11.9937597,13.7093043 L17.2396228,1.04297388 Z" id="Shape" fill="url(#linearGradient-3)"></path>
<path d="M11.9966428,13.7071419 L23.4189285,13.7071419 C23.4226965,11.2942632 22.6585571,8.94277657 21.2370999,6.99304259 L11.9966428,13.7071419 Z" id="Shape" fill="url(#linearGradient-4)"></path>
<path d="M1.76871415,7.43992843 C0.610698934,9.32503749 -0.000916945813,11.4947622 0.00206101979,13.7071419 L11.9966428,13.7071419 L1.76871415,7.43992843 Z" id="Shape" fill="url(#linearGradient-5)"></path>
<path d="M11.9966428,5.71146961 C10.3076163,5.70881714 8.66152029,6.24346454 7.29641289,7.23810107 L11.9966428,13.7071419 L11.9966428,5.71146961 Z" id="Shape" fill="url(#linearGradient-6)"></path>
<path d="M11.9966428,23.9877027 C14.1680786,23.9910306 16.2842613,23.3033903 18.0389718,22.0242737 L11.9966428,13.7071419 L11.9966428,23.9877027 Z" id="Shape" fill="url(#linearGradient-7)"></path>
<path d="M19.8949896,12.4558616 L11.9966428,13.7071419 L19.3846748,16.7675891 C19.7870484,15.7974896 19.993552,14.7573781 19.9922954,13.7071419 C19.9921318,13.288165 19.9595998,12.8698268 19.8949896,12.4558616 Z" id="Shape" fill="url(#linearGradient-8)"></path>
</g>
</g>
</g>
</svg>
</svg>
</div>
</div>
`);

View File

@ -1,8 +1,8 @@
{
"name": "Symphony",
"productName": "Symphony",
"version": "2.5.1",
"buildNumber": "124",
"version": "2.7.1",
"buildNumber": "0",
"description": "Symphony desktop app (Foundation ODP)",
"author": "Symphony",
"main": "js/main.js",
@ -87,7 +87,7 @@
"bluebird": "3.5.1",
"browserify": "14.5.0",
"cross-env": "3.2.4",
"electron": "2.0.0",
"electron": "2.0.2",
"electron-builder": "20.10.0",
"electron-builder-squirrel-windows": "12.3.0",
"electron-chromedriver": "1.8.0",