You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/kcontrol/konqhtml/jspolicies.cpp

408 lines
15 KiB

/*
Copyright (c) 2002 Leo Savernik <l.savernik@aon.at>
Derived from jsopt.cpp, code copied from there is copyrighted to its
respective owners.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
#include <qbuttongroup.h>
#include <qlabel.h>
#include <qlayout.h>
#include <qradiobutton.h>
#include <qwhatsthis.h>
#include <kconfig.h>
#include <kdebug.h>
#include <klocale.h>
#include "jspolicies.h"
// == class JSPolicies ==
JSPolicies::JSPolicies(KConfig* config,const QString &group,
bool global,const QString &domain) :
Policies(config,group,global,domain,"javascript.","EnableJavaScript") {
}
JSPolicies::JSPolicies() : Policies(0,QString::null,false,
QString::null,QString::null,QString::null) {
}
JSPolicies::~JSPolicies() {
}
void JSPolicies::load() {
Policies::load();
QString key;
// enableJavaScriptDebugCB->setChecked( m_pConfig->readBoolEntry("EnableJavaScriptDebug",false));
// enableDebugOutputCB->setChecked( m_pConfig->readBoolEntry("EnableJSDebugOutput") );
key = prefix + "WindowOpenPolicy";
window_open = config->readUnsignedNumEntry(key,
is_global ? KHTMLSettings::KJSWindowOpenSmart : INHERIT_POLICY);
key = prefix + "WindowResizePolicy";
window_resize = config->readUnsignedNumEntry(key,
is_global ? KHTMLSettings::KJSWindowResizeAllow : INHERIT_POLICY);
key = prefix + "WindowMovePolicy";
window_move = config->readUnsignedNumEntry(key,
is_global ? KHTMLSettings::KJSWindowMoveAllow : INHERIT_POLICY);
key = prefix + "WindowFocusPolicy";
window_focus = config->readUnsignedNumEntry(key,
is_global ? KHTMLSettings::KJSWindowFocusAllow : INHERIT_POLICY);
key = prefix + "WindowStatusPolicy";
window_status = config->readUnsignedNumEntry(key,
is_global ? KHTMLSettings::KJSWindowStatusAllow : INHERIT_POLICY);
}
void JSPolicies::defaults() {
Policies::defaults();
// enableJavaScriptGloballyCB->setChecked( true );
// enableJavaScriptDebugCB->setChecked( false );
// js_popup->setButton(0);
// enableDebugOutputCB->setChecked( false );
window_open = is_global ? KHTMLSettings::KJSWindowOpenSmart : INHERIT_POLICY;
window_resize = is_global ? KHTMLSettings::KJSWindowResizeAllow : INHERIT_POLICY;
window_move = is_global ? KHTMLSettings::KJSWindowMoveAllow : INHERIT_POLICY;
window_focus = is_global ? KHTMLSettings::KJSWindowFocusAllow : INHERIT_POLICY;
window_status = is_global ? KHTMLSettings::KJSWindowStatusAllow : INHERIT_POLICY;
}
void JSPolicies::save() {
Policies::save();
QString key;
key = prefix + "WindowOpenPolicy";
if (window_open != INHERIT_POLICY)
config->writeEntry(key, window_open);
else
config->deleteEntry(key);
key = prefix + "WindowResizePolicy";
if (window_resize != INHERIT_POLICY)
config->writeEntry(key, window_resize);
else
config->deleteEntry(key);
key = prefix + "WindowMovePolicy";
if (window_move != INHERIT_POLICY)
config->writeEntry(key, window_move);
else
config->deleteEntry(key);
key = prefix + "WindowFocusPolicy";
if (window_focus != INHERIT_POLICY)
config->writeEntry(key, window_focus);
else
config->deleteEntry(key);
key = prefix + "WindowStatusPolicy";
if (window_status != INHERIT_POLICY)
config->writeEntry(key, window_status);
else
config->deleteEntry(key);
// don't do a config->sync() here for sake of efficiency
}
// == class JSPoliciesFrame ==
JSPoliciesFrame::JSPoliciesFrame(JSPolicies *policies, const QString &title,
QWidget* parent) :
QGroupBox(title, parent, "jspoliciesframe"),
policies(policies) {
bool is_per_domain = !policies->isGlobal();
setColumnLayout(0, Qt::Vertical);
layout()->setSpacing(0);
layout()->setMargin(0);
QGridLayout *this_layout = new QGridLayout(layout(),5,10+is_per_domain*2);
this_layout->setAlignment(Qt::AlignTop);
this_layout->setSpacing(3);
this_layout->setMargin(11);
QString wtstr; // what's this description
int colIdx; // column index
// === window.open ================================
colIdx = 0;
QLabel *label = new QLabel(i18n("Open new windows:"),this);
this_layout->addWidget(label,0,colIdx++);
js_popup = new QButtonGroup(this);
js_popup->setExclusive(true);
js_popup->setHidden(true);
QRadioButton* policy_btn;
if (is_per_domain) {
policy_btn = new QRadioButton(i18n("Use global"), this);
QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
js_popup->insert(policy_btn,INHERIT_POLICY);
this_layout->addWidget(policy_btn,0,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
}/*end if*/
policy_btn = new QRadioButton(i18n("Allow"), this);
QWhatsThis::add(policy_btn,i18n("Accept all popup window requests."));
js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenAllow);
this_layout->addWidget(policy_btn,0,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Ask"), this);
QWhatsThis::add(policy_btn,i18n("Prompt every time a popup window is requested."));
js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenAsk);
this_layout->addWidget(policy_btn,0,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Deny"), this);
QWhatsThis::add(policy_btn,i18n("Reject all popup window requests."));
js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenDeny);
this_layout->addWidget(policy_btn,0,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Smart"), this);
QWhatsThis::add(policy_btn, i18n("Accept popup window requests only when "
"links are activated through an explicit "
"mouse click or keyboard operation."));
js_popup->insert(policy_btn,KHTMLSettings::KJSWindowOpenSmart);
this_layout->addWidget(policy_btn,0,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
wtstr = i18n("If you disable this, Konqueror will stop "
"interpreting the <i>window.open()</i> "
"JavaScript command. This is useful if you "
"regularly visit sites that make extensive use "
"of this command to pop up ad banners.<br>"
"<br><b>Note:</b> Disabling this option might "
"also break certain sites that require <i>"
"window.open()</i> for proper operation. Use "
"this feature carefully.");
QWhatsThis::add(label, wtstr);
connect(js_popup, SIGNAL(clicked(int)), SLOT(setWindowOpenPolicy(int)));
// === window.resizeBy/resizeTo ================================
colIdx = 0;
label = new QLabel(i18n("Resize window:"),this);
this_layout->addWidget(label,1,colIdx++);
js_resize = new QButtonGroup(this);
js_resize->setExclusive(true);
js_resize->setHidden(true);
if (is_per_domain) {
policy_btn = new QRadioButton(i18n("Use global"), this);
QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
js_resize->insert(policy_btn,INHERIT_POLICY);
this_layout->addWidget(policy_btn,1,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
}/*end if*/
policy_btn = new QRadioButton(i18n("Allow"), this);
QWhatsThis::add(policy_btn,i18n("Allow scripts to change the window size."));
js_resize->insert(policy_btn,KHTMLSettings::KJSWindowResizeAllow);
this_layout->addWidget(policy_btn,1,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Ignore"), this);
QWhatsThis::add( policy_btn,i18n("Ignore attempts of scripts to change the window size. "
"The web page will <i>think</i> it changed the "
"size but the actual window is not affected."));
js_resize->insert(policy_btn,KHTMLSettings::KJSWindowResizeIgnore);
this_layout->addWidget(policy_btn,1,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
wtstr = i18n("Some websites change the window size on their own by using "
"<i>window.resizeBy()</i> or <i>window.resizeTo()</i>. "
"This option specifies the treatment of such "
"attempts.");
QWhatsThis::add(label, wtstr);
connect(js_resize, SIGNAL(clicked(int)), SLOT(setWindowResizePolicy(int)));
// === window.moveBy/moveTo ================================
colIdx = 0;
label = new QLabel(i18n("Move window:"),this);
this_layout->addWidget(label,2,colIdx++);
js_move = new QButtonGroup(this);
js_move->setExclusive(true);
js_move->setHidden(true);
if (is_per_domain) {
policy_btn = new QRadioButton(i18n("Use global"), this);
QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
js_move->insert(policy_btn,INHERIT_POLICY);
this_layout->addWidget(policy_btn,2,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
}/*end if*/
policy_btn = new QRadioButton(i18n("Allow"), this);
QWhatsThis::add(policy_btn,i18n("Allow scripts to change the window position."));
js_move->insert(policy_btn,KHTMLSettings::KJSWindowMoveAllow);
this_layout->addWidget(policy_btn,2,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Ignore"), this);
QWhatsThis::add(policy_btn,i18n("Ignore attempts of scripts to change the window position. "
"The web page will <i>think</i> it moved the "
"window but the actual position is not affected."));
js_move->insert(policy_btn,KHTMLSettings::KJSWindowMoveIgnore);
this_layout->addWidget(policy_btn,2,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
wtstr = i18n("Some websites change the window position on their own by using "
"<i>window.moveBy()</i> or <i>window.moveTo()</i>. "
"This option specifies the treatment of such "
"attempts.");
QWhatsThis::add(label, wtstr);
connect(js_move, SIGNAL(clicked(int)), SLOT(setWindowMovePolicy(int)));
// === window.focus ================================
colIdx = 0;
label = new QLabel(i18n("Focus window:"),this);
this_layout->addWidget(label,3,colIdx++);
js_focus = new QButtonGroup(this);
js_focus->setExclusive(true);
js_focus->setHidden(true);
if (is_per_domain) {
policy_btn = new QRadioButton(i18n("Use global"), this);
QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
js_focus->insert(policy_btn,INHERIT_POLICY);
this_layout->addWidget(policy_btn,3,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
}/*end if*/
policy_btn = new QRadioButton(i18n("Allow"), this);
QWhatsThis::add( policy_btn,i18n("Allow scripts to focus the window.") );
js_focus->insert(policy_btn,KHTMLSettings::KJSWindowFocusAllow);
this_layout->addWidget(policy_btn,3,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Ignore"), this);
QWhatsThis::add( policy_btn,i18n("Ignore attempts of scripts to focus the window. "
"The web page will <i>think</i> it brought "
"the focus to the window but the actual "
"focus will remain unchanged.") );
js_focus->insert(policy_btn,KHTMLSettings::KJSWindowFocusIgnore);
this_layout->addWidget(policy_btn,3,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
wtstr = i18n("Some websites set the focus to their browser window on their "
"own by using <i>window.focus()</i>. This usually leads to "
"the window being moved to the front interrupting whatever "
"action the user was dedicated to at that time. "
"This option specifies the treatment of such "
"attempts.");
QWhatsThis::add(label, wtstr);
connect(js_focus, SIGNAL(clicked(int)), SLOT(setWindowFocusPolicy(int)));
// === window.status ================================
colIdx = 0;
label = new QLabel(i18n("Modify status bar text:"),this);
this_layout->addWidget(label,4,colIdx++);
js_statusbar = new QButtonGroup(this);
js_statusbar->setExclusive(true);
js_statusbar->setHidden(true);
if (is_per_domain) {
policy_btn = new QRadioButton(i18n("Use global"), this);
QWhatsThis::add(policy_btn,i18n("Use setting from global policy."));
js_statusbar->insert(policy_btn,INHERIT_POLICY);
this_layout->addWidget(policy_btn,4,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
}/*end if*/
policy_btn = new QRadioButton(i18n("Allow"), this);
QWhatsThis::add(policy_btn,i18n("Allow scripts to change the text of the status bar."));
js_statusbar->insert(policy_btn,KHTMLSettings::KJSWindowStatusAllow);
this_layout->addWidget(policy_btn,4,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
policy_btn = new QRadioButton(i18n("Ignore"), this);
QWhatsThis::add( policy_btn,i18n("Ignore attempts of scripts to change the status bar text. "
"The web page will <i>think</i> it changed "
"the text but the actual text will remain "
"unchanged.") );
js_statusbar->insert(policy_btn,KHTMLSettings::KJSWindowStatusIgnore);
this_layout->addWidget(policy_btn,4,colIdx++);
this_layout->addItem(new QSpacerItem(10,0),0,colIdx++);
wtstr = i18n("Some websites change the status bar text by setting "
"<i>window.status</i> or <i>window.defaultStatus</i>, "
"thus sometimes preventing displaying the real URLs of hyperlinks. "
"This option specifies the treatment of such "
"attempts.");
QWhatsThis::add(label, wtstr);
connect(js_statusbar, SIGNAL(clicked(int)), SLOT(setWindowStatusPolicy(int)));
}
JSPoliciesFrame::~JSPoliciesFrame() {
}
void JSPoliciesFrame::refresh() {
QRadioButton *button;
button = static_cast<QRadioButton *>(js_popup->find(
policies->window_open));
if (button != 0) button->setChecked(true);
button = static_cast<QRadioButton *>(js_resize->find(
policies->window_resize));
if (button != 0) button->setChecked(true);
button = static_cast<QRadioButton *>(js_move->find(
policies->window_move));
if (button != 0) button->setChecked(true);
button = static_cast<QRadioButton *>(js_focus->find(
policies->window_focus));
if (button != 0) button->setChecked(true);
button = static_cast<QRadioButton *>(js_statusbar->find(
policies->window_status));
if (button != 0) button->setChecked(true);
}
void JSPoliciesFrame::setWindowOpenPolicy(int id) {
policies->window_open = id;
emit changed();
}
void JSPoliciesFrame::setWindowResizePolicy(int id) {
policies->window_resize = id;
emit changed();
}
void JSPoliciesFrame::setWindowMovePolicy(int id) {
policies->window_move = id;
emit changed();
}
void JSPoliciesFrame::setWindowFocusPolicy(int id) {
policies->window_focus = id;
emit changed();
}
void JSPoliciesFrame::setWindowStatusPolicy(int id) {
policies->window_status = id;
emit changed();
}
#include "jspolicies.moc"