WebKitHitTestResult.cpp [plain text]
#include "config.h"
#include "WebKitHitTestResult.h"
#include "WebHitTestResultData.h"
#include "WebKitHitTestResultPrivate.h"
#include <glib/gi18n-lib.h>
#include <wtf/glib/WTFGType.h>
#include <wtf/text/CString.h>
using namespace WebKit;
enum {
PROP_0,
PROP_CONTEXT,
PROP_LINK_URI,
PROP_LINK_TITLE,
PROP_LINK_LABEL,
PROP_IMAGE_URI,
PROP_MEDIA_URI
};
struct _WebKitHitTestResultPrivate {
unsigned int context;
CString linkURI;
CString linkTitle;
CString linkLabel;
CString imageURI;
CString mediaURI;
};
WEBKIT_DEFINE_TYPE(WebKitHitTestResult, webkit_hit_test_result, G_TYPE_OBJECT)
static void webkitHitTestResultGetProperty(GObject* object, guint propId, GValue* value, GParamSpec* paramSpec)
{
WebKitHitTestResult* hitTestResult = WEBKIT_HIT_TEST_RESULT(object);
switch (propId) {
case PROP_CONTEXT:
g_value_set_uint(value, webkit_hit_test_result_get_context(hitTestResult));
break;
case PROP_LINK_URI:
g_value_set_string(value, webkit_hit_test_result_get_link_uri(hitTestResult));
break;
case PROP_LINK_TITLE:
g_value_set_string(value, webkit_hit_test_result_get_link_title(hitTestResult));
break;
case PROP_LINK_LABEL:
g_value_set_string(value, webkit_hit_test_result_get_link_label(hitTestResult));
break;
case PROP_IMAGE_URI:
g_value_set_string(value, webkit_hit_test_result_get_image_uri(hitTestResult));
break;
case PROP_MEDIA_URI:
g_value_set_string(value, webkit_hit_test_result_get_media_uri(hitTestResult));
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
}
}
static void webkitHitTestResultSetProperty(GObject* object, guint propId, const GValue* value, GParamSpec* paramSpec)
{
WebKitHitTestResult* hitTestResult = WEBKIT_HIT_TEST_RESULT(object);
switch (propId) {
case PROP_CONTEXT:
hitTestResult->priv->context = g_value_get_uint(value);
break;
case PROP_LINK_URI:
hitTestResult->priv->linkURI = g_value_get_string(value);
break;
case PROP_LINK_TITLE:
hitTestResult->priv->linkTitle = g_value_get_string(value);
break;
case PROP_LINK_LABEL:
hitTestResult->priv->linkLabel = g_value_get_string(value);
break;
case PROP_IMAGE_URI:
hitTestResult->priv->imageURI = g_value_get_string(value);
break;
case PROP_MEDIA_URI:
hitTestResult->priv->mediaURI = g_value_get_string(value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, paramSpec);
}
}
static void webkit_hit_test_result_class_init(WebKitHitTestResultClass* hitTestResultClass)
{
GObjectClass* objectClass = G_OBJECT_CLASS(hitTestResultClass);
objectClass->get_property = webkitHitTestResultGetProperty;
objectClass->set_property = webkitHitTestResultSetProperty;
GParamFlags paramFlags = static_cast<GParamFlags>(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY);
g_object_class_install_property(objectClass,
PROP_CONTEXT,
g_param_spec_uint("context",
_("Context"),
_("Flags with the context of the WebKitHitTestResult"),
0, G_MAXUINT, 0,
paramFlags));
g_object_class_install_property(objectClass,
PROP_LINK_URI,
g_param_spec_string("link-uri",
_("Link URI"),
_("The link URI"),
0,
paramFlags));
g_object_class_install_property(objectClass,
PROP_LINK_TITLE,
g_param_spec_string("link-title",
_("Link Title"),
_("The link title"),
0,
paramFlags));
g_object_class_install_property(objectClass,
PROP_LINK_LABEL,
g_param_spec_string("link-label",
_("Link Label"),
_("The link label"),
0,
paramFlags));
g_object_class_install_property(objectClass,
PROP_IMAGE_URI,
g_param_spec_string("image-uri",
_("Image URI"),
_("The image URI"),
0,
paramFlags));
g_object_class_install_property(objectClass,
PROP_MEDIA_URI,
g_param_spec_string("media-uri",
_("Media URI"),
_("The media URI"),
0,
paramFlags));
}
WebKitHitTestResult* webkitHitTestResultCreate(const WebHitTestResultData& hitTestResult)
{
unsigned context = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT;
if (!hitTestResult.absoluteLinkURL.isEmpty())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK;
if (!hitTestResult.absoluteImageURL.isEmpty())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE;
if (!hitTestResult.absoluteMediaURL.isEmpty())
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA;
if (hitTestResult.isContentEditable)
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE;
if (hitTestResult.isScrollbar != WebHitTestResultData::IsScrollbar::No)
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR;
if (hitTestResult.isSelected)
context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION;
return WEBKIT_HIT_TEST_RESULT(g_object_new(WEBKIT_TYPE_HIT_TEST_RESULT,
"context", context,
"link-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK ? hitTestResult.absoluteLinkURL.utf8().data() : nullptr,
"image-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE ? hitTestResult.absoluteImageURL.utf8().data() : nullptr,
"media-uri", context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA ? hitTestResult.absoluteMediaURL.utf8().data() : nullptr,
"link-title", !hitTestResult.linkTitle.isEmpty() ? hitTestResult.linkTitle.utf8().data() : nullptr,
"link-label", !hitTestResult.linkLabel.isEmpty() ? hitTestResult.linkLabel.utf8().data() : nullptr,
nullptr));
}
static bool stringIsEqualToCString(const String& string, const CString& cString)
{
return ((string.isEmpty() && cString.isNull()) || (string.utf8() == cString));
}
bool webkitHitTestResultCompare(WebKitHitTestResult* hitTestResult, const WebHitTestResultData& webHitTestResult)
{
WebKitHitTestResultPrivate* priv = hitTestResult->priv;
bool isScrollbar = webHitTestResult.isScrollbar != WebHitTestResultData::IsScrollbar::No;
return webHitTestResult.isContentEditable == webkit_hit_test_result_context_is_editable(hitTestResult)
&& isScrollbar == webkit_hit_test_result_context_is_scrollbar(hitTestResult)
&& webHitTestResult.isSelected == webkit_hit_test_result_context_is_selection(hitTestResult)
&& stringIsEqualToCString(webHitTestResult.absoluteLinkURL, priv->linkURI)
&& stringIsEqualToCString(webHitTestResult.linkTitle, priv->linkTitle)
&& stringIsEqualToCString(webHitTestResult.linkLabel, priv->linkLabel)
&& stringIsEqualToCString(webHitTestResult.absoluteImageURL, priv->imageURI)
&& stringIsEqualToCString(webHitTestResult.absoluteMediaURL, priv->mediaURI);
}
guint webkit_hit_test_result_get_context(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), 0);
return hitTestResult->priv->context;
}
gboolean webkit_hit_test_result_context_is_link(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), FALSE);
return hitTestResult->priv->context & WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK;
}
gboolean webkit_hit_test_result_context_is_image(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), FALSE);
return hitTestResult->priv->context & WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE;
}
gboolean webkit_hit_test_result_context_is_media(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), FALSE);
return hitTestResult->priv->context & WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA;
}
gboolean webkit_hit_test_result_context_is_editable(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), FALSE);
return hitTestResult->priv->context & WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE;
}
gboolean webkit_hit_test_result_context_is_selection(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), FALSE);
return hitTestResult->priv->context & WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION;
}
const gchar* webkit_hit_test_result_get_link_uri(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), 0);
return hitTestResult->priv->linkURI.data();
}
const gchar* webkit_hit_test_result_get_link_title(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), 0);
return hitTestResult->priv->linkTitle.data();
}
const gchar* webkit_hit_test_result_get_link_label(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), 0);
return hitTestResult->priv->linkLabel.data();
}
const gchar* webkit_hit_test_result_get_image_uri(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), 0);
return hitTestResult->priv->imageURI.data();
}
const gchar* webkit_hit_test_result_get_media_uri(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), 0);
return hitTestResult->priv->mediaURI.data();
}
gboolean webkit_hit_test_result_context_is_scrollbar(WebKitHitTestResult* hitTestResult)
{
g_return_val_if_fail(WEBKIT_IS_HIT_TEST_RESULT(hitTestResult), FALSE);
return hitTestResult->priv->context & WEBKIT_HIT_TEST_RESULT_CONTEXT_SCROLLBAR;
}