[SCM] WebKit Debian packaging branch, debian/experimental, updated. upstream/1.3.3-9427-gc2be6fc
japhet at chromium.org
japhet at chromium.org
Wed Dec 22 13:41:50 UTC 2010
The following commit has been merged in the debian/experimental branch:
commit f5d746be8b81d6fa7729d9d4c757f64ec50a14cc
Author: japhet at chromium.org <japhet at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date: Thu Sep 23 18:02:15 2010 +0000
2010-09-23 Nate Chapin <japhet at chromium.org>
Reviewed by Darin Fisher.
Implement <a ping> (disabled by default).
https://bugs.webkit.org/show_bug.cgi?id=30458
Tests: http/tests/navigation/ping-cross-origin-from-https.html
http/tests/navigation/ping-cross-origin.html
http/tests/navigation/ping-same-origin.html
* html/HTMLAnchorElement.cpp:
(WebCore::HTMLAnchorElement::defaultEventHandler):
(WebCore::HTMLAnchorElement::sendPings):
* html/HTMLAnchorElement.h:
* html/HTMLAttributeNames.in:
* loader/PingLoader.cpp:
(WebCore::PingLoader::sendPing): Set ping-specific headers.
(WebCore::PingLoader::PingLoader):
* loader/PingLoader.h:
(WebCore::PingLoader::timeout): Ensure pings eventually timeout, since
the normal cancel mechanism can't stop them.
* page/Settings.cpp:
* page/Settings.h: Add hyperlinkAuditingEnabled.
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@68166 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/LayoutTests/ChangeLog b/LayoutTests/ChangeLog
index d83e98d..8a39652 100644
--- a/LayoutTests/ChangeLog
+++ b/LayoutTests/ChangeLog
@@ -1,3 +1,23 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Tests for <a ping>, plus a rewrite of the other test of similar
+ load functionality (image-load-in-unload-handler.html). All these tests
+ now dump their interesting http headers (content type, request method,
+ referrer, and ping-specific headers).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * http/tests/navigation/image-load-in-unload-handler-expected.txt:
+ * http/tests/navigation/ping-cross-origin-expected.txt: Added.
+ * http/tests/navigation/ping-cross-origin-from-https-expected.txt: Added.
+ * http/tests/navigation/ping-cross-origin-from-https.html: Added.
+ * http/tests/navigation/ping-cross-origin.html: Added.
+ * http/tests/navigation/ping-same-origin-expected.txt: Added.
+ * http/tests/navigation/ping-same-origin.html: Added.
+ * http/tests/navigation/resources/check-ping.php:
+ * http/tests/navigation/resources/save-ping.php:
+
2010-09-23 Jeremy Orlow <jorlow at chromium.org>
Reviewed by Steve Block.
diff --git a/LayoutTests/http/tests/navigation/image-load-in-unload-handler-expected.txt b/LayoutTests/http/tests/navigation/image-load-in-unload-handler-expected.txt
index 4c73526..0ab3e9b 100644
--- a/LayoutTests/http/tests/navigation/image-load-in-unload-handler-expected.txt
+++ b/LayoutTests/http/tests/navigation/image-load-in-unload-handler-expected.txt
@@ -1,2 +1,4 @@
main frame - has 1 onunload handler(s)
-PASS
+Ping sent successfully
+HTTP_REFERER: http://127.0.0.1:8000/navigation/image-load-in-unload-handler.html
+REQUEST_METHOD: GET
diff --git a/LayoutTests/http/tests/navigation/ping-cross-origin-expected.txt b/LayoutTests/http/tests/navigation/ping-cross-origin-expected.txt
new file mode 100644
index 0000000..a28fcb4
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/ping-cross-origin-expected.txt
@@ -0,0 +1,5 @@
+Ping sent successfully
+CONTENT_TYPE: text/ping
+HTTP_PING_TO: http://127.0.0.1:8000/navigation/resources/check-ping.php
+HTTP_REFERER: http://127.0.0.1:8000/navigation/ping-cross-origin.html
+REQUEST_METHOD: POST
diff --git a/LayoutTests/http/tests/navigation/ping-cross-origin-from-https-expected.txt b/LayoutTests/http/tests/navigation/ping-cross-origin-from-https-expected.txt
new file mode 100644
index 0000000..5b9614c
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/ping-cross-origin-from-https-expected.txt
@@ -0,0 +1,4 @@
+Ping sent successfully
+CONTENT_TYPE: text/ping
+HTTP_PING_TO: https://127.0.0.1:8443/navigation/resources/check-ping.php
+REQUEST_METHOD: POST
diff --git a/LayoutTests/http/tests/navigation/ping-cross-origin-from-https.html b/LayoutTests/http/tests/navigation/ping-cross-origin-from-https.html
new file mode 100644
index 0000000..b4859d3
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/ping-cross-origin-from-https.html
@@ -0,0 +1,13 @@
+<html><head>
+<title>Ping</title>
+<script>
+
+if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.waitUntilDone();
+}
+
+if (location.protocol != "https:")
+ location = "https://127.0.0.1:8443/navigation/ping-cross-origin.html"
+</script>
+</head></html>
diff --git a/LayoutTests/http/tests/navigation/ping-cross-origin.html b/LayoutTests/http/tests/navigation/ping-cross-origin.html
new file mode 100644
index 0000000..9876980
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/ping-cross-origin.html
@@ -0,0 +1,31 @@
+<html><head>
+<title>Ping</title>
+<script>
+
+var testCalled = false;
+
+function test() {
+ if (!testCalled) {
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.overridePreference("WebKitHyperlinkAuditingEnabled", 1);
+ layoutTestController.waitUntilDone();
+ }
+ testCalled = true;
+ return;
+ }
+
+ if (window.eventSender) {
+ var a = document.getElementById("a");
+ eventSender.mouseMoveTo(a.offsetLeft + 2, a.offsetTop + 2);
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+ }
+}
+
+</script>
+</head>
+<body onload="test();">
+<img src="resources/delete-ping.php" onload="test();" onerror="test();"></img>
+<a id="a" href="resources/check-ping.php" ping="http://localhost:8000/navigation/resources/save-ping.php">Navigate and send ping</a>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/ping-same-origin-expected.txt b/LayoutTests/http/tests/navigation/ping-same-origin-expected.txt
new file mode 100644
index 0000000..536d5db
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/ping-same-origin-expected.txt
@@ -0,0 +1,5 @@
+Ping sent successfully
+CONTENT_TYPE: text/ping
+HTTP_PING_FROM: http://127.0.0.1:8000/navigation/ping-same-origin.html
+HTTP_PING_TO: http://127.0.0.1:8000/navigation/resources/check-ping.php
+REQUEST_METHOD: POST
diff --git a/LayoutTests/http/tests/navigation/ping-same-origin.html b/LayoutTests/http/tests/navigation/ping-same-origin.html
new file mode 100644
index 0000000..85d8eca
--- /dev/null
+++ b/LayoutTests/http/tests/navigation/ping-same-origin.html
@@ -0,0 +1,31 @@
+<html><head>
+<title>Ping</title>
+<script>
+
+var testCalled = false;
+
+function test() {
+ if (!testCalled) {
+ if (window.layoutTestController) {
+ layoutTestController.dumpAsText();
+ layoutTestController.overridePreference("WebKitHyperlinkAuditingEnabled", 1);
+ layoutTestController.waitUntilDone();
+ }
+ testCalled = true;
+ return;
+ }
+
+ if (window.eventSender) {
+ var a = document.getElementById("a");
+ eventSender.mouseMoveTo(a.offsetLeft + 2, a.offsetTop + 2);
+ eventSender.mouseDown();
+ eventSender.mouseUp();
+ }
+}
+
+</script>
+</head>
+<body onload="test();">
+<img src="resources/delete-ping.php" onload="test();" onerror="test();"></img>
+<a id="a" href="resources/check-ping.php" ping="resources/save-ping.php">Navigate and send ping</a>
+</body></html>
diff --git a/LayoutTests/http/tests/navigation/resources/check-ping.php b/LayoutTests/http/tests/navigation/resources/check-ping.php
index a9b5979..a0f2dd7 100644
--- a/LayoutTests/http/tests/navigation/resources/check-ping.php
+++ b/LayoutTests/http/tests/navigation/resources/check-ping.php
@@ -8,11 +8,18 @@ if (!file_exists("ping.txt")) {
return;
}
+echo "<html><body>\n";
+echo "Ping sent successfully";
+$pingFile = fopen("ping.txt", 'r');
+while ($line = fgets($pingFile)) {
+ echo "<br>";
+ echo trim($line);
+}
+fclose($pingFile);
unlink("ping.txt");
-
-echo "PASS\n";
-echo "<script>\n";
-echo "if (window.layoutTestController)\n";
-echo " layoutTestController.notifyDone();\n";
+echo "<script>";
+echo "if (window.layoutTestController)";
+echo " layoutTestController.notifyDone();";
echo "</script>";
+echo "</body></html>";
?>
diff --git a/LayoutTests/http/tests/navigation/resources/save-ping.php b/LayoutTests/http/tests/navigation/resources/save-ping.php
index 9446d47..589b97d 100644
--- a/LayoutTests/http/tests/navigation/resources/save-ping.php
+++ b/LayoutTests/http/tests/navigation/resources/save-ping.php
@@ -1,4 +1,10 @@
<?php
$pingFile = fopen("ping.txt", 'w');
+$httpHeaders = $_SERVER;
+ksort($httpHeaders, SORT_STRING);
+foreach ($httpHeaders as $name => $value) {
+ if ($name === "CONTENT_TYPE" || $name === "HTTP_REFERER" || $name === "HTTP_PING_TO" || $name === "HTTP_PING_FROM" || $name === "REQUEST_METHOD")
+ fwrite($pingFile, "$name: $value\n");
+}
fclose($pingFile);
?>
diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog
index e52ca81..529cef9 100644
--- a/WebCore/ChangeLog
+++ b/WebCore/ChangeLog
@@ -1,3 +1,28 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Implement <a ping> (disabled by default).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ Tests: http/tests/navigation/ping-cross-origin-from-https.html
+ http/tests/navigation/ping-cross-origin.html
+ http/tests/navigation/ping-same-origin.html
+
+ * html/HTMLAnchorElement.cpp:
+ (WebCore::HTMLAnchorElement::defaultEventHandler):
+ (WebCore::HTMLAnchorElement::sendPings):
+ * html/HTMLAnchorElement.h:
+ * html/HTMLAttributeNames.in:
+ * loader/PingLoader.cpp:
+ (WebCore::PingLoader::sendPing): Set ping-specific headers.
+ (WebCore::PingLoader::PingLoader):
+ * loader/PingLoader.h:
+ (WebCore::PingLoader::timeout): Ensure pings eventually timeout, since
+ the normal cancel mechanism can't stop them.
+ * page/Settings.cpp:
+ * page/Settings.h: Add hyperlinkAuditingEnabled.
+
2010-09-23 Steve VanDeBogart <vandebo at chromium.org>
Reviewed by David Levin.
diff --git a/WebCore/html/HTMLAnchorElement.cpp b/WebCore/html/HTMLAnchorElement.cpp
index 995552e..7684716 100644
--- a/WebCore/html/HTMLAnchorElement.cpp
+++ b/WebCore/html/HTMLAnchorElement.cpp
@@ -33,6 +33,7 @@
#include "KeyboardEvent.h"
#include "MouseEvent.h"
#include "Page.h"
+#include "PingLoader.h"
#include "RenderImage.h"
#include "ResourceHandle.h"
#include "Settings.h"
@@ -147,6 +148,7 @@ void HTMLAnchorElement::defaultEventHandler(Event* event)
String url = deprecatedParseURL(getAttribute(hrefAttr));
appendServerMapMousePosition(url, event);
handleLinkClick(event, document(), url, getAttribute(targetAttr), hasRel(RelationNoReferrer));
+ sendPings(document()->completeURL(url));
return;
}
@@ -465,6 +467,16 @@ bool HTMLAnchorElement::isLiveLink() const
return isLink() && treatLinkAsLiveForEventType(m_wasShiftKeyDownOnMouseDown ? MouseEventWithShiftKey : MouseEventWithoutShiftKey);
}
+void HTMLAnchorElement::sendPings(const KURL& destinationURL)
+{
+ if (!hasAttribute(pingAttr) || !document()->settings()->hyperlinkAuditingEnabled())
+ return;
+
+ SpaceSplitString pingURLs(getAttribute(pingAttr), true);
+ for (unsigned i = 0; i < pingURLs.size(); i++)
+ PingLoader::sendPing(document()->frame(), document()->completeURL(pingURLs[i]), destinationURL);
+}
+
HTMLAnchorElement::EventType HTMLAnchorElement::eventType(Event* event)
{
if (!event->isMouseEvent())
diff --git a/WebCore/html/HTMLAnchorElement.h b/WebCore/html/HTMLAnchorElement.h
index 16baff1..707d7c4 100644
--- a/WebCore/html/HTMLAnchorElement.h
+++ b/WebCore/html/HTMLAnchorElement.h
@@ -109,6 +109,8 @@ private:
virtual short tabIndex() const;
virtual bool draggable() const;
+ void sendPings(const KURL& destinationURL);
+
enum EventType {
MouseEventWithoutShiftKey,
MouseEventWithShiftKey,
diff --git a/WebCore/html/HTMLAttributeNames.in b/WebCore/html/HTMLAttributeNames.in
index 103d2c6..d838615 100644
--- a/WebCore/html/HTMLAttributeNames.in
+++ b/WebCore/html/HTMLAttributeNames.in
@@ -229,6 +229,7 @@ optimum
pattern
placeholder
pluginurl
+ping
poster
precision
preload
diff --git a/WebCore/loader/PingLoader.cpp b/WebCore/loader/PingLoader.cpp
index 2a628ce..dd00128 100644
--- a/WebCore/loader/PingLoader.cpp
+++ b/WebCore/loader/PingLoader.cpp
@@ -32,6 +32,7 @@
#include "config.h"
#include "PingLoader.h"
+#include "FormData.h"
#include "Frame.h"
#include "ResourceHandle.h"
#include "SecurityOrigin.h"
@@ -60,9 +61,40 @@ void PingLoader::loadImage(Frame* frame, const KURL& url)
UNUSED_PARAM(leakedPingLoader);
}
+// http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#hyperlink-auditing
+void PingLoader::sendPing(Frame* frame, const KURL& pingURL, const KURL& destinationURL)
+{
+ ResourceRequest request(pingURL);
+ request.setTargetType(ResourceRequest::TargetIsSubresource);
+ request.setHTTPMethod("POST");
+ request.setHTTPContentType("text/ping");
+ request.setHTTPBody(FormData::create("PING"));
+ request.setHTTPHeaderField("Cache-Control", "max-age=0");
+ frame->loader()->addExtraFieldsToSubresourceRequest(request);
+
+ SecurityOrigin* sourceOrigin = frame->document()->securityOrigin();
+ RefPtr<SecurityOrigin> pingOrigin = SecurityOrigin::create(pingURL);
+ FrameLoader::addHTTPOriginIfNeeded(request, sourceOrigin->toString());
+ request.setHTTPHeaderField("Ping-To", destinationURL);
+ if (sourceOrigin->isSameSchemeHostPort(pingOrigin.get()))
+ request.setHTTPHeaderField("Ping-From", frame->document()->url());
+ else if (!SecurityOrigin::shouldHideReferrer(pingURL, frame->loader()->outgoingReferrer()))
+ request.setHTTPReferrer(frame->loader()->outgoingReferrer());
+ OwnPtr<PingLoader> pingLoader = adoptPtr(new PingLoader(frame, request));
+
+ // Leak the ping loader, since it will kill itself as soon as it receives a response.
+ PingLoader* leakedPingLoader = pingLoader.leakPtr();
+ UNUSED_PARAM(leakedPingLoader);
+}
+
PingLoader::PingLoader(Frame* frame, const ResourceRequest& request)
+ : m_timeout(this, &PingLoader::timeout)
{
m_handle = ResourceHandle::create(frame->loader()->networkingContext(), request, this, false, false);
+
+ // If the server never responds, FrameLoader won't be able to cancel this load and
+ // we'll sit here waiting forever. Set a very generous timeout, just in case.
+ m_timeout.startOneShot(60000);
}
PingLoader::~PingLoader()
diff --git a/WebCore/loader/PingLoader.h b/WebCore/loader/PingLoader.h
index e26a9c9..eb43166 100644
--- a/WebCore/loader/PingLoader.h
+++ b/WebCore/loader/PingLoader.h
@@ -33,6 +33,7 @@
#define PingLoader_h
#include "ResourceHandleClient.h"
+#include "Timer.h"
#include <wtf/Noncopyable.h>
#include <wtf/RefPtr.h>
@@ -52,6 +53,7 @@ class ResourceResponse;
class PingLoader : private ResourceHandleClient, public Noncopyable {
public:
static void loadImage(Frame*, const KURL& url);
+ static void sendPing(Frame*, const KURL& pingURL, const KURL& destinationURL);
~PingLoader();
@@ -62,8 +64,10 @@ private:
void didReceiveData(ResourceHandle*, const char*, int) { delete this; }
void didFinishLoading(ResourceHandle*, double) { delete this; }
void didFail(ResourceHandle*, const ResourceError&) { delete this; }
+ void timeout(Timer<PingLoader>*) { delete this; }
RefPtr<ResourceHandle> m_handle;
+ Timer<PingLoader> m_timeout;
};
}
diff --git a/WebCore/page/Settings.cpp b/WebCore/page/Settings.cpp
index fac0a5f..38fbe21 100644
--- a/WebCore/page/Settings.cpp
+++ b/WebCore/page/Settings.cpp
@@ -147,6 +147,7 @@ Settings::Settings(Page* page)
, m_memoryInfoEnabled(false)
, m_interactiveFormValidation(false)
, m_usePreHTML5ParserQuirks(false)
+ , m_hyperlinkAuditingEnabled(false)
{
// A Frame may not have been created yet, so we initialize the AtomicString
// hash before trying to use it.
diff --git a/WebCore/page/Settings.h b/WebCore/page/Settings.h
index 99a4f23..85ce0c8 100644
--- a/WebCore/page/Settings.h
+++ b/WebCore/page/Settings.h
@@ -330,6 +330,9 @@ namespace WebCore {
void setUsePreHTML5ParserQuirks(bool flag) { m_usePreHTML5ParserQuirks = flag; }
bool usePreHTML5ParserQuirks() const { return m_usePreHTML5ParserQuirks; }
+ void setHyperlinkAuditingEnabled(bool flag) { m_hyperlinkAuditingEnabled = flag; }
+ bool hyperlinkAuditingEnabled() const { return m_hyperlinkAuditingEnabled; }
+
private:
Page* m_page;
@@ -417,6 +420,7 @@ namespace WebCore {
bool m_memoryInfoEnabled: 1;
bool m_interactiveFormValidation: 1;
bool m_usePreHTML5ParserQuirks: 1;
+ bool m_hyperlinkAuditingEnabled : 1;
#if USE(SAFARI_THEME)
static bool gShouldPaintNativeControls;
diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 28a4c82..a8b0fa8 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,15 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Add hyperlink auditing settings (i.e., <a ping>).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * public/WebSettings.h:
+ * src/WebSettingsImpl.cpp:
+ (WebKit::WebSettingsImpl::setHyperlinkAuditingEnabled):
+ * src/WebSettingsImpl.h:
+
2010-09-23 Andrey Kosyakov <caseq at chromium.org>
Unreviewed build fix ("WTF/" -> "wtf/" in include, broke Arm build)
diff --git a/WebKit/chromium/public/WebSettings.h b/WebKit/chromium/public/WebSettings.h
index 0bef045..ec98600 100644
--- a/WebKit/chromium/public/WebSettings.h
+++ b/WebKit/chromium/public/WebSettings.h
@@ -93,6 +93,7 @@ public:
virtual void setAcceleratedCompositingEnabled(bool) = 0;
virtual void setAccelerated2dCanvasEnabled(bool) = 0;
virtual void setMemoryInfoEnabled(bool) = 0;
+ virtual void setHyperlinkAuditingEnabled(bool) = 0;
protected:
~WebSettings() { }
diff --git a/WebKit/chromium/src/WebSettingsImpl.cpp b/WebKit/chromium/src/WebSettingsImpl.cpp
index 329027c..8af3864 100644
--- a/WebKit/chromium/src/WebSettingsImpl.cpp
+++ b/WebKit/chromium/src/WebSettingsImpl.cpp
@@ -289,4 +289,9 @@ void WebSettingsImpl::setMemoryInfoEnabled(bool enabled)
m_settings->setMemoryInfoEnabled(enabled);
}
+void WebSettingsImpl::setHyperlinkAuditingEnabled(bool enabled)
+{
+ m_settings->setHyperlinkAuditingEnabled(enabled);
+}
+
} // namespace WebKit
diff --git a/WebKit/chromium/src/WebSettingsImpl.h b/WebKit/chromium/src/WebSettingsImpl.h
index 0120dbc..6f204f4 100644
--- a/WebKit/chromium/src/WebSettingsImpl.h
+++ b/WebKit/chromium/src/WebSettingsImpl.h
@@ -89,6 +89,7 @@ public:
virtual void setAcceleratedCompositingEnabled(bool);
virtual void setAccelerated2dCanvasEnabled(bool);
virtual void setMemoryInfoEnabled(bool);
+ virtual void setHyperlinkAuditingEnabled(bool);
private:
WebCore::Settings* m_settings;
diff --git a/WebKit/gtk/ChangeLog b/WebKit/gtk/ChangeLog
index 1ce8228..1a09dd1 100644
--- a/WebKit/gtk/ChangeLog
+++ b/WebKit/gtk/ChangeLog
@@ -1,3 +1,19 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Add hyperlink auditing settings (i.e., <a ping>).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * webkit/webkitwebsettings.cpp:
+ (webkit_web_settings_class_init):
+ (webkit_web_settings_set_property):
+ (webkit_web_settings_get_property):
+ (webkit_web_settings_copy):
+ * webkit/webkitwebview.cpp:
+ (webkit_web_view_update_settings):
+ (webkit_web_view_settings_notify):
+
2010-09-22 Mario Sanchez Prada <msanchez at igalia.com>
Reviewed by Martin Robinson.
diff --git a/WebKit/gtk/webkit/webkitwebsettings.cpp b/WebKit/gtk/webkit/webkitwebsettings.cpp
index 078bcc3..0b7cbd7 100644
--- a/WebKit/gtk/webkit/webkitwebsettings.cpp
+++ b/WebKit/gtk/webkit/webkitwebsettings.cpp
@@ -108,6 +108,7 @@ struct _WebKitWebSettingsPrivate {
gboolean enable_page_cache;
gboolean auto_resize_window;
gboolean enable_java_applet;
+ gboolean enable_hyperlink_auditing;
};
#define WEBKIT_WEB_SETTINGS_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_SETTINGS, WebKitWebSettingsPrivate))
@@ -158,6 +159,7 @@ enum {
PROP_ENABLE_PAGE_CACHE,
PROP_AUTO_RESIZE_WINDOW,
PROP_ENABLE_JAVA_APPLET
+ PROP_ENABLE_HYPERLINK_AUDITING
};
// Create a default user agent string
@@ -863,6 +865,21 @@ static void webkit_web_settings_class_init(WebKitWebSettingsClass* klass)
TRUE,
flags));
+ /**
+ * WebKitWebSettings:enable-hyperlink-auditing:
+ *
+ * Enable or disable support for <a ping>.
+ *
+ * Since: 1.1.22
+ */
+ g_object_class_install_property(gobject_class,
+ PROP_ENABLE_HYPERLINK_AUDITING,
+ g_param_spec_boolean("enable-hyperlink-auditing",
+ _("Enable Hyperlink Auditing"),
+ _("Whether <a ping> should be able to send pings"),
+ FALSE,
+ flags));
+
g_type_class_add_private(klass, sizeof(WebKitWebSettingsPrivate));
}
@@ -1083,6 +1100,9 @@ static void webkit_web_settings_set_property(GObject* object, guint prop_id, con
case PROP_ENABLE_JAVA_APPLET:
priv->enable_java_applet = g_value_get_boolean(value);
break;
+ case PROP_ENABLE_HYPERLINK_AUDITING:
+ priv->enable_hyperlink_auditing = g_value_get_boolean(value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -1224,6 +1244,9 @@ static void webkit_web_settings_get_property(GObject* object, guint prop_id, GVa
case PROP_ENABLE_JAVA_APPLET:
g_value_set_boolean(value, priv->enable_java_applet);
break;
+ case PROP_ENABLE_HYPERLINK_AUDITING:
+ g_value_set_boolean(value, priv->enable_hyperlink_auditing);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
break;
@@ -1297,6 +1320,7 @@ WebKitWebSettings* webkit_web_settings_copy(WebKitWebSettings* web_settings)
"enable-page-cache", priv->enable_page_cache,
"auto-resize-window", priv->auto_resize_window,
"enable-java-applet", priv->enable_java_applet,
+ "enable-hyperlink-auditing", priv->enable_hyperlink_auditing,
NULL));
return copy;
diff --git a/WebKit/gtk/webkit/webkitwebview.cpp b/WebKit/gtk/webkit/webkitwebview.cpp
index 15ef2e8..762888a 100644
--- a/WebKit/gtk/webkit/webkitwebview.cpp
+++ b/WebKit/gtk/webkit/webkitwebview.cpp
@@ -2853,7 +2853,7 @@ static void webkit_web_view_update_settings(WebKitWebView* webView)
javaScriptCanAccessClipboard, enableOfflineWebAppCache,
enableUniversalAccessFromFileURI, enableFileAccessFromFileURI,
enableDOMPaste, tabKeyCyclesThroughElements,
- enableSiteSpecificQuirks, usePageCache, enableJavaApplet;
+ enableSiteSpecificQuirks, usePageCache, enableJavaApplet, enableHyperlinkAuditing;
WebKitEditingBehavior editingBehavior;
@@ -2890,6 +2890,7 @@ static void webkit_web_view_update_settings(WebKitWebView* webView)
"enable-site-specific-quirks", &enableSiteSpecificQuirks,
"enable-page-cache", &usePageCache,
"enable-java-applet", &enableJavaApplet,
+ "enable-hyperlink-auditing", &enableHyperlinkAuditing,
NULL);
settings->setDefaultTextEncodingName(defaultEncoding);
@@ -2925,6 +2926,7 @@ static void webkit_web_view_update_settings(WebKitWebView* webView)
settings->setNeedsSiteSpecificQuirks(enableSiteSpecificQuirks);
settings->setUsesPageCache(usePageCache);
settings->setJavaEnabled(enableJavaApplet);
+ settings->setHyperlinkAuditingEnabled(enableHyperlinkAuditing);
Page* page = core(webView);
if (page)
@@ -3036,6 +3038,8 @@ static void webkit_web_view_settings_notify(WebKitWebSettings* webSettings, GPar
settings->setUsesPageCache(g_value_get_boolean(&value));
else if (name == g_intern_string("enable-java-applet"))
settings->setJavaEnabled(g_value_get_boolean(&value));
+ else if (name == g_intern_string("enable-hyperlink-auditing"))
+ settings->setHyperlinkAuditingEnabled(g_value_get_boolean(&value));
else if (!g_object_class_find_property(G_OBJECT_GET_CLASS(webSettings), name))
g_warning("Unexpected setting '%s'", name);
g_value_unset(&value);
diff --git a/WebKit/mac/ChangeLog b/WebKit/mac/ChangeLog
index 72a84c0..e180c94 100644
--- a/WebKit/mac/ChangeLog
+++ b/WebKit/mac/ChangeLog
@@ -1,3 +1,20 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Add hyperlink auditing settings (i.e., <a ping>).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * WebView/WebPreferenceKeysPrivate.h:
+ * WebView/WebPreferences.mm:
+ (+[WebPreferences initialize]):
+ (-[WebPreferences setMemoryInfoEnabled:]):
+ (-[WebPreferences hyperlinkAuditingEnabled]):
+ (-[WebPreferences setHyperlinkAuditingEnabled:]):
+ * WebView/WebPreferencesPrivate.h:
+ * WebView/WebView.mm:
+ (-[WebView _preferencesChangedNotification:]):
+
2010-09-22 Alexey Proskuryakov <ap at apple.com>
Reviewed by Anders Carlsson.
diff --git a/WebKit/mac/WebView/WebPreferenceKeysPrivate.h b/WebKit/mac/WebView/WebPreferenceKeysPrivate.h
index 17c8e4d..8119649 100644
--- a/WebKit/mac/WebView/WebPreferenceKeysPrivate.h
+++ b/WebKit/mac/WebView/WebPreferenceKeysPrivate.h
@@ -100,6 +100,7 @@
#define WebKitDNSPrefetchingEnabledPreferenceKey @"WebKitDNSPrefetchingEnabled"
#define WebKitFullScreenEnabledPreferenceKey @"WebKitFullScreenEnabled"
#define WebKitMemoryInfoEnabledPreferenceKey @"WebKitMemoryInfoEnabled"
+#define WebKitHyperlinkAuditingEnabledPreferenceKey @"WebKitHyperlinkAuditingEnabled"
// These are private both because callers should be using the cover methods and because the
// cover methods themselves are private.
diff --git a/WebKit/mac/WebView/WebPreferences.mm b/WebKit/mac/WebView/WebPreferences.mm
index 87284bb..2ddd8b3 100644
--- a/WebKit/mac/WebView/WebPreferences.mm
+++ b/WebKit/mac/WebView/WebPreferences.mm
@@ -368,6 +368,7 @@ static WebCacheModel cacheModelForMainBundle(void)
[NSNumber numberWithBool:YES], WebKitDNSPrefetchingEnabledPreferenceKey,
[NSNumber numberWithBool:NO], WebKitFullScreenEnabledPreferenceKey,
[NSNumber numberWithBool:NO], WebKitMemoryInfoEnabledPreferenceKey,
+ [NSNumber numberWithBool:NO], WebKitHyperlinkAuditingEnabledPreferenceKey,
[NSNumber numberWithBool:NO], WebKitUsePreHTML5ParserQuirksKey,
[NSNumber numberWithLongLong:WebCore::ApplicationCacheStorage::noQuota()], WebKitApplicationCacheTotalQuota,
[NSNumber numberWithLongLong:WebCore::ApplicationCacheStorage::noQuota()], WebKitApplicationCacheDefaultOriginQuota,
@@ -1332,6 +1333,16 @@ static NSString *classIBCreatorID = nil;
[self _setBoolValue:flag forKey:WebKitMemoryInfoEnabledPreferenceKey];
}
+- (BOOL)hyperlinkAuditingEnabled
+{
+ return [self _boolValueForKey:WebKitHyperlinkAuditingEnabledPreferenceKey];
+}
+
+- (void)setHyperlinkAuditingEnabled:(BOOL)flag
+{
+ [self _setBoolValue:flag forKey:WebKitHyperlinkAuditingEnabledPreferenceKey];
+}
+
- (WebKitEditingBehavior)editingBehavior
{
return static_cast<WebKitEditingBehavior>([self _integerValueForKey:WebKitEditingBehaviorPreferenceKey]);
diff --git a/WebKit/mac/WebView/WebPreferencesPrivate.h b/WebKit/mac/WebView/WebPreferencesPrivate.h
index 3bd5e24..bb525cd 100644
--- a/WebKit/mac/WebView/WebPreferencesPrivate.h
+++ b/WebKit/mac/WebView/WebPreferencesPrivate.h
@@ -196,6 +196,9 @@ extern NSString *WebPreferencesRemovedNotification;
- (BOOL)memoryInfoEnabled;
- (void)setMemoryInfoEnabled:(BOOL)enabled;
+- (BOOL)hyperlinkAuditingEnabled;
+- (void)setHyperlinkAuditingEnabled:(BOOL)enabled;
+
// Other private methods
- (void)_postPreferencesChangesNotification;
+ (WebPreferences *)_getInstanceForIdentifier:(NSString *)identifier;
diff --git a/WebKit/mac/WebView/WebView.mm b/WebKit/mac/WebView/WebView.mm
index 9f3271e..9a53ad2 100644
--- a/WebKit/mac/WebView/WebView.mm
+++ b/WebKit/mac/WebView/WebView.mm
@@ -1463,6 +1463,7 @@ static bool fastDocumentTeardownEnabled()
settings->setFullScreenEnabled([preferences fullScreenEnabled]);
#endif
settings->setMemoryInfoEnabled([preferences memoryInfoEnabled]);
+ settings->setHyperlinkAuditingEnabled([preferences hyperlinkAuditingEnabled]);
settings->setUsePreHTML5ParserQuirks(shouldUsePreHTML5ParserQuirks(preferences));
// Application Cache Preferences are stored on the global cache storage manager, not in Settings.
diff --git a/WebKit/qt/Api/qwebsettings.cpp b/WebKit/qt/Api/qwebsettings.cpp
index b71de25..6b36522 100644
--- a/WebKit/qt/Api/qwebsettings.cpp
+++ b/WebKit/qt/Api/qwebsettings.cpp
@@ -174,6 +174,11 @@ void QWebSettingsPrivate::apply()
settings->setWebGLEnabled(value);
#endif
+
+ value = attributes.value(QWebSettings::HyperlinkAuditingEnabled,
+ global->attributes.value(QWebSettings::HyperlinkAuditingEnabled));
+
+ settings->setHyperlinkAuditingEnabled(value);
value = attributes.value(QWebSettings::JavascriptCanOpenWindows,
global->attributes.value(QWebSettings::JavascriptCanOpenWindows));
@@ -495,6 +500,7 @@ QWebSettings::QWebSettings()
d->attributes.insert(QWebSettings::LocalContentCanAccessFileUrls, true);
d->attributes.insert(QWebSettings::AcceleratedCompositingEnabled, true);
d->attributes.insert(QWebSettings::WebGLEnabled, false);
+ d->attributes.insert(QWebSettings::HyperlinkAuditingEnabled, false);
d->attributes.insert(QWebSettings::TiledBackingStoreEnabled, false);
d->attributes.insert(QWebSettings::FrameFlatteningEnabled, false);
d->attributes.insert(QWebSettings::SiteSpecificQuirksEnabled, true);
diff --git a/WebKit/qt/Api/qwebsettings.h b/WebKit/qt/Api/qwebsettings.h
index 8967e7c..d5e0ef6 100644
--- a/WebKit/qt/Api/qwebsettings.h
+++ b/WebKit/qt/Api/qwebsettings.h
@@ -75,7 +75,8 @@ public:
TiledBackingStoreEnabled,
FrameFlatteningEnabled,
SiteSpecificQuirksEnabled,
- WebGLEnabled
+ WebGLEnabled,
+ HyperlinkAuditingEnabled
};
enum WebGraphic {
MissingImageGraphic,
diff --git a/WebKit/qt/ChangeLog b/WebKit/qt/ChangeLog
index 06aa1e4..50da0d6 100644
--- a/WebKit/qt/ChangeLog
+++ b/WebKit/qt/ChangeLog
@@ -1,3 +1,16 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Add hyperlink auditing settings (i.e., <a ping>).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * Api/qwebsettings.cpp:
+ (QWebSettingsPrivate::apply):
+ (QWebSettings::QWebSettings):
+ * Api/qwebsettings.h:
+
+
2010-09-23 Tor Arne Vestbø <tor.arne.vestbo at nokia.com>
Reviewed by Simon Hausmann.
diff --git a/WebKit/win/ChangeLog b/WebKit/win/ChangeLog
index e92fc8e..406694b 100644
--- a/WebKit/win/ChangeLog
+++ b/WebKit/win/ChangeLog
@@ -1,3 +1,20 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Add hyperlink auditing settings (i.e., <a ping>).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * Interfaces/IWebPreferences.idl:
+ * WebPreferenceKeysPrivate.h:
+ * WebPreferences.cpp:
+ (WebPreferences::initializeDefaultSettings):
+ (WebPreferences::hyperlinkAuditingEnabled):
+ (WebPreferences::setHyperlinkAuditingEnabled):
+ * WebPreferences.h:
+ * WebView.cpp:
+ (WebView::notifyPreferencesChanged):
+
2010-09-23 Matthew Delaney <mdelaney at apple.com>
Reviewed by Adam Roben.
diff --git a/WebKit/win/Interfaces/IWebPreferences.idl b/WebKit/win/Interfaces/IWebPreferences.idl
index 4fb3de8..678557b 100644
--- a/WebKit/win/Interfaces/IWebPreferences.idl
+++ b/WebKit/win/Interfaces/IWebPreferences.idl
@@ -198,4 +198,7 @@ interface IWebPreferences : IUnknown
HRESULT editingBehavior([out, retval] WebKitEditingBehavior* editingBehavior);
HRESULT setEditingBehavior([in] WebKitEditingBehavior behavior);
+
+ HRESULT hyperlinkAuditingEnabled(BOOL *hyperlinkAuditingEnabled);
+ HRESULT setHyperlinkAuditingEnabled(BOOL hyperlinkAuditingEnabled);
}
diff --git a/WebKit/win/WebPreferenceKeysPrivate.h b/WebKit/win/WebPreferenceKeysPrivate.h
index f62905c..0b781d8 100644
--- a/WebKit/win/WebPreferenceKeysPrivate.h
+++ b/WebKit/win/WebPreferenceKeysPrivate.h
@@ -66,6 +66,7 @@
#define WebKitUsesPageCachePreferenceKey "WebKitUsesPageCachePreferenceKey"
#define WebKitCacheModelPreferenceKey "WebKitCacheModelPreferenceKey"
#define WebKitLocalStorageDatabasePathPreferenceKey "WebKitLocalStorageDatabasePath"
+#define WebKitHyperlinkAuditingEnabledPreferenceKey "WebKitHyperlinkAuditingEnabled"
// These are private both because callers should be using the cover methods and because the
// cover methods themselves are private.
diff --git a/WebKit/win/WebPreferences.cpp b/WebKit/win/WebPreferences.cpp
index 255b68e..d4bfd3e 100644
--- a/WebKit/win/WebPreferences.cpp
+++ b/WebKit/win/WebPreferences.cpp
@@ -264,6 +264,7 @@ void WebPreferences::initializeDefaultSettings()
CFDictionaryAddValue(defaults, CFSTR(WebKitDNSPrefetchingEnabledPreferenceKey), kCFBooleanTrue);
CFDictionaryAddValue(defaults, CFSTR(WebKitMemoryInfoEnabledPreferenceKey), kCFBooleanFalse);
+ CFDictionaryAddValue(defaults, CFSTR(WebKitHyperlinkAuditingEnabledPreferenceKey), kCFBooleanFalse);
defaultSettings = defaults;
}
@@ -1148,6 +1149,19 @@ HRESULT STDMETHODCALLTYPE WebPreferences::setEditingBehavior(
return S_OK;
}
+HRESULT STDMETHODCALLTYPE WebPreferences::hyperlinkAuditingEnabled(
+ /* [in] */ BOOL* enabled)
+{
+ *enabled = boolValueForKey(CFSTR(WebKitHyperlinkAuditingEnabledPreferenceKey));
+ return S_OK;
+}
+
+HRESULT STDMETHODCALLTYPE WebPreferences::setHyperlinkAuditingEnabled(
+ /* [retval][out] */ BOOL enabled)
+{
+ setBoolValue(CFSTR(WebKitHyperlinkAuditingEnabledPreferenceKey), enabled);
+ return S_OK;
+}
HRESULT STDMETHODCALLTYPE WebPreferences::cookieStorageAcceptPolicy(
/* [retval][out] */ WebKitCookieStorageAcceptPolicy *acceptPolicy )
diff --git a/WebKit/win/WebPreferences.h b/WebKit/win/WebPreferences.h
index 463e1b3..d09945a 100644
--- a/WebKit/win/WebPreferences.h
+++ b/WebKit/win/WebPreferences.h
@@ -426,6 +426,9 @@ public:
virtual HRESULT STDMETHODCALLTYPE setMemoryInfoEnabled(BOOL);
virtual HRESULT STDMETHODCALLTYPE memoryInfoEnabled(BOOL*);
+ virtual HRESULT STDMETHODCALLTYPE hyperlinkAuditingEnabled(BOOL*);
+ virtual HRESULT STDMETHODCALLTYPE setHyperlinkAuditingEnabled(BOOL);
+
// WebPreferences
// This method accesses a different preference key than developerExtrasEnabled.
diff --git a/WebKit/win/WebView.cpp b/WebKit/win/WebView.cpp
index affd058..5ea707a 100755
--- a/WebKit/win/WebView.cpp
+++ b/WebKit/win/WebView.cpp
@@ -4778,6 +4778,11 @@ HRESULT WebView::notifyPreferencesChanged(IWebNotification* notification)
return hr;
settings->setMemoryInfoEnabled(enabled);
+ hr = prefsPrivate->hyperlinkAuditingEnabled(&enabled);
+ if (FAILED(hr))
+ return hr;
+ settings->setHyperlinkAuditingEnabled(enabled);
+
if (!m_closeWindowTimer)
m_mainFrame->invalidate(); // FIXME
diff --git a/WebKitTools/ChangeLog b/WebKitTools/ChangeLog
index f1143b8..99fb6e5 100644
--- a/WebKitTools/ChangeLog
+++ b/WebKitTools/ChangeLog
@@ -1,3 +1,21 @@
+2010-09-23 Nate Chapin <japhet at chromium.org>
+
+ Reviewed by Darin Fisher.
+
+ Allow DRT to toggle hyperlink auditing (i.e., <a ping>).
+ https://bugs.webkit.org/show_bug.cgi?id=30458
+
+ * DumpRenderTree/chromium/LayoutTestController.cpp:
+ (LayoutTestController::overridePreference):
+ * DumpRenderTree/chromium/WebPreferences.cpp:
+ (WebPreferences::reset):
+ (WebPreferences::applyTo):
+ * DumpRenderTree/chromium/WebPreferences.h:
+ * DumpRenderTree/gtk/DumpRenderTree.cpp:
+ (resetDefaultsToConsistentValues):
+ * DumpRenderTree/qt/LayoutTestControllerQt.cpp:
+ (LayoutTestController::overridePreference):
+
2010-09-21 Stephen White <senorblanco at chromium.org>
Reviewed by David Levin.
diff --git a/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp b/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp
index b1c0bcd..2b3f0ba 100644
--- a/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp
+++ b/WebKitTools/DumpRenderTree/chromium/LayoutTestController.cpp
@@ -1251,6 +1251,8 @@ void LayoutTestController::overridePreference(const CppArgumentList& arguments,
prefs->tabsToLinks = cppVariantToBool(value);
else if (key == "WebKitWebGLEnabled")
prefs->experimentalWebGLEnabled = cppVariantToBool(value);
+ else if (key == "WebKitHyperlinkAuditingEnabled")
+ prefs->hyperlinkAuditingEnabled = cppVariantToBool(value);
else {
string message("Invalid name for preference: ");
message.append(key);
diff --git a/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp b/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp
index 8d2db1f..5e4a97e 100644
--- a/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp
+++ b/WebKitTools/DumpRenderTree/chromium/WebPreferences.cpp
@@ -100,6 +100,7 @@ void WebPreferences::reset()
#endif
tabsToLinks = false;
+ hyperlinkAuditingEnabled = false;
accelerated2dCanvasEnabled = false;
}
@@ -140,6 +141,7 @@ void WebPreferences::applyTo(WebView* webView)
settings->setWebSecurityEnabled(webSecurityEnabled);
settings->setAllowUniversalAccessFromFileURLs(allowUniversalAccessFromFileURLs);
settings->setEditingBehavior(editingBehavior);
+ settings->setHyperlinkAuditingEnabled(hyperlinkAuditingEnabled);
// LayoutTests were written with Safari Mac in mind which does not allow
// tabbing to links by default.
webView->setTabsToLinks(tabsToLinks);
diff --git a/WebKitTools/DumpRenderTree/chromium/WebPreferences.h b/WebKitTools/DumpRenderTree/chromium/WebPreferences.h
index fc3c114..c496b12 100644
--- a/WebKitTools/DumpRenderTree/chromium/WebPreferences.h
+++ b/WebKitTools/DumpRenderTree/chromium/WebPreferences.h
@@ -75,6 +75,7 @@ struct WebPreferences {
bool allowUniversalAccessFromFileURLs;
WebKit::WebSettings::EditingBehavior editingBehavior;
bool tabsToLinks;
+ bool hyperlinkAuditingEnabled;
bool accelerated2dCanvasEnabled;
WebPreferences() { reset(); }
diff --git a/WebKitTools/DumpRenderTree/gtk/DumpRenderTree.cpp b/WebKitTools/DumpRenderTree/gtk/DumpRenderTree.cpp
index af2e403..d6b9c34 100644
--- a/WebKitTools/DumpRenderTree/gtk/DumpRenderTree.cpp
+++ b/WebKitTools/DumpRenderTree/gtk/DumpRenderTree.cpp
@@ -336,6 +336,7 @@ static void resetDefaultsToConsistentValues()
"auto-resize-window", TRUE,
"enable-java-applet", FALSE,
"enable-plugins", TRUE,
+ "enable-hyperlink-auditing", FALSE,
"editing-behavior", WEBKIT_EDITING_BEHAVIOR_MAC,
NULL);
diff --git a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp
index b2ef716..90a04c4 100644
--- a/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp
+++ b/WebKitTools/DumpRenderTree/qt/LayoutTestControllerQt.cpp
@@ -591,6 +591,8 @@ void LayoutTestController::overridePreference(const QString& name, const QVarian
settings->setAttribute(QWebSettings::PluginsEnabled, value.toBool());
else if (name == "WebKitWebGLEnabled")
settings->setAttribute(QWebSettings::WebGLEnabled, value.toBool());
+ else if (name == "WebKitHyperlinkAuditingEnabled")
+ settings->setAttribute(QWebSettings::HyperlinkAuditingEnabled, value.toBool());
else
printf("ERROR: LayoutTestController::overridePreference() does not support the '%s' preference\n",
name.toLatin1().data());
--
WebKit Debian packaging
More information about the Pkg-webkit-commits
mailing list