aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/Makefile.am3
-rw-r--r--doc/rounding-errors.doc15
-rw-r--r--dpi/cookies.c10
-rw-r--r--dw/fltkimgbuf.cc22
-rw-r--r--dw/fltkviewport.cc2
-rw-r--r--dw/imgrenderer.hh6
-rw-r--r--dw/layout.cc24
-rw-r--r--dw/style.cc32
-rw-r--r--dw/style.hh4
-rw-r--r--dw/table.cc2
-rw-r--r--lout/container.cc8
-rw-r--r--lout/container.hh2
-rw-r--r--lout/debug.hh4
-rw-r--r--src/css.hh7
-rw-r--r--src/cssparser.cc2
-rw-r--r--src/form.cc2
-rw-r--r--src/html.cc254
-rw-r--r--src/html_common.hh9
-rw-r--r--src/styleengine.cc2
-rw-r--r--src/url.c10
-rw-r--r--test/dw_image_background.cc2
21 files changed, 290 insertions, 132 deletions
diff --git a/doc/Makefile.am b/doc/Makefile.am
index dad95629..d48e3e73 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -14,6 +14,7 @@ EXTRA_DIST = \
fltk-problems.doc \
rounding-errors.doc \
uml-legend.doc \
+ dw-line-breaking.doc \
dw-example-screenshot.png \
dw-viewport-without-scrollbar.png \
dw-viewport-with-scrollbar.png \
@@ -26,6 +27,7 @@ EXTRA_DIST = \
dw-textblock-collapsing-spaces-1-2.png \
dw-textblock-collapsing-spaces-2-1.png \
dw-textblock-collapsing-spaces-2-2.png \
+ not-so-simple-container.png \
Cache.txt \
Cookies.txt \
Dillo.txt \
@@ -37,6 +39,7 @@ EXTRA_DIST = \
NC_design.txt \
Selection.txt \
Dpid.txt \
+ CCCwork.txt \
README \
dillo.1.in
diff --git a/doc/rounding-errors.doc b/doc/rounding-errors.doc
index 133a1fe5..a442033e 100644
--- a/doc/rounding-errors.doc
+++ b/doc/rounding-errors.doc
@@ -19,6 +19,17 @@ avoided by transforming the formula into
Of corse, when all \f$y_i\f$ are calculated in a sequence,
\f$\sum_{j=0}^{j=i} x_j\f$ and \f$\sum_{j=0}^{j=i-1} y_j\f$ can be
-accumulated in the same loop.
+accumulated in the same loop. Regard this as sample:
-*/ \ No newline at end of file
+\code
+int n, x[n], a, b; // Should all be initialized.
+int y[n], cumX = 0, cumY = 0;
+
+for (int i = 0; i < n; i++) {
+ cumX += x[i]
+ y[i] = (cumX * a) / b - cumY;
+ cumY += y[i];
+}
+\endcode
+
+*/
diff --git a/dpi/cookies.c b/dpi/cookies.c
index 32f2d5b9..6c5e958e 100644
--- a/dpi/cookies.c
+++ b/dpi/cookies.c
@@ -1042,14 +1042,14 @@ static uint_t Cookies_internal_dots_required(const char *host)
if (tld_len > 0) {
/* These TLDs were chosen by examining the current publicsuffix list
- * in September 2013 and picking out those where it was simplest for
+ * in February 2014 and picking out those where it was simplest for
* them to describe the situation by beginning with a "*.[tld]" rule
* or every rule was "[something].[tld]".
*/
- const char *const tlds[] = {"au","bd","bn","ck","cy","er","et","fj",
- "fk","gn","gu","il","jm","ke","kh","kp",
- "kw","lb","lr","mm","mt","mz","ni","np",
- "nz","pg","tr","uk","ye","za","zm","zw"};
+ const char *const tlds[] = {"bd","bn","ck","cy","er","et","fj","fk",
+ "gu","il","jm","ke","kh","kw","mm","mz",
+ "ni","np","nz","pg","tr","uk","ye","za",
+ "zm","zw"};
uint_t i, tld_num = sizeof(tlds) / sizeof(tlds[0]);
for (i = 0; i < tld_num; i++) {
diff --git a/dw/fltkimgbuf.cc b/dw/fltkimgbuf.cc
index e537c761..26b46969 100644
--- a/dw/fltkimgbuf.cc
+++ b/dw/fltkimgbuf.cc
@@ -52,10 +52,10 @@ uchar *FltkImgbuf::findGammaCorrectionTable (double gamma)
}
_MSG("Creating new table for gamma = %g\n", gamma);
-
+
GammaCorrectionTable *gct = new GammaCorrectionTable();
gct->gamma = gamma;
-
+
for (int i = 0; i < 256; i++)
gct->map[i] = 255 * pow((double)i / 255, gamma);
@@ -107,7 +107,7 @@ void FltkImgbuf::init (Type type, int width, int height, double gamma,
} else if (width > MAX_WIDTH) {
// Too large dimensions cause dangerous overflow errors, so we
// limit dimensions to harmless values.
- //
+ //
// Example: 65535 * 65536 / 65536 (see scaling below) results in
// the negative value -1.
@@ -140,11 +140,11 @@ void FltkImgbuf::init (Type type, int width, int height, double gamma,
rawdata = new uchar[bpp * width * height];
// Set light-gray as interim background color.
memset(rawdata, 222, width*height*bpp);
-
+
refCount = 1;
deleteOnUnref = true;
copiedRows = new lout::misc::BitSet (height);
-
+
// The list is only used for root buffers.
if (isRoot())
scaledBuffers = new lout::container::typed::List <FltkImgbuf> (true);
@@ -308,15 +308,15 @@ inline void FltkImgbuf::scaleBuffer (const core::byte *src, int srcWidth,
int v[bpp];
for(int i = 0; i < bpp; i++)
v[i] = 0;
-
+
for(int xo = xo1; xo < xo2; xo++)
for(int yo = yo1; yo < yo2; yo++) {
const core::byte *ps = src + bpp * (yo * srcWidth + xo);
for(int i = 0; i < bpp; i++)
- v[i] +=
+ v[i] +=
(scaleMode == BEAUTIFUL_GAMMA ? gammaMap2[ps[i]] : ps[i]);
}
-
+
core::byte *pd = dest + bpp * (y * destWidth + x);
for(int i = 0; i < bpp; i++)
pd[i] =
@@ -332,7 +332,7 @@ void FltkImgbuf::copyRow (int row, const core::byte *data)
// Flag the row done and copy its data.
copiedRows->set (row, true);
memcpy(rawdata + row * width * bpp, data, width * bpp);
-
+
// Update all the scaled buffers of this root image.
for (Iterator <FltkImgbuf> it = scaledBuffers->iterator();
it.hasNext(); ) {
@@ -417,7 +417,7 @@ void FltkImgbuf::getRowArea (int row, dw::core::Rectangle *area)
// scaled buffer
int sr1 = scaledY (row);
int sr2 = scaledY (row + 1);
-
+
area->x = 0;
area->y = sr1;
area->width = width;
@@ -533,7 +533,7 @@ int FltkImgbuf::scaledY(int ySrc)
int FltkImgbuf::backscaledY(int yScaled)
{
assert (root != NULL);
-
+
// Notice that rounding errors because of integers do not play a
// role. This method cannot be the exact inverse of scaledY, since
// scaleY is not bijective, and so not invertible. Instead, both
diff --git a/dw/fltkviewport.cc b/dw/fltkviewport.cc
index 9603c508..707c0bd7 100644
--- a/dw/fltkviewport.cc
+++ b/dw/fltkviewport.cc
@@ -393,7 +393,7 @@ void FltkViewport::scrollTo (int x, int y)
}
/* multiple calls to scroll can happen before a redraw occurs.
- * scrollDX / scrollDY can therefore be non-zero here.
+ * scrollDX and scrollDY can therefore be non-zero here.
*/
updateCanvasWidgets (x - scrollX, y - scrollY);
scrollDX += x - scrollX;
diff --git a/dw/imgrenderer.hh b/dw/imgrenderer.hh
index 325a1998..e3b5e95e 100644
--- a/dw/imgrenderer.hh
+++ b/dw/imgrenderer.hh
@@ -18,14 +18,14 @@ class ImgRenderer
public:
virtual ~ImgRenderer () { }
- /**
+ /**
* \brief Called, when an image buffer is attached.
*
* This is typically the case when all meta data (size, depth) has been read.
*/
virtual void setBuffer (core::Imgbuf *buffer, bool resize = false) = 0;
- /**
+ /**
* \brief Called, when data from a row is available and has been copied into
* the image buffer.
*
@@ -40,7 +40,7 @@ public:
* limit the number of draws.
*/
virtual void finish () = 0;
-
+
/**
* \brief Called, when there are problems with the retrieval of image data.
*
diff --git a/dw/layout.cc b/dw/layout.cc
index d83b2e8a..6f2e8d8b 100644
--- a/dw/layout.cc
+++ b/dw/layout.cc
@@ -88,7 +88,7 @@ void Layout::LayoutImgRenderer::draw (int x, int y, int width, int height)
{
layout->queueDraw (x, y, width, height);
}
-
+
// ----------------------------------------------------------------------
void Layout::Receiver::canvasSizeChanged (int width, int ascent, int descent)
@@ -753,10 +753,10 @@ void Layout::setBgImage (style::StyleImage *bgImage,
if (bgImage)
bgImage->ref ();
-
+
if (this->bgImage)
this->bgImage->unref ();
-
+
this->bgImage = bgImage;
this->bgRepeat = bgRepeat;
this->bgAttachment = bgAttachment;
@@ -784,33 +784,33 @@ void Layout::resizeIdle ()
// Reset already here, since in this function, queueResize() may be
// called again.
resizeIdleId = -1;
-
+
if (topLevel) {
Requisition requisition;
Allocation allocation;
-
+
topLevel->sizeRequest (&requisition);
-
+
allocation.x = allocation.y = 0;
allocation.width = requisition.width;
allocation.ascent = requisition.ascent;
allocation.descent = requisition.descent;
topLevel->sizeAllocate (&allocation);
-
+
canvasWidth = requisition.width;
canvasAscent = requisition.ascent;
canvasDescent = requisition.descent;
-
+
emitter.emitCanvasSizeChanged (canvasWidth, canvasAscent, canvasDescent);
-
+
// Tell the view about the new world size.
view->setCanvasSize (canvasWidth, canvasAscent, canvasDescent);
// view->queueDrawTotal (false);
-
+
if (usesViewport) {
int currHThickness = currHScrollbarThickness();
int currVThickness = currVScrollbarThickness();
-
+
if (!canvasHeightGreater &&
canvasAscent + canvasDescent
> viewportHeight - currHThickness) {
@@ -818,7 +818,7 @@ void Layout::resizeIdle ()
setSizeHints ();
/* May queue a new resize. */
}
-
+
// Set viewport sizes.
view->setViewportSize (viewportWidth, viewportHeight,
currHThickness, currVThickness);
diff --git a/dw/style.cc b/dw/style.cc
index 3a01d903..8ec230a1 100644
--- a/dw/style.cc
+++ b/dw/style.cc
@@ -546,7 +546,7 @@ void StyleImage::StyleImgRenderer::drawRow (int row)
int w = image->imgbufSrc->getRootWidth ();
int h = image->imgbufSrc->getRootHeight ();
-
+
for (int x = 0; x < image->tilesX; x++)
for (int y = 0; y < image->tilesX; y++)
image->imgbufSrc->copyTo (image->imgbufTiled, x * w, y * h,
@@ -602,20 +602,20 @@ void StyleImage::ExternalImgRenderer::drawRow (int row)
StyleImage *backgroundImage;
if (readyToDraw () && (backgroundImage = getBackgroundImage ())) {
// All single rows are drawn.
-
+
Imgbuf *imgbuf = backgroundImage->getImgbufSrc();
int imgWidth = imgbuf->getRootWidth ();
int imgHeight = imgbuf->getRootHeight ();
-
+
int x, y, width, height;
getBgArea (&x, &y, &width, &height);
-
+
int xRef, yRef, widthRef, heightRef;
getRefArea (&xRef, &yRef, &widthRef, &heightRef);
-
+
bool repeatX, repeatY, doDraw;
int origX, origY, tileX1, tileX2, tileY1, tileY2;
-
+
calcBackgroundRelatedValues (backgroundImage,
getBackgroundRepeat (),
getBackgroundAttachment (),
@@ -635,7 +635,7 @@ void StyleImage::ExternalImgRenderer::drawRow (int row)
for (int tileY = tileY1; tileY <= tileY2; tileY++) {
int x1 = misc::max (origX + tileX1 * imgWidth, x);
int x2 = misc::min (origX + (tileX2 + 1) * imgWidth, x + width);
-
+
int yt = origY + tileY * imgHeight + row;
if (yt >= y && yt < y + height)
draw (x1, yt, x2 - x1, 1);
@@ -1196,7 +1196,7 @@ void drawBackground (View *view, Layout *layout, Rectangle *area,
Color::SHADING_INVERSE : Color::SHADING_NORMAL,
true, intersection.x, intersection.y,
intersection.width, intersection.height);
-
+
if (bgImage)
drawBackgroundImage (view, style->backgroundImage,
style->backgroundRepeat,
@@ -1206,7 +1206,7 @@ void drawBackground (View *view, Layout *layout, Rectangle *area,
intersection.x, intersection.y,
intersection.width, intersection.height,
xRef, yRef, widthRef, heightRef);
-
+
}
}
}
@@ -1225,7 +1225,7 @@ void drawBackgroundImage (View *view, StyleImage *backgroundImage,
bool repeatX, repeatY, doDraw;
int origX, origY, tileX1, tileX2, tileY1, tileY2;
-
+
calcBackgroundRelatedValues (backgroundImage, backgroundRepeat,
backgroundAttachment, backgroundPositionX,
backgroundPositionY, x, y, width, height,
@@ -1258,8 +1258,8 @@ void drawBackgroundImage (View *view, StyleImage *backgroundImage,
int yt = origY + tileY * imgHeightS;
int y1 = misc::max (yt, y);
int y2 = misc::min (yt + imgHeightT, y + height);
-
- view->drawImage (imgbufT, xt, yt, x1 - xt, y1 - yt,
+
+ view->drawImage (imgbufT, xt, yt, x1 - xt, y1 - yt,
x2 - x1, y2 - y1);
}
}
@@ -1285,7 +1285,7 @@ void calcBackgroundRelatedValues (StyleImage *backgroundImage,
backgroundRepeat == BACKGROUND_REPEAT_X;
*repeatY = backgroundRepeat == BACKGROUND_REPEAT ||
backgroundRepeat == BACKGROUND_REPEAT_Y;
-
+
*origX = xRef +
(isPerLength (backgroundPositionX) ?
multiplyWithPerLength (widthRef - imgWidth, backgroundPositionX) :
@@ -1294,7 +1294,7 @@ void calcBackgroundRelatedValues (StyleImage *backgroundImage,
(isPerLength (backgroundPositionY) ?
multiplyWithPerLength (heightRef - imgHeight, backgroundPositionY) :
absLengthVal (backgroundPositionY));
-
+
*tileX1 = xDraw < *origX ?
- (*origX - xDraw + imgWidth - 1) / imgWidth :
(xDraw - *origX) / imgWidth;
@@ -1307,7 +1307,7 @@ void calcBackgroundRelatedValues (StyleImage *backgroundImage,
*tileY2 = *origY < yDraw + heightDraw ?
(yDraw + heightDraw - *origY - 1) / imgHeight :
- (*origY - (yDraw + heightDraw) + imgHeight - 1) / imgHeight;
-
+
*doDraw = true;
if (!*repeatX) {
// Only center tile (tileX = 0) is drawn, ...
@@ -1318,7 +1318,7 @@ void calcBackgroundRelatedValues (StyleImage *backgroundImage,
// ... but is not visible.
*doDraw = false;
}
-
+
if (!*repeatY) {
// Analogue.
if (*tileY1 <= 0 && *tileY2 >= 0)
diff --git a/dw/style.hh b/dw/style.hh
index 7127b6db..e0ce9d89 100644
--- a/dw/style.hh
+++ b/dw/style.hh
@@ -448,7 +448,7 @@ inline int multiplyWithRelLength(int x, Length l) {
return x * relLengthVal(l);
}
-
+
enum {
/** \brief Represents "auto" lengths. */
LENGTH_AUTO = 0
@@ -813,7 +813,7 @@ public:
{
public:
void getPaddingArea (int *x, int *y, int *width, int *height);
-
+
StyleImage *getBackgroundImage ();
BackgroundRepeat getBackgroundRepeat ();
BackgroundAttachment getBackgroundAttachment ();
diff --git a/dw/table.cc b/dw/table.cc
index 6fe0da8b..b6f7209b 100644
--- a/dw/table.cc
+++ b/dw/table.cc
@@ -1072,7 +1072,7 @@ void Table::apportion_percentages2(int totalWidth, int forceTotalWidth)
for (int col = 0; col < numCols; col++) {
if (core::style::isPerLength (colPercents->get(col))) {
// This could cause rounding errors:
- //
+ //
// int d =
// core::dw::multiplyWithPerLength (extraWidth,
// colPercents->get(col))
diff --git a/lout/container.cc b/lout/container.cc
index de36a6f7..de7b93e2 100644
--- a/lout/container.cc
+++ b/lout/container.cc
@@ -208,7 +208,7 @@ int Vector::bsearch(Object *key, bool mustExist)
// new implementation.
if (numElements == 0)
return mustExist ? -1 : 0;
-
+
int high = numElements - 1, low = 0;
while (true) {
@@ -230,7 +230,7 @@ int Vector::bsearch(Object *key, bool mustExist)
low = index + 1;
}
}
-
+
/*
void *result = ::bsearch (&key, array, numElements, sizeof (Object*),
@@ -562,7 +562,7 @@ HashTable::~HashTable()
PRINTF ("- deleting value: %s\n", value->toString());
delete value;
}
- }
+ }
}
}
}
@@ -596,7 +596,7 @@ void HashTable::intoStringBuffer(misc::StringBuffer *sb)
node->object->intoStringBuffer(sb);
sb->append(" => ");
-
+
Object *value = ((KeyValuePair*)node)->value;
if (value)
value->intoStringBuffer(sb);
diff --git a/lout/container.hh b/lout/container.hh
index c87eb10c..09c8ffc0 100644
--- a/lout/container.hh
+++ b/lout/container.hh
@@ -114,7 +114,7 @@ private:
private:
Vector *vector;
int index;
-
+
public:
VectorIterator(Vector *vector) { this->vector = vector; index = -1; }
bool hasNext();
diff --git a/lout/debug.hh b/lout/debug.hh
index 40e27b13..083234f8 100644
--- a/lout/debug.hh
+++ b/lout/debug.hh
@@ -170,8 +170,8 @@
#define DBG_OBJ_MSG(aspect, prio, msg)
#define DBG_OBJ_MSGF(aspect, prio, fmt, ...)
-#define DBG_OBJ_MSG_START(obj)
-#define DBG_OBJ_MSG_END(obj)
+#define DBG_OBJ_MSG_START()
+#define DBG_OBJ_MSG_END()
#define DBG_OBJ_CREATE(klass)
#define DBG_OBJ_DELETE()
#define DBG_OBJ_BASECLASS(klass)
diff --git a/src/css.hh b/src/css.hh
index 938bc020..239bffaf 100644
--- a/src/css.hh
+++ b/src/css.hh
@@ -474,10 +474,11 @@ class CssStyleSheet {
<lout::object::ConstString, RuleList > (true, true, 256) {};
};
- static const int ntags = 90 + 10; // \todo don't hardcode
+ static const int ntags = 90 + 14; // \todo don't hardcode
/* 90 is the full number of html4 elements, including those which we have
- * implemented. From html 5, let's add: article, header, footer, mark,
- * nav, section, aside, figure, figcaption, wbr.
+ * implemented. From html5, let's add: article, header, footer, mark,
+ * nav, section, aside, figure, figcaption, wbr, audio, video, source,
+ * embed.
*/
RuleList elementTable[ntags], anyTable;
diff --git a/src/cssparser.cc b/src/cssparser.cc
index be5032d6..fcff7688 100644
--- a/src/cssparser.cc
+++ b/src/cssparser.cc
@@ -716,7 +716,7 @@ bool CssParser::tokenMatchesProperty(CssPropertyName prop, CssValueType *type)
dStrAsciiCasecmp(tval, "right") == 0 ||
dStrAsciiCasecmp(tval, "top") == 0 ||
dStrAsciiCasecmp(tval, "bottom") == 0))
- return true;
+ return true;
// Fall Through (lenght and percentage)
case CSS_TYPE_LENGTH_PERCENTAGE:
case CSS_TYPE_LENGTH_PERCENTAGE_NUMBER:
diff --git a/src/form.cc b/src/form.cc
index c5bb10af..07c12815 100644
--- a/src/form.cc
+++ b/src/form.cc
@@ -2003,7 +2003,7 @@ static Embed *Html_input_image(DilloHtml *html, const char *tag, int tagsize)
html->styleEngine->setPseudoLink ();
/* create new image and add it to the button */
- a_Html_image_attrs(html, tag, tagsize);
+ a_Html_common_image_attrs(html, tag, tagsize);
if ((Image = a_Html_image_new(html, tag, tagsize))) {
// At this point, we know that Image->ir represents an image
// widget. Notice that the order of the casts matters, because
diff --git a/src/html.cc b/src/html.cc
index 1257c102..4f5d51b5 100644
--- a/src/html.cc
+++ b/src/html.cc
@@ -1382,7 +1382,7 @@ static void Html_tag_cleanup_at_close(DilloHtml *html, int new_idx)
* by closing them before opening another.
* This is not an HTML SPEC restriction , but it avoids lots of trouble
* inside dillo (concurrent inputs), and makes almost no sense to have.
- */
+ */
static void Html_tag_cleanup_nested_inputs(DilloHtml *html, int new_idx)
{
static int i_BUTTON = a_Html_tag_index("button"),
@@ -1695,9 +1695,9 @@ static void Html_tag_close_head(DilloHtml *html)
/* match for the well formed start of HEAD section */
if (html->Num_TITLE == 0)
BUG_MSG("HEAD section lacks the TITLE element\n");
-
+
html->InFlags &= ~IN_HEAD;
-
+
/* charset is already set, load remote stylesheets now */
for (int i = 0; i < html->cssUrls->size(); i++) {
a_Html_load_stylesheet(html, html->cssUrls->get(i));
@@ -2083,13 +2083,13 @@ static void Html_tag_open_abbr(DilloHtml *html, const char *tag, int tagsize)
/*
* Read image-associated tag attributes and create new image.
*/
-void a_Html_image_attrs(DilloHtml *html, const char *tag, int tagsize)
+void a_Html_common_image_attrs(DilloHtml *html, const char *tag, int tagsize)
{
char *width_ptr, *height_ptr;
const char *attrbuf;
CssLength l_w = CSS_CREATE_LENGTH(0.0, CSS_LENGTH_TYPE_AUTO);
CssLength l_h = CSS_CREATE_LENGTH(0.0, CSS_LENGTH_TYPE_AUTO);
- int space, border, w = 0, h = 0;
+ int w = 0, h = 0;
if (prefs.show_tooltip &&
(attrbuf = a_Html_get_attr(html, tag, tagsize, "title"))) {
@@ -2125,7 +2125,8 @@ void a_Html_image_attrs(DilloHtml *html, const char *tag, int tagsize)
dFree(width_ptr);
dFree(height_ptr);
width_ptr = height_ptr = NULL;
- MSG("a_Html_image_attrs: suspicious image size request %d x %d\n", w, h);
+ MSG("a_Html_common_image_attrs: suspicious image size request %d x %d\n",
+ w, h);
} else {
if (CSS_LENGTH_TYPE(l_w) != CSS_LENGTH_TYPE_AUTO)
html->styleEngine->setNonCssHint (CSS_PROPERTY_WIDTH,
@@ -2142,55 +2143,6 @@ void a_Html_image_attrs(DilloHtml *html, const char *tag, int tagsize)
[...]
*/
- /* Spacing to the left and right */
- if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "hspace"))) {
- space = strtol(attrbuf, NULL, 10);
- if (space > 0) {
- space = CSS_CREATE_LENGTH(space, CSS_LENGTH_TYPE_PX);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_LEFT,
- CSS_TYPE_LENGTH_PERCENTAGE, space);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_RIGHT,
- CSS_TYPE_LENGTH_PERCENTAGE, space);
- }
- }
-
- /* Spacing at the top and bottom */
- if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "vspace"))) {
- space = strtol(attrbuf, NULL, 10);
- if (space > 0) {
- space = CSS_CREATE_LENGTH(space, CSS_LENGTH_TYPE_PX);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_TOP,
- CSS_TYPE_LENGTH_PERCENTAGE, space);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_BOTTOM,
- CSS_TYPE_LENGTH_PERCENTAGE, space);
- }
- }
-
- /* Border */
- if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "border"))) {
- border = strtol(attrbuf, NULL, 10);
- if (border >= 0) {
- border = CSS_CREATE_LENGTH(border, CSS_LENGTH_TYPE_PX);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_TOP_WIDTH,
- CSS_TYPE_LENGTH_PERCENTAGE, border);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
- CSS_TYPE_LENGTH_PERCENTAGE, border);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_LEFT_WIDTH,
- CSS_TYPE_LENGTH_PERCENTAGE, border);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_RIGHT_WIDTH,
- CSS_TYPE_LENGTH_PERCENTAGE, border);
-
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_TOP_STYLE,
- CSS_TYPE_ENUM, BORDER_SOLID);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_BOTTOM_STYLE,
- CSS_TYPE_ENUM, BORDER_SOLID);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_LEFT_STYLE,
- CSS_TYPE_ENUM, BORDER_SOLID);
- html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_RIGHT_STYLE,
- CSS_TYPE_ENUM, BORDER_SOLID);
- }
- }
-
/* x_img is an index to a list of {url,image} pairs.
* We know a_Html_image_new() will use size() as its next index */
html->styleEngine->setNonCssHint (PROPERTY_X_IMG, CSS_TYPE_INTEGER,
@@ -2271,7 +2223,60 @@ static bool Html_load_image(BrowserWindow *bw, DilloUrl *url,
static void Html_tag_open_img(DilloHtml *html, const char *tag, int tagsize)
{
- a_Html_image_attrs(html, tag, tagsize);
+ int space, border;
+ const char *attrbuf;
+
+ a_Html_common_image_attrs(html, tag, tagsize);
+
+ /* Spacing to the left and right */
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "hspace"))) {
+ space = strtol(attrbuf, NULL, 10);
+ if (space > 0) {
+ space = CSS_CREATE_LENGTH(space, CSS_LENGTH_TYPE_PX);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_LEFT,
+ CSS_TYPE_LENGTH_PERCENTAGE, space);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_RIGHT,
+ CSS_TYPE_LENGTH_PERCENTAGE, space);
+ }
+ }
+
+ /* Spacing at the top and bottom */
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "vspace"))) {
+ space = strtol(attrbuf, NULL, 10);
+ if (space > 0) {
+ space = CSS_CREATE_LENGTH(space, CSS_LENGTH_TYPE_PX);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_TOP,
+ CSS_TYPE_LENGTH_PERCENTAGE, space);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_MARGIN_BOTTOM,
+ CSS_TYPE_LENGTH_PERCENTAGE, space);
+ }
+ }
+
+ /* Border */
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "border"))) {
+ border = strtol(attrbuf, NULL, 10);
+ if (border >= 0) {
+ border = CSS_CREATE_LENGTH(border, CSS_LENGTH_TYPE_PX);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_TOP_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, border);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_BOTTOM_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, border);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_LEFT_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, border);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_RIGHT_WIDTH,
+ CSS_TYPE_LENGTH_PERCENTAGE, border);
+
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_TOP_STYLE,
+ CSS_TYPE_ENUM, BORDER_SOLID);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_BOTTOM_STYLE,
+ CSS_TYPE_ENUM, BORDER_SOLID);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_LEFT_STYLE,
+ CSS_TYPE_ENUM, BORDER_SOLID);
+ html->styleEngine->setNonCssHint (CSS_PROPERTY_BORDER_RIGHT_STYLE,
+ CSS_TYPE_ENUM, BORDER_SOLID);
+ }
+ }
+
}
/*
@@ -2515,6 +2520,139 @@ static void Html_tag_open_object(DilloHtml *html, const char *tag, int tagsize)
}
/*
+ * <VIDEO>
+ * Provide a link to the video.
+ */
+static void Html_tag_open_video(DilloHtml *html, const char *tag, int tagsize)
+{
+ DilloUrl *url;
+ const char *attrbuf;
+
+ if (html->InFlags & IN_MEDIA) {
+ MSG("<video> not handled when already inside a media element.\n");
+ return;
+ }
+ /* TODO: poster attr */
+
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "src"))) {
+ url = a_Html_url_new(html, attrbuf, NULL, 0);
+ dReturn_if_fail ( url != NULL );
+
+ if (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached) {
+ html->styleEngine->setPseudoVisited ();
+ } else {
+ html->styleEngine->setPseudoLink ();
+ }
+
+ html->styleEngine->setNonCssHint(PROPERTY_X_LINK, CSS_TYPE_INTEGER,
+ Html_set_new_link(html, &url));
+
+ HT2TB(html)->addText("[VIDEO]", html->wordStyle ());
+ }
+ html->InFlags |= IN_MEDIA;
+}
+
+/*
+ * <AUDIO>
+ * Provide a link to the audio.
+ */
+static void Html_tag_open_audio(DilloHtml *html, const char *tag, int tagsize)
+{
+ DilloUrl *url;
+ const char *attrbuf;
+
+ if (html->InFlags & IN_MEDIA) {
+ MSG("<audio> not handled when already inside a media element.\n");
+ return;
+ }
+
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "src"))) {
+ url = a_Html_url_new(html, attrbuf, NULL, 0);
+ dReturn_if_fail ( url != NULL );
+
+ if (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached) {
+ html->styleEngine->setPseudoVisited ();
+ } else {
+ html->styleEngine->setPseudoLink ();
+ }
+
+ html->styleEngine->setNonCssHint(PROPERTY_X_LINK, CSS_TYPE_INTEGER,
+ Html_set_new_link(html, &url));
+
+ HT2TB(html)->addText("[AUDIO]", html->wordStyle ());
+ }
+ html->InFlags |= IN_MEDIA;
+}
+
+/*
+ * <SOURCE>
+ * Media resource; provide a link to its address.
+ */
+static void Html_tag_open_source(DilloHtml *html, const char *tag,
+ int tagsize)
+{
+ const char *attrbuf;
+
+ if (!(html->InFlags & IN_MEDIA)) {
+ BUG_MSG("<source> element not inside a media element.\n");
+ return;
+ }
+ if (!(attrbuf = a_Html_get_attr(html, tag, tagsize, "src"))) {
+ BUG_MSG("src attribute is required in <source> element.\n");
+ return;
+ } else {
+ DilloUrl *url = a_Html_url_new(html, attrbuf, NULL, 0);
+
+ dReturn_if_fail ( url != NULL );
+
+ if (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached) {
+ html->styleEngine->setPseudoVisited ();
+ } else {
+ html->styleEngine->setPseudoLink ();
+ }
+
+ html->styleEngine->setNonCssHint(PROPERTY_X_LINK, CSS_TYPE_INTEGER,
+ Html_set_new_link(html, &url));
+
+ HT2TB(html)->addText("[MEDIA SOURCE]", html->wordStyle ());
+ }
+}
+
+/*
+ * Media (AUDIO/VIDEO) close function
+ */
+static void Html_tag_close_media(DilloHtml *html)
+{
+ html->InFlags &= ~IN_MEDIA;
+}
+
+/*
+ * <EMBED>
+ * Provide a link to embedded content.
+ */
+static void Html_tag_open_embed(DilloHtml *html, const char *tag, int tagsize)
+{
+ const char *attrbuf;
+
+ if ((attrbuf = a_Html_get_attr(html, tag, tagsize, "src"))) {
+ DilloUrl *url = a_Html_url_new(html, attrbuf, NULL, 0);
+
+ dReturn_if_fail ( url != NULL );
+
+ if (a_Capi_get_flags_with_redirection(url) & CAPI_IsCached) {
+ html->styleEngine->setPseudoVisited ();
+ } else {
+ html->styleEngine->setPseudoLink ();
+ }
+
+ html->styleEngine->setNonCssHint(PROPERTY_X_LINK, CSS_TYPE_INTEGER,
+ Html_set_new_link(html, &url));
+
+ HT2TB(html)->addText("[EMBED]", html->wordStyle ());
+ }
+}
+
+/*
* Test and extract the link from a javascript instruction.
*/
static const char* Html_get_javascript_link(DilloHtml *html)
@@ -3279,6 +3417,7 @@ const TagInfo Tags[] = {
NULL},
{"article", B8(011110),'R',2, Html_tag_open_default, NULL, NULL},
{"aside", B8(011110),'R',2, Html_tag_open_default, NULL, NULL},
+ {"audio", B8(011101),'R',2, Html_tag_open_audio, NULL, Html_tag_close_media},
{"b", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
{"base", B8(100001),'F',0, Html_tag_open_base, NULL, NULL},
/* basefont 010001 -- obsolete in HTML5 */
@@ -3305,6 +3444,7 @@ const TagInfo Tags[] = {
{"dl", B8(011010),'R',2, Html_tag_open_dl, NULL, Html_tag_close_par},
{"dt", B8(010110),'O',1, Html_tag_open_dt, NULL, Html_tag_close_par},
{"em", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"embed", B8(010001),'F',0, Html_tag_open_embed, NULL, NULL},
/* fieldset */
{"figcaption", B8(011110),'R',2, Html_tag_open_default, NULL, NULL},
{"figure", B8(011110),'R',2, Html_tag_open_default, NULL, NULL},
@@ -3363,6 +3503,7 @@ const TagInfo Tags[] = {
{"section", B8(011110),'R',2, Html_tag_open_default, NULL, NULL},
{"select", B8(010101),'R',2, Html_tag_open_select,NULL,Html_tag_close_select},
{"small", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"source", B8(010001),'F',0, Html_tag_open_source, NULL, NULL},
{"span", B8(010101),'R',2, Html_tag_open_span, NULL, NULL},
{"strike", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
{"strong", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
@@ -3387,6 +3528,7 @@ const TagInfo Tags[] = {
{"u", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
{"ul", B8(011010),'R',2, Html_tag_open_ul, NULL, NULL},
{"var", B8(010101),'R',2, Html_tag_open_default, NULL, NULL},
+ {"video", B8(011101),'R',2, Html_tag_open_video, NULL, Html_tag_close_media},
{"wbr", B8(010101),'F',0, Html_tag_open_default, Html_tag_content_wbr, NULL}
};
#define NTAGS (sizeof(Tags)/sizeof(Tags[0]))
diff --git a/src/html_common.hh b/src/html_common.hh
index a43d91b7..de3069cb 100644
--- a/src/html_common.hh
+++ b/src/html_common.hh
@@ -87,8 +87,9 @@ typedef enum {
IN_MAP = 1 << 9,
IN_PRE = 1 << 10,
IN_LI = 1 << 11,
- IN_META_HACK = 1 << 12,
- IN_EOF = 1 << 13,
+ IN_MEDIA = 1 << 12,
+ IN_META_HACK = 1 << 13,
+ IN_EOF = 1 << 14,
} DilloHtmlProcessingState;
/*
@@ -233,7 +234,7 @@ public:
{ return styleEngine->wordStyle (bw, base_url); }
inline void restyle () { styleEngine->restyle (bw, base_url); }
-
+
};
/*
@@ -257,7 +258,7 @@ DilloUrl *a_Html_url_new(DilloHtml *html,
const char *url_str, const char *base_url,
int use_base_url);
-void a_Html_image_attrs(DilloHtml *html, const char *tag, int tagsize);
+void a_Html_common_image_attrs(DilloHtml *html, const char *tag, int tagsize);
DilloImage *a_Html_image_new(DilloHtml *html, const char *tag, int tagsize);
char *a_Html_parse_entities(DilloHtml *html, const char *token, int toksize);
diff --git a/src/styleengine.cc b/src/styleengine.cc
index 3f621cee..64861973 100644
--- a/src/styleengine.cc
+++ b/src/styleengine.cc
@@ -551,7 +551,7 @@ void StyleEngine::apply (int i, StyleAttrs *attrs, CssPropertyList *props,
a_Url_free (imgUrl);
}
- break;
+ break;
case CSS_PROPERTY_BACKGROUND_POSITION:
computeLength (&attrs->backgroundPositionX, p->value.posVal->posX,
attrs->font);
diff --git a/src/url.c b/src/url.c
index 6780ca8e..9d3e14b2 100644
--- a/src/url.c
+++ b/src/url.c
@@ -688,14 +688,14 @@ static uint_t Url_host_public_internal_dots(const char *host)
if (tld_len > 0) {
/* These TLDs were chosen by examining the current publicsuffix list
- * in September 2013 and picking out those where it was simplest for
+ * in February 2014 and picking out those where it was simplest for
* them to describe the situation by beginning with a "*.[tld]" rule
* or every rule was "[something].[tld]".
*/
- const char *const tlds[] = {"au","bd","bn","ck","cy","er","et","fj",
- "fk","gn","gu","il","jm","ke","kh","kp",
- "kw","lb","lr","mm","mt","mz","ni","np",
- "nz","pg","tr","uk","ye","za","zm","zw"};
+ const char *const tlds[] = {"bd","bn","ck","cy","er","et","fj","fk",
+ "gu","il","jm","ke","kh","kw","mm","mz",
+ "ni","np","nz","pg","tr","uk","ye","za",
+ "zm","zw"};
uint_t i, tld_num = sizeof(tlds) / sizeof(tlds[0]);
for (i = 0; i < tld_num; i++) {
diff --git a/test/dw_image_background.cc b/test/dw_image_background.cc
index 24966850..14cb7b97 100644
--- a/test/dw_image_background.cc
+++ b/test/dw_image_background.cc
@@ -117,7 +117,7 @@ int main(int argc, char **argv)
image1 = StyleImage::create ();
image1->connectDeletion (&isdr);
- layout->setBgImage (image1, BACKGROUND_REPEAT_Y,
+ layout->setBgImage (image1, BACKGROUND_REPEAT_Y,
BACKGROUND_ATTACHMENT_SCROLL, createPerLength (0.5),
createAbsLength (30));