// (c) Martin R. Jones 1996 // (c) Bernd Wuebben 1998 // KControl port & modifications // (c) Torben Weis 1998 // End of the KControl port, added 'kfmclient configure' call. // (c) David Faure 1998 // New configuration scheme for JavaScript // (C) Kalle Dalheimer 2000 // Major cleanup & Java/JS settings splitted // (c) Daniel Molkentin 2000 // Big changes to accommodate per-domain settings // (c) Leo Savernik 2002-2003 #include <qlayout.h> #include <qwhatsthis.h> #include <qvgroupbox.h> #include <kconfig.h> #include <klistview.h> #include <kdebug.h> #include <kurlrequester.h> #if defined Q_WS_X11 && !defined K_WS_QTONLY #include <X11/Xlib.h> #endif #include "htmlopts.h" #include "policydlg.h" #include <klocale.h> #include "jsopts.h" #include "jsopts.moc" // == class KJavaScriptOptions ===== KJavaScriptOptions::KJavaScriptOptions( KConfig* config, QString group, QWidget *parent, const char *name ) : KCModule( parent, name ), _removeJavaScriptDomainAdvice(false), m_pConfig( config ), m_groupname( group ), js_global_policies(config,group,true,QString::null), _removeECMADomainSettings(false) { QVBoxLayout* toplevel = new QVBoxLayout( this, 10, 5 ); // the global checkbox QGroupBox* globalGB = new QGroupBox( 2, Vertical, i18n( "Global Settings" ), this ); toplevel->addWidget( globalGB ); enableJavaScriptGloballyCB = new QCheckBox( i18n( "Ena&ble JavaScript globally" ), globalGB ); QWhatsThis::add( enableJavaScriptGloballyCB, i18n("Enables the execution of scripts written in ECMA-Script " "(also known as JavaScript) that can be contained in HTML pages. " "Note that, as with any browser, enabling scripting languages can be a security problem.") ); connect( enableJavaScriptGloballyCB, SIGNAL( clicked() ), SLOT( changed() ) ); connect( enableJavaScriptGloballyCB, SIGNAL( clicked() ), this, SLOT( slotChangeJSEnabled() ) ); reportErrorsCB = new QCheckBox( i18n( "Report &errors" ), globalGB ); QWhatsThis::add( reportErrorsCB, i18n("Enables the reporting of errors that occur when JavaScript " "code is executed.") ); connect( reportErrorsCB, SIGNAL( clicked() ), SLOT( changed() ) ); jsDebugWindow = new QCheckBox( i18n( "Enable debu&gger" ), globalGB ); QWhatsThis::add( jsDebugWindow, i18n( "Enables builtin JavaScript debugger." ) ); connect( jsDebugWindow, SIGNAL( clicked() ), SLOT( changed() ) ); // the domain-specific listview domainSpecific = new JSDomainListView(m_pConfig,m_groupname,this,this); connect(domainSpecific,SIGNAL(changed(bool)),SLOT(changed())); toplevel->addWidget( domainSpecific, 2 ); QWhatsThis::add( domainSpecific, i18n("Here you can set specific JavaScript policies for any particular " "host or domain. To add a new policy, simply click the <i>New...</i> " "button and supply the necessary information requested by the " "dialog box. To change an existing policy, click on the <i>Change...</i> " "button and choose the new policy from the policy dialog box. Clicking " "on the <i>Delete</i> button will remove the selected policy causing the default " "policy setting to be used for that domain. The <i>Import</i> and <i>Export</i> " "button allows you to easily share your policies with other people by allowing " "you to save and retrieve them from a zipped file.") ); QString wtstr = i18n("This box contains the domains and hosts you have set " "a specific JavaScript policy for. This policy will be used " "instead of the default policy for enabling or disabling JavaScript on pages sent by these " "domains or hosts. <p>Select a policy and use the controls on " "the right to modify it."); QWhatsThis::add( domainSpecific->listView(), wtstr ); QWhatsThis::add( domainSpecific->importButton(), i18n("Click this button to choose the file that contains " "the JavaScript policies. These policies will be merged " "with the existing ones. Duplicate entries are ignored.") ); QWhatsThis::add( domainSpecific->exportButton(), i18n("Click this button to save the JavaScript policy to a zipped " "file. The file, named <b>javascript_policy.tgz</b>, will be " "saved to a location of your choice." ) ); // the frame containing the JavaScript policies settings js_policies_frame = new JSPoliciesFrame(&js_global_policies, i18n("Global JavaScript Policies"),this); toplevel->addWidget(js_policies_frame); connect(js_policies_frame, SIGNAL(changed()), SLOT(changed())); // Finally do the loading load(); } void KJavaScriptOptions::load() { load( false ); } void KJavaScriptOptions::load( bool useDefaults ) { m_pConfig->setReadDefaults( useDefaults ); // *** load *** m_pConfig->setGroup(m_groupname); if( m_pConfig->hasKey( "ECMADomains" ) ) domainSpecific->initialize(m_pConfig->readListEntry("ECMADomains")); else if( m_pConfig->hasKey( "ECMADomainSettings" ) ) { domainSpecific->updateDomainListLegacy( m_pConfig->readListEntry( "ECMADomainSettings" ) ); _removeECMADomainSettings = true; } else { domainSpecific->updateDomainListLegacy(m_pConfig->readListEntry("JavaScriptDomainAdvice") ); _removeJavaScriptDomainAdvice = true; } // *** apply to GUI *** js_policies_frame->load(); enableJavaScriptGloballyCB->setChecked( js_global_policies.isFeatureEnabled()); reportErrorsCB->setChecked( m_pConfig->readBoolEntry("ReportJavaScriptErrors",false)); jsDebugWindow->setChecked( m_pConfig->readBoolEntry( "EnableJavaScriptDebug",false ) ); emit changed(useDefaults); } void KJavaScriptOptions::defaults() { load( true ); } void KJavaScriptOptions::save() { m_pConfig->setGroup(m_groupname); m_pConfig->writeEntry( "ReportJavaScriptErrors", reportErrorsCB->isChecked() ); m_pConfig->writeEntry( "EnableJavaScriptDebug", jsDebugWindow->isChecked() ); domainSpecific->save(m_groupname,"ECMADomains"); js_policies_frame->save(); if (_removeECMADomainSettings) { m_pConfig->deleteEntry("ECMADomainSettings"); _removeECMADomainSettings = false; } // sync moved to KJSParts::save // m_pConfig->sync(); emit changed(false); } void KJavaScriptOptions::slotChangeJSEnabled() { js_global_policies.setFeatureEnabled(enableJavaScriptGloballyCB->isChecked()); } // == class JSDomainListView ===== JSDomainListView::JSDomainListView(KConfig *config,const QString &group, KJavaScriptOptions *options, QWidget *parent,const char *name) : DomainListView(config,i18n( "Do&main-Specific" ), parent, name), group(group), options(options) { } JSDomainListView::~JSDomainListView() { } void JSDomainListView::updateDomainListLegacy(const QStringList &domainConfig) { domainSpecificLV->clear(); JSPolicies pol(config,group,false); pol.defaults(); for (QStringList::ConstIterator it = domainConfig.begin(); it != domainConfig.end(); ++it) { QString domain; KHTMLSettings::KJavaScriptAdvice javaAdvice; KHTMLSettings::KJavaScriptAdvice javaScriptAdvice; KHTMLSettings::splitDomainAdvice(*it, domain, javaAdvice, javaScriptAdvice); if (javaScriptAdvice != KHTMLSettings::KJavaScriptDunno) { QListViewItem *index = new QListViewItem( domainSpecificLV, domain, i18n(KHTMLSettings::adviceToStr(javaScriptAdvice)) ); pol.setDomain(domain); pol.setFeatureEnabled(javaScriptAdvice != KHTMLSettings::KJavaScriptReject); domainPolicies[index] = new JSPolicies(pol); } } } void JSDomainListView::setupPolicyDlg(PushButton trigger,PolicyDialog &pDlg, Policies *pol) { JSPolicies *jspol = static_cast<JSPolicies *>(pol); QString caption; switch (trigger) { case AddButton: caption = i18n( "New JavaScript Policy" ); jspol->setFeatureEnabled(!options->enableJavaScriptGloballyCB->isChecked()); break; case ChangeButton: caption = i18n( "Change JavaScript Policy" ); break; default: ; // inhibit gcc warning }/*end switch*/ pDlg.setCaption(caption); pDlg.setFeatureEnabledLabel(i18n("JavaScript policy:")); pDlg.setFeatureEnabledWhatsThis(i18n("Select a JavaScript policy for " "the above host or domain.")); JSPoliciesFrame *panel = new JSPoliciesFrame(jspol,i18n("Domain-Specific " "JavaScript Policies"),pDlg.mainWidget()); panel->refresh(); pDlg.addPolicyPanel(panel); pDlg.refresh(); } JSPolicies *JSDomainListView::createPolicies() { return new JSPolicies(config,group,false); } JSPolicies *JSDomainListView::copyPolicies(Policies *pol) { return new JSPolicies(*static_cast<JSPolicies *>(pol)); }