diff options
-rw-r--r-- | doc/Makefile.am | 3 | ||||
-rw-r--r-- | doc/rounding-errors.doc | 15 | ||||
-rw-r--r-- | dpi/cookies.c | 10 | ||||
-rw-r--r-- | dw/fltkimgbuf.cc | 22 | ||||
-rw-r--r-- | dw/fltkviewport.cc | 2 | ||||
-rw-r--r-- | dw/imgrenderer.hh | 6 | ||||
-rw-r--r-- | dw/layout.cc | 24 | ||||
-rw-r--r-- | dw/style.cc | 32 | ||||
-rw-r--r-- | dw/style.hh | 4 | ||||
-rw-r--r-- | dw/table.cc | 2 | ||||
-rw-r--r-- | lout/container.cc | 8 | ||||
-rw-r--r-- | lout/container.hh | 2 | ||||
-rw-r--r-- | lout/debug.hh | 4 | ||||
-rw-r--r-- | src/css.hh | 7 | ||||
-rw-r--r-- | src/cssparser.cc | 2 | ||||
-rw-r--r-- | src/form.cc | 2 | ||||
-rw-r--r-- | src/html.cc | 254 | ||||
-rw-r--r-- | src/html_common.hh | 9 | ||||
-rw-r--r-- | src/styleengine.cc | 2 | ||||
-rw-r--r-- | src/url.c | 10 | ||||
-rw-r--r-- | test/dw_image_background.cc | 2 |
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) @@ -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); @@ -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)); |