summaryrefslogtreecommitdiffstats
path: root/kcontrol/konqhtml/jsopts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kcontrol/konqhtml/jsopts.cpp')
-rw-r--r--kcontrol/konqhtml/jsopts.cpp231
1 files changed, 231 insertions, 0 deletions
diff --git a/kcontrol/konqhtml/jsopts.cpp b/kcontrol/konqhtml/jsopts.cpp
new file mode 100644
index 000000000..b6522f767
--- /dev/null
+++ b/kcontrol/konqhtml/jsopts.cpp
@@ -0,0 +1,231 @@
+// (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));
+}
+
+