diff options
Diffstat (limited to 'webkit/glue')
-rw-r--r-- | webkit/glue/dom_operations.cc | 136 | ||||
-rw-r--r-- | webkit/glue/dom_operations.h | 43 | ||||
-rw-r--r-- | webkit/glue/dom_operations_unittest.cc | 54 |
3 files changed, 1 insertions, 232 deletions
diff --git a/webkit/glue/dom_operations.cc b/webkit/glue/dom_operations.cc index bc546e2..07c43b2 100644 --- a/webkit/glue/dom_operations.cc +++ b/webkit/glue/dom_operations.cc @@ -7,8 +7,7 @@ #include <set> #include "base/compiler_specific.h" -#include "base/string_number_conversions.h" -#include "base/string_split.h" +#include "base/logging.h" #include "base/string_util.h" #include "third_party/WebKit/WebKit/chromium/public/WebAnimationController.h" #include "third_party/WebKit/WebKit/chromium/public/WebDocument.h" @@ -239,139 +238,6 @@ bool GetAllSavableResourceLinksForCurrentPage(WebView* view, return true; } -// Sizes a single size (the width or height) from a 'sizes' attribute. A size -// matches must match the following regex: [1-9][0-9]*. -static int ParseSingleIconSize(const string16& text) { - // Size must not start with 0, and be between 0 and 9. - if (text.empty() || !(text[0] >= L'1' && text[0] <= L'9')) - return 0; - // Make sure all chars are from 0-9. - for (size_t i = 1; i < text.length(); ++i) { - if (!(text[i] >= L'0' && text[i] <= L'9')) - return 0; - } - int output; - if (!base::StringToInt(text, &output)) - return 0; - return output; -} - -// Parses an icon size. An icon size must match the following regex: -// [1-9][0-9]*x[1-9][0-9]*. -// If the input couldn't be parsed, a size with a width/height < 0 is returned. -static gfx::Size ParseIconSize(const string16& text) { - std::vector<string16> sizes; - base::SplitStringDontTrim(text, L'x', &sizes); - if (sizes.size() != 2) - return gfx::Size(); - - return gfx::Size(ParseSingleIconSize(sizes[0]), - ParseSingleIconSize(sizes[1])); -} - -WebApplicationInfo::WebApplicationInfo() {} - -WebApplicationInfo::~WebApplicationInfo() {} - -bool ParseIconSizes(const string16& text, - std::vector<gfx::Size>* sizes, - bool* is_any) { - *is_any = false; - std::vector<string16> size_strings; - base::SplitStringAlongWhitespace(text, &size_strings); - for (size_t i = 0; i < size_strings.size(); ++i) { - if (EqualsASCII(size_strings[i], "any")) { - *is_any = true; - } else { - gfx::Size size = ParseIconSize(size_strings[i]); - if (size.width() <= 0 || size.height() <= 0) - return false; // Bogus size. - sizes->push_back(size); - } - } - if (*is_any && !sizes->empty()) { - // If is_any is true, it must occur by itself. - return false; - } - return (*is_any || !sizes->empty()); -} - -static void AddInstallIcon(const WebElement& link, - std::vector<WebApplicationInfo::IconInfo>* icons) { - WebString href = link.getAttribute("href"); - if (href.isNull() || href.isEmpty()) - return; - - // Get complete url. - GURL url = link.document().completeURL(href); - if (!url.is_valid()) - return; - - if (!link.hasAttribute("sizes")) - return; - - bool is_any = false; - std::vector<gfx::Size> icon_sizes; - if (!ParseIconSizes(link.getAttribute("sizes"), &icon_sizes, &is_any) || - is_any || - icon_sizes.size() != 1) { - return; - } - WebApplicationInfo::IconInfo icon_info; - icon_info.width = icon_sizes[0].width(); - icon_info.height = icon_sizes[0].height(); - icon_info.url = url; - icons->push_back(icon_info); -} - -void GetApplicationInfo(WebView* view, WebApplicationInfo* app_info) { - WebFrame* main_frame = view->mainFrame(); - if (!main_frame) - return; - - WebDocument doc = main_frame->document(); - if (doc.isNull()) - return; - - WebElement head = main_frame->document().head(); - if (head.isNull()) - return; - - WebNodeList children = head.childNodes(); - for (unsigned i = 0; i < children.length(); ++i) { - WebNode child = children.item(i); - if (!child.isElementNode()) - continue; - WebElement elem = child.to<WebElement>(); - - if (elem.hasTagName("link")) { - std::string rel = elem.getAttribute("rel").utf8(); - // "rel" attribute may use either "icon" or "shortcut icon". - // see also - // <http://en.wikipedia.org/wiki/Favicon> - // <http://dev.w3.org/html5/spec/Overview.html#rel-icon> - if (LowerCaseEqualsASCII(rel, "icon") || - LowerCaseEqualsASCII(rel, "shortcut icon")) - AddInstallIcon(elem, &app_info->icons); - } else if (elem.hasTagName("meta") && elem.hasAttribute("name")) { - std::string name = elem.getAttribute("name").utf8(); - WebString content = elem.getAttribute("content"); - if (name == "application-name") { - app_info->title = content; - } else if (name == "description") { - app_info->description = content; - } else if (name == "application-url") { - std::string url = content.utf8(); - GURL main_url = main_frame->url(); - app_info->app_url = main_url.is_valid() ? - main_url.Resolve(url) : GURL(url); - if (!app_info->app_url.is_valid()) - app_info->app_url = GURL(); - } - } - } -} - bool PauseAnimationAtTimeOnElementWithId(WebView* view, const std::string& animation_name, double time, diff --git a/webkit/glue/dom_operations.h b/webkit/glue/dom_operations.h index 951eb0f..924878f 100644 --- a/webkit/glue/dom_operations.h +++ b/webkit/glue/dom_operations.h @@ -8,7 +8,6 @@ #include <string> #include <vector> -#include "gfx/size.h" #include "googleurl/src/gurl.h" namespace WebKit { @@ -54,48 +53,6 @@ bool GetAllSavableResourceLinksForCurrentPage(WebKit::WebView* view, const GURL& page_url, SavableResourcesResult* savable_resources_result, const char** savable_schemes); -// Structure used when installing a web page as an app. Populated via -// GetApplicationInfo. -struct WebApplicationInfo { - WebApplicationInfo(); - ~WebApplicationInfo(); - - struct IconInfo { - GURL url; - int width; - int height; - }; - - // Title of the application. This is set from the meta tag whose name is - // 'application-name'. - string16 title; - - // Description of the application. This is set from the meta tag whose name - // is 'description'. - string16 description; - - // URL for the app. This is set from the meta tag whose name is - // 'application-url'. - GURL app_url; - - // Set of available icons. This is set for all link tags whose rel=icon. Only - // icons that have a non-zero (width and/or height) are added. - std::vector<IconInfo> icons; -}; - -// Parses the icon's size attribute as defined in the HTML 5 spec. Returns true -// on success, false on errors. On success either all the sizes specified in -// the attribute are added to sizes, or is_any is set to true. -// -// You shouldn't have a need to invoke this directly, it's public for testing. -bool ParseIconSizes(const string16& text, - std::vector<gfx::Size>* sizes, - bool* is_any); - -// Gets the application info for the specified page. See the description of -// WebApplicationInfo for details as to where each field comes from. -void GetApplicationInfo(WebKit::WebView* view, WebApplicationInfo* app_info); - // Invokes pauseAnimationAtTime on the AnimationController associated with the // |view|s main frame. // This is used by test shell. diff --git a/webkit/glue/dom_operations_unittest.cc b/webkit/glue/dom_operations_unittest.cc index c57e943..fac49c6 100644 --- a/webkit/glue/dom_operations_unittest.cc +++ b/webkit/glue/dom_operations_unittest.cc @@ -128,58 +128,4 @@ TEST_F(DomOperationsTests, GetSavableResourceLinksWithPageHasInvalidLinks) { GetSavableResourceLinksForPage(page_file_path, expected_resources_set); } -// Tests ParseIconSizes with various input. -TEST_F(DomOperationsTests, ParseIconSizes) { - struct TestData { - const char* input; - const bool expected_result; - const bool is_any; - const size_t expected_size_count; - const int width1; - const int height1; - const int width2; - const int height2; - } data[] = { - // Bogus input cases. - { "10", false, false, 0, 0, 0, 0, 0 }, - { "10 10", false, false, 0, 0, 0, 0, 0 }, - { "010", false, false, 0, 0, 0, 0, 0 }, - { " 010 ", false, false, 0, 0, 0, 0, 0 }, - { " 10x ", false, false, 0, 0, 0, 0, 0 }, - { " x10 ", false, false, 0, 0, 0, 0, 0 }, - { "any 10x10", false, false, 0, 0, 0, 0, 0 }, - { "", false, false, 0, 0, 0, 0, 0 }, - { "10ax11", false, false, 0, 0, 0, 0, 0 }, - - // Any. - { "any", true, true, 0, 0, 0, 0, 0 }, - { " any", true, true, 0, 0, 0, 0, 0 }, - { " any ", true, true, 0, 0, 0, 0, 0 }, - - // Sizes. - { "10x11", true, false, 1, 10, 11, 0, 0 }, - { " 10x11 ", true, false, 1, 10, 11, 0, 0 }, - { " 10x11 1x2", true, false, 2, 10, 11, 1, 2 }, - }; - for (size_t i = 0; i < ARRAYSIZE_UNSAFE(data); ++i) { - bool is_any; - std::vector<gfx::Size> sizes; - bool result = webkit_glue::ParseIconSizes( - ASCIIToUTF16(data[i].input), &sizes, &is_any); - ASSERT_EQ(result, data[i].expected_result); - if (result) { - ASSERT_EQ(data[i].is_any, is_any); - ASSERT_EQ(data[i].expected_size_count, sizes.size()); - if (sizes.size() > 0) { - ASSERT_EQ(data[i].width1, sizes[0].width()); - ASSERT_EQ(data[i].height1, sizes[0].height()); - } - if (sizes.size() > 1) { - ASSERT_EQ(data[i].width2, sizes[1].width()); - ASSERT_EQ(data[i].height2, sizes[1].height()); - } - } - } -} - } // namespace |