summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
authorKristian Monsen <kristianm@google.com>2011-06-28 21:49:31 +0100
committerKristian Monsen <kristianm@google.com>2011-07-08 17:55:00 +0100
commitddb351dbec246cf1fab5ec20d2d5520909041de1 (patch)
tree158e3fb57bdcac07c7f1e767fde3c70687c9fbb1 /webkit
parent6b92e04f5f151c896e3088e86f70db7081009308 (diff)
downloadexternal_chromium-ddb351dbec246cf1fab5ec20d2d5520909041de1.zip
external_chromium-ddb351dbec246cf1fab5ec20d2d5520909041de1.tar.gz
external_chromium-ddb351dbec246cf1fab5ec20d2d5520909041de1.tar.bz2
Merge Chromium at r12.0.742.93: Initial merge by git
Change-Id: Ic5ee2fec31358bbee305f7e915442377bfa6cda6
Diffstat (limited to 'webkit')
-rw-r--r--webkit/glue/alt_error_page_resource_fetcher.cc5
-rw-r--r--webkit/glue/alt_error_page_resource_fetcher.h4
-rw-r--r--webkit/glue/context_menu.cc16
-rw-r--r--webkit/glue/context_menu.h11
-rw-r--r--webkit/glue/cpp_bound_class.h4
-rw-r--r--webkit/glue/form_field.cc72
-rw-r--r--webkit/glue/form_field.h43
-rw-r--r--webkit/glue/ftp_directory_listing_response_delegate.cc95
-rw-r--r--webkit/glue/ftp_directory_listing_response_delegate.h31
-rw-r--r--webkit/glue/gl_bindings_skia_cmd_buffer.cc122
-rw-r--r--webkit/glue/gl_bindings_skia_cmd_buffer.h18
-rw-r--r--webkit/glue/glue_serialize.cc6
-rw-r--r--webkit/glue/idb_bindings.cc7
-rw-r--r--webkit/glue/image_resource_fetcher.cc9
-rw-r--r--webkit/glue/image_resource_fetcher.h3
-rw-r--r--webkit/glue/inspector_strings.grd1
-rw-r--r--webkit/glue/media/buffered_data_source.cc283
-rw-r--r--webkit/glue/media/buffered_data_source.h42
-rw-r--r--webkit/glue/media/buffered_data_source_unittest.cc60
-rw-r--r--webkit/glue/media/buffered_resource_loader.cc175
-rw-r--r--webkit/glue/media/buffered_resource_loader.h58
-rw-r--r--webkit/glue/media/buffered_resource_loader_unittest.cc216
-rw-r--r--webkit/glue/media/simple_data_source.cc245
-rw-r--r--webkit/glue/media/simple_data_source.h26
-rw-r--r--webkit/glue/media/simple_data_source_unittest.cc44
-rw-r--r--webkit/glue/media/video_renderer_impl.cc10
-rw-r--r--webkit/glue/media/video_renderer_impl.h10
-rw-r--r--webkit/glue/media/web_data_source.h24
-rw-r--r--webkit/glue/media/web_data_source_factory.cc103
-rw-r--r--webkit/glue/media/web_data_source_factory.h51
-rw-r--r--webkit/glue/media/web_video_renderer.h4
-rw-r--r--webkit/glue/multipart_response_delegate.cc19
-rw-r--r--webkit/glue/multipart_response_delegate.h5
-rw-r--r--webkit/glue/multipart_response_delegate_unittest.cc176
-rw-r--r--webkit/glue/p2p_transport.h56
-rw-r--r--webkit/glue/resource_fetcher.cc17
-rw-r--r--webkit/glue/resource_fetcher.h23
-rw-r--r--webkit/glue/resource_fetcher_unittest.cc17
-rw-r--r--webkit/glue/resource_loader_bridge.cc3
-rw-r--r--webkit/glue/resource_loader_bridge.h15
-rw-r--r--webkit/glue/resource_type.h3
-rw-r--r--webkit/glue/resources/input_speech_recording.pngbin2189 -> 1343 bytes
-rw-r--r--webkit/glue/resources/pdf_button_fth.pngbin1402 -> 0 bytes
-rw-r--r--webkit/glue/resources/pdf_button_fth_hover.pngbin1438 -> 0 bytes
-rw-r--r--webkit/glue/resources/pdf_button_fth_pressed.pngbin1203 -> 0 bytes
-rw-r--r--webkit/glue/resources/pdf_button_ftp.pngbin0 -> 1445 bytes
-rw-r--r--webkit/glue/resources/pdf_button_ftp_hover.pngbin0 -> 1492 bytes
-rw-r--r--webkit/glue/resources/pdf_button_ftp_pressed.pngbin0 -> 1195 bytes
-rw-r--r--webkit/glue/resources/pdf_button_ftw.pngbin1082 -> 1275 bytes
-rw-r--r--webkit/glue/resources/pdf_button_ftw_hover.pngbin1174 -> 1254 bytes
-rw-r--r--webkit/glue/resources/pdf_button_ftw_pressed.pngbin914 -> 932 bytes
-rw-r--r--webkit/glue/resources/pdf_button_print.pngbin0 -> 1134 bytes
-rw-r--r--webkit/glue/resources/pdf_button_print_hover.pngbin0 -> 1113 bytes
-rw-r--r--webkit/glue/resources/pdf_button_print_pressed.pngbin0 -> 898 bytes
-rw-r--r--webkit/glue/resources/pdf_button_save.pngbin0 -> 923 bytes
-rw-r--r--webkit/glue/resources/pdf_button_save_hover.pngbin0 -> 913 bytes
-rw-r--r--webkit/glue/resources/pdf_button_save_pressed.pngbin0 -> 655 bytes
-rw-r--r--webkit/glue/resources/pdf_button_zoomin.pngbin1655 -> 1604 bytes
-rw-r--r--webkit/glue/resources/pdf_button_zoomin_hover.pngbin1682 -> 1570 bytes
-rw-r--r--webkit/glue/resources/pdf_button_zoomin_pressed.pngbin1403 -> 1291 bytes
-rw-r--r--webkit/glue/resources/pdf_button_zoomout.pngbin1464 -> 1538 bytes
-rw-r--r--webkit/glue/resources/pdf_button_zoomout_hover.pngbin1491 -> 1489 bytes
-rw-r--r--webkit/glue/resources/pdf_button_zoomout_pressed.pngbin1232 -> 1206 bytes
-rw-r--r--webkit/glue/resources/webkit_strings_ar.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_bg.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_bn.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ca.xtb25
-rw-r--r--webkit/glue/resources/webkit_strings_cs.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_da.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_de.xtb25
-rw-r--r--webkit/glue/resources/webkit_strings_el.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_en-GB.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_es-419.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_es.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_et.xtb25
-rw-r--r--webkit/glue/resources/webkit_strings_fa.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_fi.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_fil.xtb25
-rw-r--r--webkit/glue/resources/webkit_strings_fr.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_gu.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_hi.xtb61
-rw-r--r--webkit/glue/resources/webkit_strings_hr.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_hu.xtb25
-rw-r--r--webkit/glue/resources/webkit_strings_id.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_it.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_iw.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ja.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_kn.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ko.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_lt.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_lv.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ml.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_mr.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_nl.xtb43
-rw-r--r--webkit/glue/resources/webkit_strings_no.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_pl.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_pt-BR.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_pt-PT.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ro.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ru.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_sk.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_sl.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_sr.xtb43
-rw-r--r--webkit/glue/resources/webkit_strings_sv.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_ta.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_te.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_th.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_tr.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_uk.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_vi.xtb25
-rw-r--r--webkit/glue/resources/webkit_strings_zh-CN.xtb23
-rw-r--r--webkit/glue/resources/webkit_strings_zh-TW.xtb25
-rw-r--r--webkit/glue/user_agent.cc19
-rw-r--r--webkit/glue/webaccessibility.cc50
-rw-r--r--webkit/glue/webaccessibility.h14
-rw-r--r--webkit/glue/webclipboard_impl.cc23
-rw-r--r--webkit/glue/webclipboard_impl.h1
-rw-r--r--webkit/glue/webdropdata.cc10
-rw-r--r--webkit/glue/webdropdata.h7
-rw-r--r--webkit/glue/webkit_glue.cc4
-rw-r--r--webkit/glue/webkit_glue.gypi114
-rw-r--r--webkit/glue/webkit_glue.h22
-rw-r--r--webkit/glue/webkit_resources.grd12
-rw-r--r--webkit/glue/webkitclient_impl.cc19
-rw-r--r--webkit/glue/webmediaplayer_impl.cc189
-rw-r--r--webkit/glue/webmediaplayer_impl.h58
-rw-r--r--webkit/glue/webmenurunner_mac.h2
-rw-r--r--webkit/glue/webpasswordautocompletelistener_impl.cc224
-rw-r--r--webkit/glue/webpasswordautocompletelistener_impl.h87
-rw-r--r--webkit/glue/webpasswordautocompletelistener_unittest.cc345
-rw-r--r--webkit/glue/webpreferences.cc16
-rw-r--r--webkit/glue/webpreferences.h4
-rw-r--r--webkit/glue/websocketstreamhandle_bridge.h4
-rw-r--r--webkit/glue/websocketstreamhandle_impl.cc6
-rw-r--r--webkit/glue/websocketstreamhandle_impl.h4
-rw-r--r--webkit/glue/webthemeengine_impl_linux.cc62
-rw-r--r--webkit/glue/webthemeengine_impl_win.cc410
-rw-r--r--webkit/glue/weburlloader_impl.cc57
-rw-r--r--webkit/glue/weburlloader_impl.h4
-rw-r--r--webkit/glue/webvideoframe_impl.h7
140 files changed, 3213 insertions, 1912 deletions
diff --git a/webkit/glue/alt_error_page_resource_fetcher.cc b/webkit/glue/alt_error_page_resource_fetcher.cc
index 4e1867d..da95e47 100644
--- a/webkit/glue/alt_error_page_resource_fetcher.cc
+++ b/webkit/glue/alt_error_page_resource_fetcher.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -9,6 +9,7 @@
using WebKit::WebFrame;
using WebKit::WebURLError;
+using WebKit::WebURLRequest;
using WebKit::WebURLResponse;
namespace webkit_glue {
@@ -26,7 +27,7 @@ AltErrorPageResourceFetcher::AltErrorPageResourceFetcher(
callback_(callback),
original_error_(original_error) {
fetcher_.reset(new ResourceFetcherWithTimeout(
- url, frame, kDownloadTimeoutSec,
+ url, frame, WebURLRequest::TargetIsMainFrame, kDownloadTimeoutSec,
NewCallback(this, &AltErrorPageResourceFetcher::OnURLFetchComplete)));
}
diff --git a/webkit/glue/alt_error_page_resource_fetcher.h b/webkit/glue/alt_error_page_resource_fetcher.h
index 3cccaf4..60dca47 100644
--- a/webkit/glue/alt_error_page_resource_fetcher.h
+++ b/webkit/glue/alt_error_page_resource_fetcher.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,7 +6,7 @@
#define WEBKIT_GLUE_ALT_ERROR_PAGE_RESOURCE_FETCHER_H_
#include "base/callback.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "googleurl/src/gurl.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLError.h"
diff --git a/webkit/glue/context_menu.cc b/webkit/glue/context_menu.cc
index 6db5c51..ad0d70a 100644
--- a/webkit/glue/context_menu.cc
+++ b/webkit/glue/context_menu.cc
@@ -1,14 +1,18 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "webkit/glue/context_menu.h"
+#include "webkit/glue/glue_serialize.h"
namespace webkit_glue {
+const int32 CustomContextMenuContext::kCurrentRenderWidget = kint32max;
+
CustomContextMenuContext::CustomContextMenuContext()
: is_pepper_menu(false),
- request_id(0) {
+ request_id(0),
+ render_widget_id(kCurrentRenderWidget) {
}
} // namespace webkit_glue
@@ -39,9 +43,17 @@ ContextMenuParams::ContextMenuParams(const WebKit::WebContextMenuData& data)
edit_flags(data.editFlags),
security_info(data.securityInfo),
frame_charset(data.frameEncoding.utf8()) {
+ for (size_t i = 0; i < data.dictionarySuggestions.size(); ++i)
+ dictionary_suggestions.push_back(data.dictionarySuggestions[i]);
+
custom_context.is_pepper_menu = false;
for (size_t i = 0; i < data.customItems.size(); ++i)
custom_items.push_back(WebMenuItem(data.customItems[i]));
+
+ if (!data.frameHistoryItem.isNull()) {
+ frame_content_state =
+ webkit_glue::HistoryItemToString(data.frameHistoryItem);
+ }
}
ContextMenuParams::~ContextMenuParams() {
diff --git a/webkit/glue/context_menu.h b/webkit/glue/context_menu.h
index 2f38807..e8441e5 100644
--- a/webkit/glue/context_menu.h
+++ b/webkit/glue/context_menu.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -19,6 +19,11 @@ namespace webkit_glue {
struct CustomContextMenuContext {
bool is_pepper_menu;
int request_id;
+ // The routing ID of the render widget on which the context menu is shown.
+ // It could also be |kCurrentRenderWidget|, which means the render widget that
+ // the corresponding ViewHostMsg_ContextMenu is sent to.
+ int32 render_widget_id;
+ static const int32 kCurrentRenderWidget;
CustomContextMenuContext();
};
@@ -64,6 +69,10 @@ struct ContextMenuParams {
// This is the URL of the subframe that the context menu was invoked on.
GURL frame_url;
+ // This is the history item state of the subframe that the context menu was
+ // invoked on.
+ std::string frame_content_state;
+
// These are the parameters for the media element that the context menu
// was invoked on.
int media_flags;
diff --git a/webkit/glue/cpp_bound_class.h b/webkit/glue/cpp_bound_class.h
index 06662ce..8335a0a 100644
--- a/webkit/glue/cpp_bound_class.h
+++ b/webkit/glue/cpp_bound_class.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -24,7 +24,7 @@
#include "webkit/glue/cpp_variant.h"
#include "base/callback.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
namespace WebKit {
class WebFrame;
diff --git a/webkit/glue/form_field.cc b/webkit/glue/form_field.cc
index 82cac6a..0de8446 100644
--- a/webkit/glue/form_field.cc
+++ b/webkit/glue/form_field.cc
@@ -20,41 +20,41 @@ using WebKit::WebVector;
namespace webkit_glue {
FormField::FormField()
- : max_length_(0),
- is_autofilled_(false) {
+ : max_length(0),
+ is_autofilled(false) {
}
// TODO(jhawkins): This constructor should probably be deprecated and the
// functionality moved to FormManager.
FormField::FormField(WebFormControlElement element)
- : max_length_(0),
- is_autofilled_(false) {
- name_ = element.nameForAutofill();
+ : max_length(0),
+ is_autofilled(false) {
+ name = element.nameForAutofill();
// TODO(jhawkins): Extract the field label. For now we just use the field
// name.
- label_ = name_;
+ label = name;
- form_control_type_ = element.formControlType();
- if (form_control_type_ == ASCIIToUTF16("text")) {
+ form_control_type = element.formControlType();
+ if (form_control_type == ASCIIToUTF16("text")) {
const WebInputElement& input_element = element.toConst<WebInputElement>();
- value_ = input_element.value();
- max_length_ = input_element.size();
- is_autofilled_ = input_element.isAutofilled();
- } else if (form_control_type_ == ASCIIToUTF16("select-one")) {
+ value = input_element.value();
+ max_length = input_element.size();
+ is_autofilled = input_element.isAutofilled();
+ } else if (form_control_type == ASCIIToUTF16("select-one")) {
WebSelectElement select_element = element.to<WebSelectElement>();
- value_ = select_element.value();
+ value = select_element.value();
// For select-one elements copy option strings.
WebVector<WebElement> list_items = select_element.listItems();
- option_strings_.reserve(list_items.size());
+ option_strings.reserve(list_items.size());
for (size_t i = 0; i < list_items.size(); ++i) {
if (list_items[i].hasTagName("option"))
- option_strings_.push_back(list_items[i].to<WebOptionElement>().value());
+ option_strings.push_back(list_items[i].to<WebOptionElement>().value());
}
}
- TrimWhitespace(value_, TRIM_LEADING, &value_);
+ TrimWhitespace(value, TRIM_LEADING, &value);
}
FormField::FormField(const string16& label,
@@ -63,12 +63,12 @@ FormField::FormField(const string16& label,
const string16& form_control_type,
int max_length,
bool is_autofilled)
- : label_(label),
- name_(name),
- value_(value),
- form_control_type_(form_control_type),
- max_length_(max_length),
- is_autofilled_(is_autofilled) {
+ : label(label),
+ name(name),
+ value(value),
+ form_control_type(form_control_type),
+ max_length(max_length),
+ is_autofilled(is_autofilled) {
}
FormField::~FormField() {
@@ -77,10 +77,10 @@ FormField::~FormField() {
bool FormField::operator==(const FormField& field) const {
// A FormField stores a value, but the value is not part of the identity of
// the field, so we don't want to compare the values.
- return (label_ == field.label_ &&
- name_ == field.name_ &&
- form_control_type_ == field.form_control_type_ &&
- max_length_ == field.max_length_);
+ return (label == field.label &&
+ name == field.name &&
+ form_control_type == field.form_control_type &&
+ max_length == field.max_length);
}
bool FormField::operator!=(const FormField& field) const {
@@ -88,24 +88,24 @@ bool FormField::operator!=(const FormField& field) const {
}
bool FormField::StrictlyEqualsHack(const FormField& field) const {
- return (label_ == field.label_ &&
- name_ == field.name_ &&
- value_ == field.value_ &&
- form_control_type_ == field.form_control_type_ &&
- max_length_ == field.max_length_);
+ return (label == field.label &&
+ name == field.name &&
+ value == field.value &&
+ form_control_type == field.form_control_type &&
+ max_length == field.max_length);
}
std::ostream& operator<<(std::ostream& os, const FormField& field) {
return os
- << UTF16ToUTF8(field.label())
+ << UTF16ToUTF8(field.label)
<< " "
- << UTF16ToUTF8(field.name())
+ << UTF16ToUTF8(field.name)
<< " "
- << UTF16ToUTF8(field.value())
+ << UTF16ToUTF8(field.value)
<< " "
- << UTF16ToUTF8(field.form_control_type())
+ << UTF16ToUTF8(field.form_control_type)
<< " "
- << field.max_length();
+ << field.max_length;
}
} // namespace webkit_glue
diff --git a/webkit/glue/form_field.h b/webkit/glue/form_field.h
index 1874c44..c246091 100644
--- a/webkit/glue/form_field.h
+++ b/webkit/glue/form_field.h
@@ -13,8 +13,7 @@
namespace webkit_glue {
// Stores information about a field in a form.
-class FormField {
- public:
+struct FormField {
FormField();
explicit FormField(WebKit::WebFormControlElement element);
FormField(const string16& label,
@@ -25,31 +24,6 @@ class FormField {
bool is_autofilled);
virtual ~FormField();
- const string16& label() const { return label_; }
- const string16& name() const { return name_; }
- const string16& value() const { return value_; }
- const string16& form_control_type() const { return form_control_type_; }
- int max_length() const { return max_length_; }
- bool is_autofilled() const { return is_autofilled_; }
-
- // Returns option string for elements for which they make sense (select-one,
- // for example) for the rest of elements return an empty array.
- const std::vector<string16>& option_strings() const {
- return option_strings_;
- }
-
- void set_label(const string16& label) { label_ = label; }
- void set_name(const string16& name) { name_ = name; }
- void set_value(const string16& value) { value_ = value; }
- void set_form_control_type(const string16& form_control_type) {
- form_control_type_ = form_control_type;
- }
- void set_max_length(int max_length) { max_length_ = max_length; }
- void set_autofilled(bool is_autofilled) { is_autofilled_ = is_autofilled; }
- void set_option_strings(const std::vector<string16>& strings) {
- option_strings_ = strings;
- }
-
// Equality tests for identity which does not include |value_| or |size_|.
// Use |StrictlyEqualsHack| method to test all members.
// TODO(dhollowa): These operators need to be revised when we implement field
@@ -61,14 +35,13 @@ class FormField {
// TODO(dhollowa): This will be removed when we implement field ids.
bool StrictlyEqualsHack(const FormField& field) const;
- private:
- string16 label_;
- string16 name_;
- string16 value_;
- string16 form_control_type_;
- int max_length_;
- bool is_autofilled_;
- std::vector<string16> option_strings_;
+ string16 label;
+ string16 name;
+ string16 value;
+ string16 form_control_type;
+ int max_length;
+ bool is_autofilled;
+ std::vector<string16> option_strings;
};
// So we can compare FormFields with EXPECT_EQ().
diff --git a/webkit/glue/ftp_directory_listing_response_delegate.cc b/webkit/glue/ftp_directory_listing_response_delegate.cc
index 0a2542b..33a3f8c 100644
--- a/webkit/glue/ftp_directory_listing_response_delegate.cc
+++ b/webkit/glue/ftp_directory_listing_response_delegate.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -17,7 +17,6 @@
#include "net/base/net_errors.h"
#include "net/base/net_util.h"
#include "net/ftp/ftp_directory_listing_parser.h"
-#include "net/ftp/ftp_server_type_histograms.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h"
@@ -60,37 +59,40 @@ FtpDirectoryListingResponseDelegate::FtpDirectoryListingResponseDelegate(
WebURLLoader* loader,
const WebURLResponse& response)
: client_(client),
- loader_(loader),
- original_response_(response),
- buffer_(base::Time::Now()),
- updated_histograms_(false),
- had_parsing_error_(false) {
- Init();
+ loader_(loader) {
+ Init(response.url());
}
void FtpDirectoryListingResponseDelegate::OnReceivedData(const char* data,
int data_len) {
- if (had_parsing_error_)
- return;
-
- if (buffer_.ConsumeData(data, data_len) == net::OK)
- ProcessReceivedEntries();
- else
- had_parsing_error_ = true;
+ buffer_.append(data, data_len);
}
void FtpDirectoryListingResponseDelegate::OnCompletedRequest() {
- if (!had_parsing_error_ && buffer_.ProcessRemainingData() == net::OK)
- ProcessReceivedEntries();
- else
- had_parsing_error_ = true;
-
- if (had_parsing_error_)
+ std::vector<FtpDirectoryListingEntry> entries;
+ int rv = net::ParseFtpDirectoryListing(buffer_, base::Time::Now(), &entries);
+ if (rv != net::OK) {
SendDataToClient("<script>onListingParsingError();</script>\n");
+ return;
+ }
+ for (size_t i = 0; i < entries.size(); i++) {
+ FtpDirectoryListingEntry entry = entries[i];
+
+ // Skip the current and parent directory entries in the listing. Our header
+ // always includes them.
+ if (EqualsASCII(entry.name, ".") || EqualsASCII(entry.name, ".."))
+ continue;
+
+ bool is_directory = (entry.type == FtpDirectoryListingEntry::DIRECTORY);
+ int64 size = entry.size;
+ if (entry.type != FtpDirectoryListingEntry::FILE)
+ size = 0;
+ SendDataToClient(net::GetDirectoryListingEntry(
+ entry.name, entry.raw_name, is_directory, size, entry.last_modified));
+ }
}
-void FtpDirectoryListingResponseDelegate::Init() {
- GURL response_url(original_response_.url());
+void FtpDirectoryListingResponseDelegate::Init(const GURL& response_url) {
UnescapeRule::Type unescape_rules = UnescapeRule::SPACES |
UnescapeRule::URL_SPECIAL_CHARS;
std::string unescaped_path = UnescapeURLComponent(response_url.path(),
@@ -106,54 +108,9 @@ void FtpDirectoryListingResponseDelegate::Init() {
}
}
-bool FtpDirectoryListingResponseDelegate::ConvertToServerEncoding(
- const string16& filename, std::string* raw_bytes) const {
- if (buffer_.encoding().empty()) {
- *raw_bytes = std::string();
- return true;
- }
-
- return base::UTF16ToCodepage(filename, buffer_.encoding().c_str(),
- base::OnStringConversionError::FAIL,
- raw_bytes);
-}
-
-void FtpDirectoryListingResponseDelegate::ProcessReceivedEntries() {
- if (!updated_histograms_ && buffer_.EntryAvailable()) {
- // Only log the server type if we got enough data to reliably detect it.
- net::UpdateFtpServerTypeHistograms(buffer_.GetServerType());
- updated_histograms_ = true;
- }
-
- while (buffer_.EntryAvailable()) {
- FtpDirectoryListingEntry entry = buffer_.PopEntry();
-
- // Skip the current and parent directory entries in the listing. Our header
- // always includes them.
- if (EqualsASCII(entry.name, ".") || EqualsASCII(entry.name, ".."))
- continue;
-
- bool is_directory = (entry.type == FtpDirectoryListingEntry::DIRECTORY);
- int64 size = entry.size;
- if (entry.type != FtpDirectoryListingEntry::FILE)
- size = 0;
- std::string raw_bytes;
- if (ConvertToServerEncoding(entry.name, &raw_bytes)) {
- SendDataToClient(net::GetDirectoryListingEntry(
- entry.name, raw_bytes, is_directory, size, entry.last_modified));
- } else {
- // Consider an encoding problem a non-fatal error. The server's support
- // for non-ASCII characters might be buggy. Display an error message,
- // but keep trying to display the rest of the listing (most file names
- // are ASCII anyway, we could be just unlucky with this one).
- had_parsing_error_ = true;
- }
- }
-}
-
void FtpDirectoryListingResponseDelegate::SendDataToClient(
const std::string& data) {
- client_->didReceiveData(loader_, data.data(), data.length());
+ client_->didReceiveData(loader_, data.data(), data.length(), -1);
}
} // namespace webkit_glue
diff --git a/webkit/glue/ftp_directory_listing_response_delegate.h b/webkit/glue/ftp_directory_listing_response_delegate.h
index 9502761..402d618 100644
--- a/webkit/glue/ftp_directory_listing_response_delegate.h
+++ b/webkit/glue/ftp_directory_listing_response_delegate.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
@@ -10,7 +10,7 @@
#include <string>
-#include "net/ftp/ftp_directory_listing_buffer.h"
+#include "base/basictypes.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
namespace WebKit {
@@ -18,6 +18,8 @@ class WebURLLoader;
class WebURLLoaderClient;
}
+class GURL;
+
namespace webkit_glue {
class FtpDirectoryListingResponseDelegate {
@@ -31,16 +33,7 @@ class FtpDirectoryListingResponseDelegate {
void OnCompletedRequest();
private:
- void Init();
-
- // Converts |filename| to detected server encoding and puts the result
- // in |raw_bytes| (if no conversion is necessary, an empty string is used).
- // Returns true on success.
- bool ConvertToServerEncoding(const string16& filename,
- std::string* raw_bytes) const;
-
- // Fetches the listing entries from the buffer and sends them to the client.
- void ProcessReceivedEntries();
+ void Init(const GURL& response_url);
void SendDataToClient(const std::string& data);
@@ -49,18 +42,8 @@ class FtpDirectoryListingResponseDelegate {
WebKit::WebURLLoaderClient* client_;
WebKit::WebURLLoader* loader_;
- // The original resource response for this request. We use this as a
- // starting point for each parts response.
- WebKit::WebURLResponse original_response_;
-
- // Data buffer also responsible for parsing the listing data.
- net::FtpDirectoryListingBuffer buffer_;
-
- // True if we updated histogram data (we only want to do it once).
- bool updated_histograms_;
-
- // True if we got an error when parsing the response.
- bool had_parsing_error_;
+ // Buffer for data received from the network.
+ std::string buffer_;
DISALLOW_COPY_AND_ASSIGN(FtpDirectoryListingResponseDelegate);
};
diff --git a/webkit/glue/gl_bindings_skia_cmd_buffer.cc b/webkit/glue/gl_bindings_skia_cmd_buffer.cc
new file mode 100644
index 0000000..06010cb
--- /dev/null
+++ b/webkit/glue/gl_bindings_skia_cmd_buffer.cc
@@ -0,0 +1,122 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+
+#include "webkit/glue/gl_bindings_skia_cmd_buffer.h"
+
+#define GL_GLEXT_PROTOTYPES
+#include "gpu/GLES2/gl2.h"
+#include "gpu/GLES2/gl2ext.h"
+
+#include "third_party/skia/gpu/include/GrGLInterface.h"
+
+namespace webkit_glue {
+
+void BindSkiaToCommandBufferGL() {
+ static GrGLInterface cmd_buffer_interface = {
+ kES2_GrGLBinding,
+
+ glActiveTexture,
+ glAttachShader,
+ glBindAttribLocation,
+ glBindBuffer,
+ glBindTexture,
+ glBlendColor,
+ glBlendFunc,
+ glBufferData,
+ glBufferSubData,
+ glClear,
+ glClearColor,
+ glClearStencil,
+ NULL, // glClientActiveTexture
+ NULL, // glColor4ub
+ glColorMask,
+ NULL, // glColorPointer
+ glCompileShader,
+ glCompressedTexImage2D,
+ glCreateProgram,
+ glCreateShader,
+ glCullFace,
+ glDeleteBuffers,
+ glDeleteProgram,
+ glDeleteShader,
+ glDeleteTextures,
+ glDepthMask,
+ glDisable,
+ NULL, // glDisableClientState
+ glDisableVertexAttribArray,
+ glDrawArrays,
+ glDrawElements,
+ glEnable,
+ NULL, // glEnableClientState
+ glEnableVertexAttribArray,
+ glFrontFace,
+ glGenBuffers,
+ glGenTextures,
+ glGetBufferParameteriv,
+ glGetError,
+ glGetIntegerv,
+ glGetProgramInfoLog,
+ glGetProgramiv,
+ glGetShaderInfoLog,
+ glGetShaderiv,
+ glGetString,
+ glGetUniformLocation,
+ glLineWidth,
+ glLinkProgram,
+ NULL, // glLoadMatrixf
+ NULL, // glMatrixMode
+ glPixelStorei,
+ NULL, // glPointSize
+ glReadPixels,
+ glScissor,
+ NULL, // glShadeModel
+ glShaderSource,
+ glStencilFunc,
+ glStencilFuncSeparate,
+ glStencilMask,
+ glStencilMaskSeparate,
+ glStencilOp,
+ glStencilOpSeparate,
+ NULL, // glTexCoordPointer
+ NULL, // glTexEnvi
+ glTexImage2D,
+ glTexParameteri,
+ glTexSubImage2D,
+ glUniform1fv,
+ glUniform1i,
+ glUniform4fv,
+ glUniformMatrix3fv,
+ glUseProgram,
+ glVertexAttrib4fv,
+ glVertexAttribPointer,
+ NULL, // glVertexPointer
+ glViewport,
+ glBindFramebuffer,
+ glBindRenderbuffer,
+ glCheckFramebufferStatus,
+ glDeleteFramebuffers,
+ glDeleteRenderbuffers,
+ glFramebufferRenderbuffer,
+ glFramebufferTexture2D,
+ glGenFramebuffers,
+ glGenRenderbuffers,
+ glRenderbufferStorage,
+ glRenderbufferStorageMultisampleEXT,
+ glBlitFramebufferEXT,
+ NULL, // glResolveMultisampleFramebuffer
+ NULL, // glMapBuffer
+ NULL, // glUnmapBuffer
+
+ GrGLInterface::kStaticInitEndGuard
+ };
+ static bool host_StubGL_initialized = false;
+ if (!host_StubGL_initialized) {
+ GrGLSetGLInterface(&cmd_buffer_interface);
+ host_StubGL_initialized = true;
+ }
+}
+
+} // namespace webkit_glue
+
diff --git a/webkit/glue/gl_bindings_skia_cmd_buffer.h b/webkit/glue/gl_bindings_skia_cmd_buffer.h
new file mode 100644
index 0000000..206e4f9
--- /dev/null
+++ b/webkit/glue/gl_bindings_skia_cmd_buffer.h
@@ -0,0 +1,18 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_GLUE_GL_BINDINGS_SKIA_CMD_BUFFER_H_
+#define WEBKIT_GLUE_GL_BINDINGS_SKIA_CMD_BUFFER_H_
+#pragma once
+
+namespace webkit_glue {
+
+// The GPU back-end for skia requires pointers to GL functions. This function
+// binds skia-gpu to the cmd buffers GL.
+void BindSkiaToCommandBufferGL();
+
+} // namespace webkit_glue
+
+#endif // WEBKIT_GLUE_GL_BINDINGS_SKIA_CMD_BUFFER_H_
+
diff --git a/webkit/glue/glue_serialize.cc b/webkit/glue/glue_serialize.cc
index df055fe..54ba743 100644
--- a/webkit/glue/glue_serialize.cc
+++ b/webkit/glue/glue_serialize.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -112,10 +112,10 @@ inline void WriteReal(double data, SerializeObject* obj) {
}
inline double ReadReal(const SerializeObject* obj) {
- const void* tmp;
+ const void* tmp = NULL;
int length = 0;
ReadData(obj, &tmp, &length);
- if (length > 0 && length >= static_cast<int>(sizeof(0.0)))
+ if (tmp && length > 0 && length >= static_cast<int>(sizeof(0.0)))
return *static_cast<const double*>(tmp);
else
return 0.0;
diff --git a/webkit/glue/idb_bindings.cc b/webkit/glue/idb_bindings.cc
index 633045e..3149c52 100644
--- a/webkit/glue/idb_bindings.cc
+++ b/webkit/glue/idb_bindings.cc
@@ -1,18 +1,17 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "webkit/glue/idb_bindings.h"
#include "base/basictypes.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "base/string16.h"
#include "base/utf_string_conversions.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBKey.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebIDBKeyPath.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSerializedScriptValue.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
-#include "v8/include/v8.h"
namespace webkit_glue {
@@ -24,7 +23,6 @@ bool IDBKeysFromValuesAndKeyPath(
const std::vector<WebSerializedScriptValue>& serialized_script_values,
const string16& idb_key_path,
std::vector<WebIDBKey>* values) {
- v8::Locker lock;
WebIDBKeyPath web_idb_key_path = WebIDBKeyPath::create(idb_key_path);
bool error = web_idb_key_path.parseError() != 0;
// TODO(bulach): what to do when we have a parse error? For now, setting
@@ -46,7 +44,6 @@ WebSerializedScriptValue InjectIDBKey(
const WebIDBKey& key,
const WebSerializedScriptValue& value,
const string16& idb_key_path) {
- v8::Locker lock;
return WebIDBKey::injectIDBKeyIntoSerializedValue(
key, value, WebIDBKeyPath::create(idb_key_path));
}
diff --git a/webkit/glue/image_resource_fetcher.cc b/webkit/glue/image_resource_fetcher.cc
index 65d80bd..6a37a34 100644
--- a/webkit/glue/image_resource_fetcher.cc
+++ b/webkit/glue/image_resource_fetcher.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -11,6 +11,8 @@
#include "third_party/skia/include/core/SkBitmap.h"
using WebKit::WebFrame;
+using WebKit::WebURLRequest;
+using WebKit::WebURLResponse;
namespace webkit_glue {
@@ -19,13 +21,14 @@ ImageResourceFetcher::ImageResourceFetcher(
WebFrame* frame,
int id,
int image_size,
+ WebURLRequest::TargetType target_type,
Callback* callback)
: callback_(callback),
id_(id),
image_url_(image_url),
image_size_(image_size) {
fetcher_.reset(new ResourceFetcher(
- image_url, frame,
+ image_url, frame, target_type,
NewCallback(this, &ImageResourceFetcher::OnURLFetchComplete)));
}
@@ -35,7 +38,7 @@ ImageResourceFetcher::~ImageResourceFetcher() {
}
void ImageResourceFetcher::OnURLFetchComplete(
- const WebKit::WebURLResponse& response,
+ const WebURLResponse& response,
const std::string& data) {
SkBitmap bitmap;
if (!response.isNull() && response.httpStatusCode() == 200) {
diff --git a/webkit/glue/image_resource_fetcher.h b/webkit/glue/image_resource_fetcher.h
index 8c6f70c..ff69bdb 100644
--- a/webkit/glue/image_resource_fetcher.h
+++ b/webkit/glue/image_resource_fetcher.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -24,6 +24,7 @@ class ImageResourceFetcher {
WebKit::WebFrame* frame,
int id,
int image_size,
+ WebKit::WebURLRequest::TargetType target_type,
Callback* callback);
virtual ~ImageResourceFetcher();
diff --git a/webkit/glue/inspector_strings.grd b/webkit/glue/inspector_strings.grd
index d545158..d65dcaa 100644
--- a/webkit/glue/inspector_strings.grd
+++ b/webkit/glue/inspector_strings.grd
@@ -121,6 +121,7 @@ so we include the original license below:
<file path="../../third_party/launchpad_translations/inspector_strings_da.xtb" lang="da" />
<file path="../../third_party/launchpad_translations/inspector_strings_de.xtb" lang="de" />
<file path="../../third_party/launchpad_translations/inspector_strings_es.xtb" lang="es" />
+ <file path="../../third_party/launchpad_translations/inspector_strings_et.xtb" lang="et" />
<file path="../../third_party/launchpad_translations/inspector_strings_eu.xtb" lang="eu" />
<file path="../../third_party/launchpad_translations/inspector_strings_fi.xtb" lang="fi" />
<file path="../../third_party/launchpad_translations/inspector_strings_fr.xtb" lang="fr" />
diff --git a/webkit/glue/media/buffered_data_source.cc b/webkit/glue/media/buffered_data_source.cc
index 7902221..8aafd26 100644
--- a/webkit/glue/media/buffered_data_source.cc
+++ b/webkit/glue/media/buffered_data_source.cc
@@ -6,6 +6,7 @@
#include "media/base/filter_host.h"
#include "net/base/net_errors.h"
+#include "webkit/glue/media/web_data_source_factory.h"
#include "webkit/glue/webkit_glue.h"
using WebKit::WebFrame;
@@ -27,10 +28,25 @@ static const int kReadTrials = 3;
// of FFmpeg.
static const int kInitialReadBufferSize = 32768;
+static WebDataSource* NewBufferedDataSource(MessageLoop* render_loop,
+ WebKit::WebFrame* frame) {
+ return new BufferedDataSource(render_loop, frame);
+}
+
+// static
+media::DataSourceFactory* BufferedDataSource::CreateFactory(
+ MessageLoop* render_loop,
+ WebKit::WebFrame* frame,
+ WebDataSourceBuildObserverHack* build_observer) {
+ return new WebDataSourceFactory(render_loop, frame, &NewBufferedDataSource,
+ build_observer);
+}
+
BufferedDataSource::BufferedDataSource(
MessageLoop* render_loop,
WebFrame* frame)
: total_bytes_(kPositionNotSpecified),
+ buffered_bytes_(0),
loaded_(false),
streaming_(false),
frame_(frame),
@@ -48,6 +64,8 @@ BufferedDataSource::BufferedDataSource(
stop_signal_received_(false),
stopped_on_render_loop_(false),
media_is_paused_(true),
+ media_has_played_(false),
+ preload_(media::METADATA),
using_range_request_(true) {
}
@@ -73,18 +91,25 @@ base::TimeDelta BufferedDataSource::GetTimeoutMilliseconds() {
return base::TimeDelta::FromMilliseconds(kTimeoutMilliseconds);
}
-/////////////////////////////////////////////////////////////////////////////
-// media::Filter implementation.
+void BufferedDataSource::set_host(media::FilterHost* host) {
+ DataSource::set_host(host);
+
+ if (loader_.get())
+ UpdateHostState();
+}
+
void BufferedDataSource::Initialize(const std::string& url,
- media::FilterCallback* callback) {
+ media::PipelineStatusCallback* callback) {
// Saves the url.
url_ = GURL(url);
- if (!IsProtocolSupportedForMedia(url_)) {
- // This method is called on the thread where host() lives so it is safe
- // to make this call.
- host()->SetError(media::PIPELINE_ERROR_NETWORK);
- callback->Run();
+ // This data source doesn't support data:// protocol so reject it.
+ if (url_.SchemeIs(kDataScheme)) {
+ callback->Run(media::DATASOURCE_ERROR_URL_NOT_SUPPORTED);
+ delete callback;
+ return;
+ } else if (!IsProtocolSupportedForMedia(url_)) {
+ callback->Run(media::PIPELINE_ERROR_NETWORK);
delete callback;
return;
}
@@ -92,8 +117,6 @@ void BufferedDataSource::Initialize(const std::string& url,
DCHECK(callback);
initialize_callback_.reset(callback);
- media_format_.SetAsString(media::MediaFormat::kMimeType,
- media::mime_type::kApplicationOctetStream);
media_format_.SetAsString(media::MediaFormat::kURL, url);
// Post a task to complete the initialization task.
@@ -101,13 +124,18 @@ void BufferedDataSource::Initialize(const std::string& url,
NewRunnableMethod(this, &BufferedDataSource::InitializeTask));
}
-bool BufferedDataSource::IsUrlSupported(const std::string& url) {
- GURL gurl(url);
+void BufferedDataSource::CancelInitialize() {
+ base::AutoLock auto_lock(lock_);
+ DCHECK(initialize_callback_.get());
- // This data source doesn't support data:// protocol so reject it.
- return IsProtocolSupportedForMedia(gurl) && !gurl.SchemeIs(kDataScheme);
+ initialize_callback_.reset();
+
+ render_loop_->PostTask(
+ FROM_HERE, NewRunnableMethod(this, &BufferedDataSource::CleanupTask));
}
+/////////////////////////////////////////////////////////////////////////////
+// media::Filter implementation.
void BufferedDataSource::Stop(media::FilterCallback* callback) {
{
base::AutoLock auto_lock(lock_);
@@ -128,6 +156,12 @@ void BufferedDataSource::SetPlaybackRate(float playback_rate) {
playback_rate));
}
+void BufferedDataSource::SetPreload(media::Preload preload) {
+ render_loop_->PostTask(FROM_HERE,
+ NewRunnableMethod(this, &BufferedDataSource::SetPreloadTask,
+ preload));
+}
+
/////////////////////////////////////////////////////////////////////////////
// media::DataSource implementation.
void BufferedDataSource::Read(int64 position, size_t size, uint8* data,
@@ -174,15 +208,6 @@ bool BufferedDataSource::HasSingleOrigin() {
void BufferedDataSource::Abort() {
DCHECK(MessageLoop::current() == render_loop_);
- {
- base::AutoLock auto_lock(lock_);
-
- // If we are told to abort, immediately return from any pending read
- // with an error.
- if (read_callback_.get())
- DoneRead_Locked(net::ERR_FAILED);
- }
-
CleanupTask();
frame_ = NULL;
}
@@ -192,7 +217,7 @@ void BufferedDataSource::Abort() {
void BufferedDataSource::InitializeTask() {
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(!loader_.get());
- if (stopped_on_render_loop_)
+ if (stopped_on_render_loop_ || !initialize_callback_.get())
return;
// Kick starts the watch dog task that will handle connection timeout.
@@ -256,7 +281,13 @@ void BufferedDataSource::CleanupTask() {
if (stopped_on_render_loop_)
return;
- read_callback_.reset();
+ // Signal that stop task has finished execution.
+ // NOTE: it's vital that this be set under lock, as that's how Read() tests
+ // before registering a new |read_callback_| (which is cleared below).
+ stopped_on_render_loop_ = true;
+
+ if (read_callback_.get())
+ DoneRead_Locked(net::ERR_FAILED);
}
// Stop the watch dog.
@@ -272,9 +303,6 @@ void BufferedDataSource::CleanupTask() {
read_buffer_ = 0;
read_submitted_time_ = base::Time();
read_attempts_ = 0;
-
- // Signal that stop task has finished execution.
- stopped_on_render_loop_ = true;
}
void BufferedDataSource::RestartLoadingTask() {
@@ -290,7 +318,8 @@ void BufferedDataSource::RestartLoadingTask() {
}
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified);
- loader_->SetAllowDefer(!media_is_paused_);
+ BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy();
+ loader_->UpdateDeferStrategy(strategy);
loader_->Start(
NewCallback(this, &BufferedDataSource::PartialReadStartCallback),
NewCallback(this, &BufferedDataSource::NetworkEventCallback),
@@ -326,7 +355,8 @@ void BufferedDataSource::WatchDogTask() {
// retry the request.
loader_->Stop();
loader_ = CreateResourceLoader(read_position_, kPositionNotSpecified);
- loader_->SetAllowDefer(!media_is_paused_);
+ BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy();
+ loader_->UpdateDeferStrategy(strategy);
loader_->Start(
NewCallback(this, &BufferedDataSource::PartialReadStartCallback),
NewCallback(this, &BufferedDataSource::NetworkEventCallback),
@@ -340,13 +370,37 @@ void BufferedDataSource::SetPlaybackRateTask(float playback_rate) {
bool previously_paused = media_is_paused_;
media_is_paused_ = (playback_rate == 0.0);
- // Disallow deferring data when we are pausing, allow deferring data
- // when we resume playing.
- if (previously_paused && !media_is_paused_) {
- loader_->SetAllowDefer(true);
- } else if (!previously_paused && media_is_paused_) {
- loader_->SetAllowDefer(false);
+ if (!media_has_played_ && previously_paused && !media_is_paused_)
+ media_has_played_ = true;
+
+ BufferedResourceLoader::DeferStrategy strategy = ChooseDeferStrategy();
+ loader_->UpdateDeferStrategy(strategy);
+}
+
+void BufferedDataSource::SetPreloadTask(media::Preload preload) {
+ DCHECK(MessageLoop::current() == render_loop_);
+ preload_ = preload;
+}
+
+BufferedResourceLoader::DeferStrategy
+BufferedDataSource::ChooseDeferStrategy() {
+ // If the user indicates preload=metadata, then just load exactly
+ // what is needed for starting the pipeline and prerolling frames.
+ if (preload_ == media::METADATA && !media_has_played_)
+ return BufferedResourceLoader::kReadThenDefer;
+
+ // In general, we want to try to buffer the entire video when the video
+ // is paused. But we don't want to do this if the video hasn't played yet
+ // and preload!=auto.
+ if (media_is_paused_ &&
+ (preload_ == media::AUTO || media_has_played_)) {
+ return BufferedResourceLoader::kNeverDefer;
}
+
+ // When the video is playing, regardless of preload state, we buffer up
+ // to a hard limit and enable/disable deferring when the buffer is
+ // depleted/full.
+ return BufferedResourceLoader::kThresholdDefer;
}
// This method is the place where actual read happens, |loader_| must be valid
@@ -386,13 +440,15 @@ void BufferedDataSource::DoneRead_Locked(int error) {
read_buffer_ = 0;
}
-void BufferedDataSource::DoneInitialization_Locked() {
+void BufferedDataSource::DoneInitialization_Locked(
+ media::PipelineStatus status) {
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(initialize_callback_.get());
lock_.AssertAcquired();
- initialize_callback_->Run();
- initialize_callback_.reset();
+ scoped_ptr<media::PipelineStatusCallback> initialize_callback(
+ initialize_callback_.release());
+ initialize_callback->Run(status);
}
/////////////////////////////////////////////////////////////////////////////
@@ -402,15 +458,20 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
DCHECK(loader_.get());
int64 instance_size = loader_->instance_size();
- bool partial_response = loader_->partial_response();
bool success = error == net::OK;
+ if (!initialize_callback_.get()) {
+ loader_->Stop();
+ return;
+ }
+
if (success) {
// TODO(hclam): Needs more thinking about supporting servers without range
// request or their partial response is not complete.
total_bytes_ = instance_size;
loaded_ = false;
- streaming_ = (instance_size == kPositionNotSpecified) || !partial_response;
+ streaming_ = (instance_size == kPositionNotSpecified) ||
+ !loader_->range_supported();
} else {
// TODO(hclam): In case of failure, we can retry several times.
loader_->Stop();
@@ -429,85 +490,90 @@ void BufferedDataSource::HttpInitialStartCallback(int error) {
return;
}
- // We need to prevent calling to filter host and running the callback if
- // we have received the stop signal. We need to lock down the whole callback
- // method to prevent bad things from happening. The reason behind this is
- // that we cannot guarantee tasks on render thread have completely stopped
- // when we receive the Stop() method call. The only way to solve this is to
- // let tasks on render thread to run but make sure they don't call outside
- // this object when Stop() method is ever called. Locking this method is safe
- // because |lock_| is only acquired in tasks on render thread.
- base::AutoLock auto_lock(lock_);
- if (stop_signal_received_)
- return;
+ // Reference to prevent destruction while inside the |initialize_callback_|
+ // call. This is a temporary fix to prevent crashes caused by holding the
+ // lock and running the destructor.
+ // TODO: Review locking in this class and figure out a way to run the callback
+ // w/o the lock.
+ scoped_refptr<BufferedDataSource> destruction_guard(this);
+ {
+ // We need to prevent calling to filter host and running the callback if
+ // we have received the stop signal. We need to lock down the whole callback
+ // method to prevent bad things from happening. The reason behind this is
+ // that we cannot guarantee tasks on render thread have completely stopped
+ // when we receive the Stop() method call. The only way to solve this is to
+ // let tasks on render thread to run but make sure they don't call outside
+ // this object when Stop() method is ever called. Locking this method is
+ // safe because |lock_| is only acquired in tasks on render thread.
+ base::AutoLock auto_lock(lock_);
+ if (stop_signal_received_)
+ return;
- if (!success) {
- host()->SetError(media::PIPELINE_ERROR_NETWORK);
- DoneInitialization_Locked();
- return;
- }
+ if (!success) {
+ DoneInitialization_Locked(media::PIPELINE_ERROR_NETWORK);
+ return;
+ }
- if (streaming_) {
- // If the server didn't reply with an instance size, it is likely this
- // is a streaming response.
- host()->SetStreaming(true);
- } else {
- // This value governs the range that we can seek to.
- // TODO(hclam): Report the correct value of buffered bytes.
- host()->SetTotalBytes(total_bytes_);
- host()->SetBufferedBytes(0);
+ UpdateHostState();
+ DoneInitialization_Locked(media::PIPELINE_OK);
}
-
- // Currently, only files can be used reliably w/o a network.
- host()->SetLoaded(false);
- DoneInitialization_Locked();
}
void BufferedDataSource::NonHttpInitialStartCallback(int error) {
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(loader_.get());
+ if (!initialize_callback_.get()) {
+ loader_->Stop();
+ return;
+ }
+
int64 instance_size = loader_->instance_size();
bool success = error == net::OK && instance_size != kPositionNotSpecified;
if (success) {
total_bytes_ = instance_size;
+ buffered_bytes_ = total_bytes_;
loaded_ = true;
} else {
loader_->Stop();
}
- // We need to prevent calling to filter host and running the callback if
- // we have received the stop signal. We need to lock down the whole callback
- // method to prevent bad things from happening. The reason behind this is
- // that we cannot guarantee tasks on render thread have completely stopped
- // when we receive the Stop() method call. The only way to solve this is to
- // let tasks on render thread to run but make sure they don't call outside
- // this object when Stop() method is ever called. Locking this method is safe
- // because |lock_| is only acquired in tasks on render thread.
- base::AutoLock auto_lock(lock_);
- if (stop_signal_received_)
- return;
+ // Reference to prevent destruction while inside the |initialize_callback_|
+ // call. This is a temporary fix to prevent crashes caused by holding the
+ // lock and running the destructor.
+ // TODO: Review locking in this class and figure out a way to run the callback
+ // w/o the lock.
+ scoped_refptr<BufferedDataSource> destruction_guard(this);
+ {
+ // We need to prevent calling to filter host and running the callback if
+ // we have received the stop signal. We need to lock down the whole callback
+ // method to prevent bad things from happening. The reason behind this is
+ // that we cannot guarantee tasks on render thread have completely stopped
+ // when we receive the Stop() method call. The only way to solve this is to
+ // let tasks on render thread to run but make sure they don't call outside
+ // this object when Stop() method is ever called. Locking this method is
+ // safe because |lock_| is only acquired in tasks on render thread.
+ base::AutoLock auto_lock(lock_);
+ if (stop_signal_received_ || !initialize_callback_.get())
+ return;
- if (success) {
- host()->SetTotalBytes(total_bytes_);
- host()->SetBufferedBytes(total_bytes_);
- host()->SetLoaded(loaded_);
- } else {
- host()->SetError(media::PIPELINE_ERROR_NETWORK);
+ if (!success) {
+ DoneInitialization_Locked(media::PIPELINE_ERROR_NETWORK);
+ return;
+ }
+
+ UpdateHostState();
+ DoneInitialization_Locked(media::PIPELINE_OK);
}
- DoneInitialization_Locked();
}
void BufferedDataSource::PartialReadStartCallback(int error) {
DCHECK(MessageLoop::current() == render_loop_);
DCHECK(loader_.get());
- // This callback method is invoked after we have verified the server has
- // range request capability, so as a safety guard verify again the response
- // is partial.
- if (error == net::OK && loader_->partial_response()) {
- // Once the range request has started successfully, we can proceed with
+ if (error == net::OK) {
+ // Once the request has started successfully, we can proceed with
// reading from it.
ReadInternal();
return;
@@ -562,6 +628,14 @@ void BufferedDataSource::ReadCallback(int error) {
// If a position error code is received, read was successful. So copy
// from intermediate read buffer to the target read buffer.
memcpy(read_buffer_, intermediate_read_buffer_.get(), error);
+ } else if (error == 0 && total_bytes_ == kPositionNotSpecified) {
+ // We've reached the end of the file and we didn't know the total size
+ // before. Update the total size so Read()s past the end of the file will
+ // fail like they would if we had known the file size at the beginning.
+ total_bytes_ = loader_->instance_size();
+
+ if (host() && total_bytes_ != kPositionNotSpecified)
+ host()->SetTotalBytes(total_bytes_);
}
DoneRead_Locked(error);
}
@@ -596,9 +670,28 @@ void BufferedDataSource::NetworkEventCallback() {
if (network_activity != network_activity_) {
network_activity_ = network_activity;
- host()->SetNetworkActivity(network_activity);
+ if (host())
+ host()->SetNetworkActivity(network_activity);
+ }
+
+ buffered_bytes_ = buffered_position + 1;
+ if (host())
+ host()->SetBufferedBytes(buffered_bytes_);
+}
+
+void BufferedDataSource::UpdateHostState() {
+ media::FilterHost* filter_host = host();
+ if (!filter_host)
+ return;
+
+ filter_host->SetLoaded(loaded_);
+
+ if (streaming_) {
+ filter_host->SetStreaming(true);
+ } else {
+ filter_host->SetTotalBytes(total_bytes_);
+ filter_host->SetBufferedBytes(buffered_bytes_);
}
- host()->SetBufferedBytes(buffered_position + 1);
}
} // namespace webkit_glue
diff --git a/webkit/glue/media/buffered_data_source.h b/webkit/glue/media/buffered_data_source.h
index 895b259..933ffb9 100644
--- a/webkit/glue/media/buffered_data_source.h
+++ b/webkit/glue/media/buffered_data_source.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,23 +8,29 @@
#include <string>
#include "base/callback.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "base/synchronization/lock.h"
+#include "media/base/filter_factories.h"
+#include "media/base/filters.h"
#include "webkit/glue/media/buffered_resource_loader.h"
namespace webkit_glue {
class BufferedDataSource : public WebDataSource {
public:
+ // Creates a DataSourceFactory for building BufferedDataSource objects.
+ static media::DataSourceFactory* CreateFactory(
+ MessageLoop* render_loop,
+ WebKit::WebFrame* frame,
+ WebDataSourceBuildObserverHack* build_observer);
+
BufferedDataSource(MessageLoop* render_loop,
WebKit::WebFrame* frame);
virtual ~BufferedDataSource();
// media::Filter implementation.
- virtual void Initialize(const std::string& url,
- media::FilterCallback* callback);
- virtual bool IsUrlSupported(const std::string& url);
+ virtual void set_host(media::FilterHost* host);
virtual void Stop(media::FilterCallback* callback);
virtual void SetPlaybackRate(float playback_rate);
@@ -35,12 +41,16 @@ class BufferedDataSource : public WebDataSource {
media::DataSource::ReadCallback* read_callback);
virtual bool GetSize(int64* size_out);
virtual bool IsStreaming();
+ virtual void SetPreload(media::Preload preload);
const media::MediaFormat& media_format() {
return media_format_;
}
// webkit_glue::WebDataSource implementation.
+ virtual void Initialize(const std::string& url,
+ media::PipelineStatusCallback* callback);
+ virtual void CancelInitialize();
virtual bool HasSingleOrigin();
virtual void Abort();
@@ -82,6 +92,13 @@ class BufferedDataSource : public WebDataSource {
// and signals the buffered resource loader accordingly.
void SetPlaybackRateTask(float playback_rate);
+ // This task saves the preload value for the media.
+ void SetPreloadTask(media::Preload preload);
+
+ // Decides which DeferStrategy to used based on the current state of the
+ // BufferedDataSource.
+ BufferedResourceLoader::DeferStrategy ChooseDeferStrategy();
+
// The method that performs actual read. This method can only be executed on
// the render thread.
void ReadInternal();
@@ -90,7 +107,7 @@ class BufferedDataSource : public WebDataSource {
void DoneRead_Locked(int error);
// Calls |initialize_callback_| and reset it.
- void DoneInitialization_Locked();
+ void DoneInitialization_Locked(media::PipelineStatus status);
// Callback method for |loader_| if URL for the resource requested is using
// HTTP protocol. This method is called when response for initial request is
@@ -116,6 +133,8 @@ class BufferedDataSource : public WebDataSource {
// Callback method when a network event is received.
void NetworkEventCallback();
+ void UpdateHostState();
+
media::MediaFormat media_format_;
// URL of the resource requested.
@@ -126,6 +145,7 @@ class BufferedDataSource : public WebDataSource {
// member is guaranteed to happen after it is first written, so we don't
// need to protect it.
int64 total_bytes_;
+ int64 buffered_bytes_;
// True if this data source is considered loaded.
bool loaded_;
@@ -144,7 +164,7 @@ class BufferedDataSource : public WebDataSource {
bool network_activity_;
// Callback method from the pipeline for initialization.
- scoped_ptr<media::FilterCallback> initialize_callback_;
+ scoped_ptr<media::PipelineStatusCallback> initialize_callback_;
// Read parameters received from the Read() method call.
scoped_ptr<media::DataSource::ReadCallback> read_callback_;
@@ -185,6 +205,14 @@ class BufferedDataSource : public WebDataSource {
// are in a playing state.
bool media_is_paused_;
+ // This variable is true when the user has requested the video to play at
+ // least once.
+ bool media_has_played_;
+
+ // This variable holds the value of the preload attribute for the video
+ // element.
+ media::Preload preload_;
+
// This timer is to run the WatchDogTask repeatedly. We use a timer instead
// of doing PostDelayedTask() reduce the extra reference held by the message
// loop. The RepeatingTimer does PostDelayedTask() internally, by using it
diff --git a/webkit/glue/media/buffered_data_source_unittest.cc b/webkit/glue/media/buffered_data_source_unittest.cc
index 41f37d6..528a66f 100644
--- a/webkit/glue/media/buffered_data_source_unittest.cc
+++ b/webkit/glue/media/buffered_data_source_unittest.cc
@@ -76,7 +76,7 @@ class MockBufferedResourceLoader : public BufferedResourceLoader {
net::CompletionCallback* callback));
MOCK_METHOD0(content_length, int64());
MOCK_METHOD0(instance_size, int64());
- MOCK_METHOD0(partial_response, bool());
+ MOCK_METHOD0(range_supported, bool());
MOCK_METHOD0(network_activity, bool());
MOCK_METHOD0(url, const GURL&());
MOCK_METHOD0(GetBufferedFirstBytePosition, int64());
@@ -164,10 +164,14 @@ class BufferedDataSourceTest : public testing::Test {
ON_CALL(*loader_, instance_size())
.WillByDefault(Return(instance_size));
- ON_CALL(*loader_, partial_response())
+
+ // range_supported() return true if we expect to get a partial response.
+ ON_CALL(*loader_, range_supported())
.WillByDefault(Return(partial_response));
+
ON_CALL(*loader_, url())
.WillByDefault(ReturnRef(gurl_));
+ media::PipelineStatus expected_init_status = media::PIPELINE_OK;
if (initialized_ok) {
// Expected loaded or not.
EXPECT_CALL(host_, SetLoaded(loaded));
@@ -183,12 +187,13 @@ class BufferedDataSourceTest : public testing::Test {
EXPECT_CALL(host_, SetStreaming(true));
}
} else {
- EXPECT_CALL(host_, SetError(media::PIPELINE_ERROR_NETWORK));
+ expected_init_status = media::PIPELINE_ERROR_NETWORK;
EXPECT_CALL(*loader_, Stop());
}
// Actual initialization of the data source.
- data_source_->Initialize(url, media::NewExpectedCallback());
+ data_source_->Initialize(url,
+ media::NewExpectedStatusCallback(expected_init_status));
message_loop_->RunAllPending();
if (initialized_ok) {
@@ -275,7 +280,7 @@ class BufferedDataSourceTest : public testing::Test {
loader_ = NULL;
}
- void ReadDataSourceMiss(int64 position, int size) {
+ void ReadDataSourceMiss(int64 position, int size, int start_error) {
EXPECT_TRUE(loader_);
// 1. Reply with a cache miss for the read.
@@ -296,19 +301,26 @@ class BufferedDataSourceTest : public testing::Test {
// 3. Then the new loader will be started.
EXPECT_CALL(*new_loader, Start(NotNull(), NotNull(), NotNull()))
- .WillOnce(DoAll(Assign(&error_, net::OK),
+ .WillOnce(DoAll(Assign(&error_, start_error),
Invoke(this,
&BufferedDataSourceTest::InvokeStartCallback)));
- EXPECT_CALL(*new_loader, partial_response())
- .WillRepeatedly(Return(loader_->partial_response()));
- // 4. Then again a read request is made to the new loader.
- EXPECT_CALL(*new_loader, Read(position, size, NotNull(), NotNull()))
- .WillOnce(DoAll(Assign(&error_, size),
- Invoke(this,
- &BufferedDataSourceTest::InvokeReadCallback)));
+ if (start_error == net::OK) {
+ EXPECT_CALL(*new_loader, range_supported())
+ .WillRepeatedly(Return(loader_->range_supported()));
- EXPECT_CALL(*this, ReadCallback(size));
+ // 4a. Then again a read request is made to the new loader.
+ EXPECT_CALL(*new_loader, Read(position, size, NotNull(), NotNull()))
+ .WillOnce(DoAll(Assign(&error_, size),
+ Invoke(this,
+ &BufferedDataSourceTest::InvokeReadCallback)));
+
+ EXPECT_CALL(*this, ReadCallback(size));
+ } else {
+ // 4b. The read callback is called with an error because Start() on the
+ // new loader returned an error.
+ EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError));
+ }
data_source_->Read(
position, size, buffer_,
@@ -316,7 +328,8 @@ class BufferedDataSourceTest : public testing::Test {
message_loop_->RunAllPending();
// Make sure data is correct.
- EXPECT_EQ(0, memcmp(buffer_, data_ + static_cast<int>(position), size));
+ if (start_error == net::OK)
+ EXPECT_EQ(0, memcmp(buffer_, data_ + static_cast<int>(position), size));
loader_ = new_loader;
}
@@ -365,8 +378,8 @@ class BufferedDataSourceTest : public testing::Test {
.WillOnce(DoAll(Assign(&error_, net::OK),
Invoke(this,
&BufferedDataSourceTest::InvokeStartCallback)));
- EXPECT_CALL(*new_loader, partial_response())
- .WillRepeatedly(Return(loader_->partial_response()));
+ EXPECT_CALL(*new_loader, range_supported())
+ .WillRepeatedly(Return(loader_->range_supported()));
// 4. Then again a read request is made to the new loader.
EXPECT_CALL(*new_loader, Read(position, size, NotNull(), NotNull()))
@@ -457,8 +470,17 @@ TEST_F(BufferedDataSourceTest, ReadCacheHit) {
TEST_F(BufferedDataSourceTest, ReadCacheMiss) {
InitializeDataSource(kHttpUrl, net::OK, true, 1024, LOADING);
- ReadDataSourceMiss(1000, 10);
- ReadDataSourceMiss(20, 10);
+ ReadDataSourceMiss(1000, 10, net::OK);
+ ReadDataSourceMiss(20, 10, net::OK);
+ StopDataSource();
+}
+
+// Test the case where the initial response from the server indicates that
+// Range requests are supported, but a later request prove otherwise.
+TEST_F(BufferedDataSourceTest, ServerLiesAboutRangeSupport) {
+ InitializeDataSource(kHttpUrl, net::OK, true, 1024, LOADING);
+ ReadDataSourceHit(10, 10, 10);
+ ReadDataSourceMiss(1000, 10, net::ERR_INVALID_RESPONSE);
StopDataSource();
}
diff --git a/webkit/glue/media/buffered_resource_loader.cc b/webkit/glue/media/buffered_resource_loader.cc
index 4a3ae8b..8d7f1dd 100644
--- a/webkit/glue/media/buffered_resource_loader.cc
+++ b/webkit/glue/media/buffered_resource_loader.cc
@@ -50,10 +50,10 @@ BufferedResourceLoader::BufferedResourceLoader(
int64 last_byte_position)
: buffer_(new media::SeekableBuffer(kBackwardCapcity, kForwardCapacity)),
deferred_(false),
- defer_allowed_(true),
+ defer_strategy_(kReadThenDefer),
completed_(false),
range_requested_(false),
- partial_response_(false),
+ range_supported_(false),
url_(url),
first_byte_position_(first_byte_position),
last_byte_position_(last_byte_position),
@@ -90,7 +90,6 @@ void BufferedResourceLoader::Start(net::CompletionCallback* start_callback,
event_callback_.reset(event_callback);
if (first_byte_position_ != kPositionNotSpecified) {
- range_requested_ = true;
// TODO(hclam): server may not support range request so |offset_| may not
// equal to |first_byte_position_|.
offset_ = first_byte_position_;
@@ -103,10 +102,14 @@ void BufferedResourceLoader::Start(net::CompletionCallback* start_callback,
// Prepare the request.
WebURLRequest request(url_);
request.setTargetType(WebURLRequest::TargetIsMedia);
- request.setHTTPHeaderField(WebString::fromUTF8("Range"),
- WebString::fromUTF8(GenerateHeaders(
- first_byte_position_,
- last_byte_position_)));
+
+ if (IsRangeRequest()) {
+ range_requested_ = true;
+ request.setHTTPHeaderField(WebString::fromUTF8("Range"),
+ WebString::fromUTF8(GenerateHeaders(
+ first_byte_position_,
+ last_byte_position_)));
+ }
frame->setReferrerForRequest(request, WebKit::WebURL());
// This flag is for unittests as we don't want to reset |url_loader|
@@ -180,10 +183,15 @@ void BufferedResourceLoader::Read(int64 position,
// If we can serve the request now, do the actual read.
if (CanFulfillRead()) {
ReadInternal();
- DisableDeferIfNeeded();
+ UpdateDeferBehavior();
return;
}
+ // If you're deferred and you can't fulfill the read because you don't have
+ // enough data, you will never fulfill the read.
+ // Update defer behavior to re-enable deferring if need be.
+ UpdateDeferBehavior();
+
// If we expected the read request to be fulfilled later, returns
// immediately and let more data to flow in.
if (WillFulfillRead())
@@ -199,11 +207,6 @@ int64 BufferedResourceLoader::GetBufferedPosition() {
return kPositionNotSpecified;
}
-void BufferedResourceLoader::SetAllowDefer(bool is_allowed) {
- defer_allowed_ = is_allowed;
- DisableDeferIfNeeded();
-}
-
int64 BufferedResourceLoader::content_length() {
return content_length_;
}
@@ -212,8 +215,8 @@ int64 BufferedResourceLoader::instance_size() {
return instance_size_;
}
-bool BufferedResourceLoader::partial_response() {
- return partial_response_;
+bool BufferedResourceLoader::range_supported() {
+ return range_supported_;
}
bool BufferedResourceLoader::network_activity() {
@@ -244,7 +247,7 @@ void BufferedResourceLoader::willSendRequest(
return;
}
- // Only allow |single_origin_| if we haven't seen a different origin yet.
+ // Only allow |single_origin_| if we haven't seen a different origin yet.
if (single_origin_)
single_origin_ = url_.GetOrigin() == GURL(newRequest.url()).GetOrigin();
@@ -274,6 +277,8 @@ void BufferedResourceLoader::didReceiveResponse(
if (!start_callback_.get())
return;
+ bool partial_response = false;
+
// We make a strong assumption that when we reach here we have either
// received a response from HTTP/HTTPS protocol or the request was
// successful (in particular range request). So we only verify the partial
@@ -281,13 +286,20 @@ void BufferedResourceLoader::didReceiveResponse(
if (url_.SchemeIs(kHttpScheme) || url_.SchemeIs(kHttpsScheme)) {
int error = net::OK;
- if (response.httpStatusCode() == kHttpPartialContent)
- partial_response_ = true;
+ // Check to see whether the server supports byte ranges.
+ std::string accept_ranges =
+ response.httpHeaderField("Accept-Ranges").utf8();
+ range_supported_ = (accept_ranges.find("bytes") != std::string::npos);
+
+ partial_response = (response.httpStatusCode() == kHttpPartialContent);
- if (range_requested_ && partial_response_) {
+ if (range_requested_) {
// If we have verified the partial response and it is correct, we will
- // return net::OK.
- if (!VerifyPartialResponse(response))
+ // return net::OK. It's also possible for a server to support range
+ // requests without advertising Accept-Ranges: bytes.
+ if (partial_response && VerifyPartialResponse(response))
+ range_supported_ = true;
+ else
error = net::ERR_INVALID_RESPONSE;
} else if (response.httpStatusCode() != kHttpOK) {
// We didn't request a range but server didn't reply with "200 OK".
@@ -302,7 +314,7 @@ void BufferedResourceLoader::didReceiveResponse(
} else {
// For any protocol other than HTTP and HTTPS, assume range request is
// always fulfilled.
- partial_response_ = range_requested_;
+ partial_response = range_requested_;
}
// Expected content length can be |kPositionNotSpecified|, in that case
@@ -311,7 +323,7 @@ void BufferedResourceLoader::didReceiveResponse(
// If we have not requested a range, then the size of the instance is equal
// to the content length.
- if (!partial_response_)
+ if (!partial_response)
instance_size_ = content_length_;
// Calls with a successful response.
@@ -321,7 +333,8 @@ void BufferedResourceLoader::didReceiveResponse(
void BufferedResourceLoader::didReceiveData(
WebURLLoader* loader,
const char* data,
- int data_length) {
+ int data_length,
+ int encoded_data_length) {
DCHECK(!completed_);
DCHECK_GT(data_length, 0);
@@ -334,21 +347,19 @@ void BufferedResourceLoader::didReceiveData(
buffer_->Append(reinterpret_cast<const uint8*>(data), data_length);
// If there is an active read request, try to fulfill the request.
- if (HasPendingRead() && CanFulfillRead()) {
+ if (HasPendingRead() && CanFulfillRead())
ReadInternal();
- } else if (!defer_allowed_) {
- // If we're not allowed to defer, slide the buffer window forward instead
- // of deferring.
- if (buffer_->forward_bytes() > buffer_->forward_capacity()) {
- size_t excess = buffer_->forward_bytes() - buffer_->forward_capacity();
- bool success = buffer_->Seek(excess);
- DCHECK(success);
- offset_ += first_offset_ + excess;
- }
- }
// At last see if the buffer is full and we need to defer the downloading.
- EnableDeferIfNeeded();
+ UpdateDeferBehavior();
+
+ // Consume excess bytes from our in-memory buffer if necessary.
+ if (buffer_->forward_bytes() > buffer_->forward_capacity()) {
+ size_t excess = buffer_->forward_bytes() - buffer_->forward_capacity();
+ bool success = buffer_->Seek(excess);
+ DCHECK(success);
+ offset_ += first_offset_ + excess;
+ }
// Notify that we have received some data.
NotifyNetworkEvent();
@@ -373,6 +384,11 @@ void BufferedResourceLoader::didFinishLoading(
DCHECK(!completed_);
completed_ = true;
+ // If we didn't know the |instance_size_| we do now.
+ if (instance_size_ == kPositionNotSpecified) {
+ instance_size_ = offset_ + buffer_->forward_bytes();
+ }
+
// If there is a start callback, calls it.
if (start_callback_.get()) {
DoneStart(net::OK);
@@ -431,32 +447,83 @@ bool BufferedResourceLoader::HasSingleOrigin() const {
/////////////////////////////////////////////////////////////////////////////
// Helper methods.
-void BufferedResourceLoader::EnableDeferIfNeeded() {
- if (!defer_allowed_)
+void BufferedResourceLoader::UpdateDeferBehavior() {
+ if (!url_loader_.get() || !buffer_.get())
return;
- if (!deferred_ &&
- buffer_->forward_bytes() >= buffer_->forward_capacity()) {
- deferred_ = true;
+ if ((deferred_ && ShouldDisableDefer()) ||
+ (!deferred_ && ShouldEnableDefer())) {
+ bool eventOccurred = ToggleDeferring();
+ if (eventOccurred)
+ NotifyNetworkEvent();
+ }
+}
- if (url_loader_.get())
- url_loader_->setDefersLoading(true);
+void BufferedResourceLoader::UpdateDeferStrategy(DeferStrategy strategy) {
+ defer_strategy_ = strategy;
+ UpdateDeferBehavior();
+}
- NotifyNetworkEvent();
+bool BufferedResourceLoader::ShouldEnableDefer() {
+ // If we're already deferring, then enabling makes no sense.
+ if (deferred_)
+ return false;
+
+ switch(defer_strategy_) {
+ // Never defer at all, so never enable defer.
+ case kNeverDefer:
+ return false;
+
+ // Defer if nothing is being requested.
+ case kReadThenDefer:
+ return !read_callback_.get();
+
+ // Defer if we've reached the max capacity of the threshold.
+ case kThresholdDefer:
+ return buffer_->forward_bytes() >= buffer_->forward_capacity();
}
+ // Otherwise don't enable defer.
+ return false;
}
-void BufferedResourceLoader::DisableDeferIfNeeded() {
- if (deferred_ &&
- (!defer_allowed_ ||
- buffer_->forward_bytes() < buffer_->forward_capacity() / 2)) {
- deferred_ = false;
+bool BufferedResourceLoader::ShouldDisableDefer() {
+ // If we're not deferring, then disabling makes no sense.
+ if (!deferred_)
+ return false;
- if (url_loader_.get())
- url_loader_->setDefersLoading(false);
+ switch(defer_strategy_) {
+ // Always disable deferring.
+ case kNeverDefer:
+ return true;
+
+ // We have an outstanding read request, and we have not buffered enough
+ // yet to fulfill the request; disable defer to get more data.
+ case kReadThenDefer: {
+ size_t amount_buffered = buffer_->forward_bytes();
+ size_t amount_to_read = static_cast<size_t>(read_size_);
+ return read_callback_.get() && amount_buffered < amount_to_read;
+ }
- NotifyNetworkEvent();
+ // We have less than half the capacity of our threshold, so
+ // disable defer to get more data.
+ case kThresholdDefer: {
+ size_t amount_buffered = buffer_->forward_bytes();
+ size_t half_capacity = buffer_->forward_capacity() / 2;
+ return amount_buffered < half_capacity;
+ }
}
+
+ // Otherwise keep deferring.
+ return false;
+}
+
+bool BufferedResourceLoader::ToggleDeferring() {
+ deferred_ = !deferred_;
+ if (url_loader_.get()) {
+ url_loader_->setDefersLoading(deferred_);
+ return true;
+ }
+ return false;
}
bool BufferedResourceLoader::CanFulfillRead() {
@@ -579,4 +646,8 @@ void BufferedResourceLoader::NotifyNetworkEvent() {
event_callback_->Run();
}
+bool BufferedResourceLoader::IsRangeRequest() const {
+ return first_byte_position_ != kPositionNotSpecified;
+}
+
} // namespace webkit_glue
diff --git a/webkit/glue/media/buffered_resource_loader.h b/webkit/glue/media/buffered_resource_loader.h
index fe01fb4..39e89d8 100644
--- a/webkit/glue/media/buffered_resource_loader.h
+++ b/webkit/glue/media/buffered_resource_loader.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,7 +8,7 @@
#include <string>
#include "base/callback.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "base/timer.h"
#include "googleurl/src/gurl.h"
#include "media/base/seekable_buffer.h"
@@ -36,6 +36,15 @@ class BufferedResourceLoader :
public base::RefCountedThreadSafe<BufferedResourceLoader>,
public WebKit::WebURLLoaderClient {
public:
+ // kNeverDefer - Aggresively buffer; never defer loading while paused.
+ // kReadThenDefer - Request only enough data to fulfill read requests.
+ // kThresholdDefer - Try to keep amount of buffered data at a threshold.
+ enum DeferStrategy {
+ kNeverDefer,
+ kReadThenDefer,
+ kThresholdDefer,
+ };
+
typedef Callback0::Type NetworkEventCallback;
// |url| - URL for the resource to be loaded.
@@ -85,9 +94,6 @@ class BufferedResourceLoader :
// |kPositionNotSpecified| if such value is not available.
virtual int64 GetBufferedPosition();
- // Sets whether deferring data is allowed or disallowed.
- virtual void SetAllowDefer(bool is_allowed);
-
// Gets the content length in bytes of the instance after this loader has been
// started. If this value is |kPositionNotSpecified|, then content length is
// unknown.
@@ -97,9 +103,8 @@ class BufferedResourceLoader :
// |kPositionNotSpecified|, then the size is unknown.
virtual int64 instance_size();
- // Returns true if the response for this loader is a partial response.
- // It means a 206 response in HTTP/HTTPS protocol.
- virtual bool partial_response();
+ // Returns true if the server supports byte range requests.
+ virtual bool range_supported();
// Returns true if network is currently active.
virtual bool network_activity();
@@ -124,11 +129,12 @@ class BufferedResourceLoader :
const WebKit::WebURLResponse& response);
virtual void didDownloadData(
WebKit::WebURLLoader* loader,
- int dataLength);
+ int data_length);
virtual void didReceiveData(
WebKit::WebURLLoader* loader,
const char* data,
- int dataLength);
+ int data_length,
+ int encoded_data_length);
virtual void didReceiveCachedMetadata(
WebKit::WebURLLoader* loader,
const char* data, int dataLength);
@@ -141,19 +147,30 @@ class BufferedResourceLoader :
bool HasSingleOrigin() const;
+ // Sets the defer strategy to the given value.
+ void UpdateDeferStrategy(DeferStrategy strategy);
+
protected:
friend class base::RefCountedThreadSafe<BufferedResourceLoader>;
-
virtual ~BufferedResourceLoader();
private:
friend class BufferedResourceLoaderTest;
- // Defer the resource loading if the buffer is full.
- void EnableDeferIfNeeded();
+ // Toggles whether the resource loading is deferred or not.
+ // Returns true if a network event was fired.
+ bool ToggleDeferring();
- // Disable defer loading if we are under-buffered.
- void DisableDeferIfNeeded();
+ // Returns true if we should defer resource loading, based
+ // on current buffering scheme.
+ bool ShouldEnableDefer();
+
+ // Returns true if we should enable resource loading, based
+ // on current buffering scheme.
+ bool ShouldDisableDefer();
+
+ // Updates deferring behavior based on current buffering scheme.
+ void UpdateDeferBehavior();
// Returns true if the current read request can be fulfilled by what is in
// the buffer.
@@ -190,14 +207,17 @@ class BufferedResourceLoader :
bool HasPendingRead() { return read_callback_.get() != NULL; }
+ // Helper function that returns true if a range request was specified.
+ bool IsRangeRequest() const;
+
// A sliding window of buffer.
scoped_ptr<media::SeekableBuffer> buffer_;
// True if resource loading was deferred.
bool deferred_;
- // True if resource loader is allowed to defer, false otherwise.
- bool defer_allowed_;
+ // Current buffering algorithm in place for resource loading.
+ DeferStrategy defer_strategy_;
// True if resource loading has completed.
bool completed_;
@@ -205,8 +225,8 @@ class BufferedResourceLoader :
// True if a range request was made.
bool range_requested_;
- // True if response data received is a partial range.
- bool partial_response_;
+ // True if Range header is supported.
+ bool range_supported_;
// Does the work of loading and sends data back to this client.
scoped_ptr<WebKit::WebURLLoader> url_loader_;
diff --git a/webkit/glue/media/buffered_resource_loader_unittest.cc b/webkit/glue/media/buffered_resource_loader_unittest.cc
index aef44ca..03fd360 100644
--- a/webkit/glue/media/buffered_resource_loader_unittest.cc
+++ b/webkit/glue/media/buffered_resource_loader_unittest.cc
@@ -103,7 +103,15 @@ class BufferedResourceLoaderTest : public testing::Test {
}
void FullResponse(int64 instance_size) {
- EXPECT_CALL(*this, StartCallback(net::OK));
+ FullResponse(instance_size, net::OK);
+ }
+
+ void FullResponse(int64 instance_size, int status) {
+ EXPECT_CALL(*this, StartCallback(status));
+ if (status != net::OK) {
+ EXPECT_CALL(*url_loader_, cancel())
+ .WillOnce(RequestCanceled(loader_));
+ }
WebURLResponse response(gurl_);
response.setHTTPHeaderField(WebString::fromUTF8("Content-Length"),
@@ -112,15 +120,23 @@ class BufferedResourceLoaderTest : public testing::Test {
response.setExpectedContentLength(instance_size);
response.setHTTPStatusCode(kHttpOK);
loader_->didReceiveResponse(url_loader_, response);
- EXPECT_EQ(instance_size, loader_->content_length());
- EXPECT_EQ(instance_size, loader_->instance_size());
- EXPECT_FALSE(loader_->partial_response());
+
+ if (status == net::OK) {
+ EXPECT_EQ(instance_size, loader_->content_length());
+ EXPECT_EQ(instance_size, loader_->instance_size());
+ }
+
+ EXPECT_FALSE(loader_->range_supported());
}
void PartialResponse(int64 first_position, int64 last_position,
int64 instance_size) {
+ PartialResponse(first_position, last_position, instance_size, false, true);
+ }
+
+ void PartialResponse(int64 first_position, int64 last_position,
+ int64 instance_size, bool chunked, bool accept_ranges) {
EXPECT_CALL(*this, StartCallback(net::OK));
- int64 content_length = last_position - first_position + 1;
WebURLResponse response(gurl_);
response.setHTTPHeaderField(WebString::fromUTF8("Content-Range"),
@@ -129,12 +145,36 @@ class BufferedResourceLoaderTest : public testing::Test {
first_position,
last_position,
instance_size)));
+
+ // HTTP 1.1 doesn't permit Content-Length with Transfer-Encoding: chunked.
+ int64 content_length = -1;
+ if (chunked) {
+ response.setHTTPHeaderField(WebString::fromUTF8("Transfer-Encoding"),
+ WebString::fromUTF8("chunked"));
+ } else {
+ content_length = last_position - first_position + 1;
+ }
response.setExpectedContentLength(content_length);
+
+ // A server isn't required to return Accept-Ranges even though it might.
+ if (accept_ranges) {
+ response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"),
+ WebString::fromUTF8("bytes"));
+ }
+
response.setHTTPStatusCode(kHttpPartialContent);
loader_->didReceiveResponse(url_loader_, response);
+
+ // XXX: what's the difference between these two? For example in the chunked
+ // range request case, Content-Length is unspecified (because it's chunked)
+ // but Content-Range: a-b/c can be returned, where c == Content-Length
+ //
+ // Can we eliminate one?
EXPECT_EQ(content_length, loader_->content_length());
EXPECT_EQ(instance_size, loader_->instance_size());
- EXPECT_TRUE(loader_->partial_response());
+
+ // A valid partial response should always result in this being true.
+ EXPECT_TRUE(loader_->range_supported());
}
void Redirect(const char* url) {
@@ -160,7 +200,9 @@ class BufferedResourceLoaderTest : public testing::Test {
EXPECT_CALL(*this, NetworkCallback())
.RetiresOnSaturation();
loader_->didReceiveData(url_loader_,
- reinterpret_cast<char*>(data_ + position), size);
+ reinterpret_cast<char*>(data_ + position),
+ size,
+ size);
}
// Helper method to read from |loader_|.
@@ -174,18 +216,8 @@ class BufferedResourceLoaderTest : public testing::Test {
EXPECT_EQ(0, memcmp(buffer, data_ + pos, size));
}
- // Helper method to disallow deferring in |loader_|.
- void DisallowLoaderDefer() {
- if (loader_->deferred_) {
- EXPECT_CALL(*url_loader_, setDefersLoading(false));
- EXPECT_CALL(*this, NetworkCallback());
- }
- loader_->SetAllowDefer(false);
- }
-
- // Helper method to allow deferring in |loader_|.
- void AllowLoaderDefer() {
- loader_->SetAllowDefer(true);
+ void ConfirmLoaderDeferredState(bool expectedVal) {
+ EXPECT_EQ(loader_->deferred_, expectedVal);
}
MOCK_METHOD1(StartCallback, void(int error));
@@ -232,8 +264,7 @@ TEST_F(BufferedResourceLoaderTest, BadHttpResponse) {
TEST_F(BufferedResourceLoaderTest, NotPartialResponse) {
Initialize(kHttpUrl, 100, -1);
Start();
- FullResponse(1024);
- StopWhenLoad();
+ FullResponse(1024, net::ERR_INVALID_RESPONSE);
}
// Tests that a 200 response is received.
@@ -252,6 +283,27 @@ TEST_F(BufferedResourceLoaderTest, PartialResponse) {
StopWhenLoad();
}
+TEST_F(BufferedResourceLoaderTest, PartialResponse_Chunked) {
+ Initialize(kHttpUrl, 100, 200);
+ Start();
+ PartialResponse(100, 200, 1024, true, true);
+ StopWhenLoad();
+}
+
+TEST_F(BufferedResourceLoaderTest, PartialResponse_NoAcceptRanges) {
+ Initialize(kHttpUrl, 100, 200);
+ Start();
+ PartialResponse(100, 200, 1024, false, false);
+ StopWhenLoad();
+}
+
+TEST_F(BufferedResourceLoaderTest, PartialResponse_ChunkedNoAcceptRanges) {
+ Initialize(kHttpUrl, 100, 200);
+ Start();
+ PartialResponse(100, 200, 1024, true, false);
+ StopWhenLoad();
+}
+
// Tests that an invalid partial response is received.
TEST_F(BufferedResourceLoaderTest, InvalidPartialResponse) {
Initialize(kHttpUrl, 0, 10);
@@ -273,6 +325,7 @@ TEST_F(BufferedResourceLoaderTest, InvalidPartialResponse) {
// Tests the logic of sliding window for data buffering and reading.
TEST_F(BufferedResourceLoaderTest, BufferAndRead) {
Initialize(kHttpUrl, 10, 29);
+ loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer);
Start();
PartialResponse(10, 29, 30);
@@ -323,6 +376,7 @@ TEST_F(BufferedResourceLoaderTest, BufferAndRead) {
TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) {
Initialize(kHttpUrl, 10, 0x00FFFFFF);
+ loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer);
Start();
PartialResponse(10, 0x00FFFFFF, 0x01000000);
@@ -366,128 +420,86 @@ TEST_F(BufferedResourceLoaderTest, RequestFailedWhenRead) {
loader_->didFail(url_loader_, error);
}
-// Tests the logic of caching data to disk when media is paused.
-TEST_F(BufferedResourceLoaderTest, AllowDefer_NoDataReceived) {
- Initialize(kHttpUrl, 10, 99);
- SetLoaderBuffer(10, 20);
- Start();
- PartialResponse(10, 99, 100);
-
- // Start in undeferred state, then disallow defer, then allow defer
- // without receiving data in between.
- DisallowLoaderDefer();
- AllowLoaderDefer();
- StopWhenLoad();
-}
-
-TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadSameWindow) {
+// Tests the data buffering logic of NeverDefer strategy.
+TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) {
Initialize(kHttpUrl, 10, 99);
SetLoaderBuffer(10, 20);
+ loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer);
Start();
PartialResponse(10, 99, 100);
uint8 buffer[10];
- // Start in undeferred state, disallow defer, receive data but don't shift
- // buffer window, then allow defer and read.
- DisallowLoaderDefer();
- WriteLoader(10, 10);
- AllowLoaderDefer();
-
- EXPECT_CALL(*this, ReadCallback(10));
- ReadLoader(10, 10, buffer);
- VerifyBuffer(buffer, 10, 10);
- StopWhenLoad();
-}
-
-TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadPastWindow) {
- Initialize(kHttpUrl, 10, 99);
- SetLoaderBuffer(10, 20);
- Start();
- PartialResponse(10, 99, 100);
-
- uint8 buffer[10];
-
- // Not deferred, disallow defer, received data and shift buffer window,
- // allow defer, then read in area outside of buffer window.
- DisallowLoaderDefer();
+ // Read past the buffer size; should not defer regardless.
WriteLoader(10, 10);
WriteLoader(20, 50);
- AllowLoaderDefer();
+ ConfirmLoaderDeferredState(false);
+ // Should move past window.
EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS));
ReadLoader(10, 10, buffer);
+
StopWhenLoad();
}
-TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredNoDataReceived) {
+// Tests the data buffering logic of ReadThenDefer strategy.
+TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) {
Initialize(kHttpUrl, 10, 99);
SetLoaderBuffer(10, 20);
+ loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer);
Start();
PartialResponse(10, 99, 100);
uint8 buffer[10];
- // Start in deferred state, then disallow defer, receive no data, and
- // allow defer and read.
- EXPECT_CALL(*url_loader_, setDefersLoading(true));
+ // Make an outstanding read request.
+ // We should disable deferring after the read request, so expect
+ // a network event.
EXPECT_CALL(*this, NetworkCallback());
- WriteLoader(10, 40);
-
- DisallowLoaderDefer();
- AllowLoaderDefer();
-
- EXPECT_CALL(*this, ReadCallback(10));
- ReadLoader(20, 10, buffer);
- VerifyBuffer(buffer, 20, 10);
- StopWhenLoad();
-}
-
-TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadSameWindow) {
- Initialize(kHttpUrl, 10, 99);
- SetLoaderBuffer(10, 20);
- Start();
- PartialResponse(10, 99, 100);
+ ReadLoader(10, 10, buffer);
- uint8 buffer[10];
+ // Receive almost enough data to cover, shouldn't defer.
+ WriteLoader(10, 9);
+ ConfirmLoaderDeferredState(false);
- // Start in deferred state, disallow defer, receive data and shift buffer
- // window, allow defer, and read in a place that's still in the window.
- EXPECT_CALL(*url_loader_, setDefersLoading(true));
+ // As soon as we have received enough data to fulfill the read, defer.
EXPECT_CALL(*this, NetworkCallback());
- WriteLoader(10, 30);
+ EXPECT_CALL(*this, ReadCallback(10));
+ WriteLoader(19, 1);
- DisallowLoaderDefer();
- WriteLoader(40, 5);
- AllowLoaderDefer();
+ ConfirmLoaderDeferredState(true);
+ VerifyBuffer(buffer, 10, 10);
- EXPECT_CALL(*this, ReadCallback(10));
- ReadLoader(20, 10, buffer);
- VerifyBuffer(buffer, 20, 10);
StopWhenLoad();
}
-TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadPastWindow) {
+// Tests the data buffering logic of ThresholdDefer strategy.
+TEST_F(BufferedResourceLoaderTest, ThresholdDeferStrategy) {
Initialize(kHttpUrl, 10, 99);
SetLoaderBuffer(10, 20);
+ loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer);
Start();
PartialResponse(10, 99, 100);
uint8 buffer[10];
- // Start in deferred state, disallow defer, receive data and shift buffer
- // window, allow defer, and read outside of the buffer window.
- EXPECT_CALL(*url_loader_, setDefersLoading(true));
+ WriteLoader(10, 5);
+ // Haven't reached threshold, don't defer.
+ ConfirmLoaderDeferredState(false);
+
+ // We're at the threshold now, let's defer.
EXPECT_CALL(*this, NetworkCallback());
- WriteLoader(10, 40);
+ WriteLoader(15, 5);
+ ConfirmLoaderDeferredState(true);
- DisallowLoaderDefer();
- WriteLoader(50, 20);
- WriteLoader(70, 40);
- AllowLoaderDefer();
+ // Now we've read over half of the buffer, disable deferring.
+ EXPECT_CALL(*this, ReadCallback(6));
+ EXPECT_CALL(*this, NetworkCallback());
+ ReadLoader(10, 6, buffer);
+
+ ConfirmLoaderDeferredState(false);
+ VerifyBuffer(buffer, 10, 6);
- EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS));
- ReadLoader(20, 5, buffer);
StopWhenLoad();
}
diff --git a/webkit/glue/media/simple_data_source.cc b/webkit/glue/media/simple_data_source.cc
index 5c3eb18..6647e52 100644
--- a/webkit/glue/media/simple_data_source.cc
+++ b/webkit/glue/media/simple_data_source.cc
@@ -12,12 +12,27 @@
#include "net/url_request/url_request_status.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebKit.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebKitClient.h"
+#include "webkit/glue/media/web_data_source_factory.h"
#include "webkit/glue/webkit_glue.h"
namespace webkit_glue {
static const char kDataScheme[] = "data";
+static WebDataSource* NewSimpleDataSource(MessageLoop* render_loop,
+ WebKit::WebFrame* frame) {
+ return new SimpleDataSource(render_loop, frame);
+}
+
+// static
+media::DataSourceFactory* SimpleDataSource::CreateFactory(
+ MessageLoop* render_loop,
+ WebKit::WebFrame* frame,
+ WebDataSourceBuildObserverHack* build_observer) {
+ return new WebDataSourceFactory(render_loop, frame, &NewSimpleDataSource,
+ build_observer);
+}
+
SimpleDataSource::SimpleDataSource(
MessageLoop* render_loop,
WebKit::WebFrame* frame)
@@ -35,6 +50,15 @@ SimpleDataSource::~SimpleDataSource() {
DCHECK(state_ == UNINITIALIZED || state_ == STOPPED);
}
+void SimpleDataSource::set_host(media::FilterHost* host) {
+ DataSource::set_host(host);
+
+ base::AutoLock auto_lock(lock_);
+ if (state_ == INITIALIZED) {
+ UpdateHostState();
+ }
+}
+
void SimpleDataSource::Stop(media::FilterCallback* callback) {
base::AutoLock auto_lock(lock_);
state_ = STOPPED;
@@ -48,26 +72,42 @@ void SimpleDataSource::Stop(media::FilterCallback* callback) {
NewRunnableMethod(this, &SimpleDataSource::CancelTask));
}
-void SimpleDataSource::Initialize(const std::string& url,
- media::FilterCallback* callback) {
- base::AutoLock auto_lock(lock_);
- DCHECK_EQ(state_, UNINITIALIZED);
- DCHECK(callback);
- state_ = INITIALIZING;
- initialize_callback_.reset(callback);
-
- // Validate the URL.
- SetURL(GURL(url));
- if (!url_.is_valid() || !IsProtocolSupportedForMedia(url_)) {
- host()->SetError(media::PIPELINE_ERROR_NETWORK);
- initialize_callback_->Run();
- initialize_callback_.reset();
- return;
+void SimpleDataSource::Initialize(
+ const std::string& url,
+ media::PipelineStatusCallback* callback) {
+ // Reference to prevent destruction while inside the |initialize_callback_|
+ // call. This is a temporary fix to prevent crashes caused by holding the
+ // lock and running the destructor.
+ scoped_refptr<SimpleDataSource> destruction_guard(this);
+ {
+ base::AutoLock auto_lock(lock_);
+ DCHECK_EQ(state_, UNINITIALIZED);
+ DCHECK(callback);
+ state_ = INITIALIZING;
+ initialize_callback_.reset(callback);
+
+ // Validate the URL.
+ SetURL(GURL(url));
+ if (!url_.is_valid() || !IsProtocolSupportedForMedia(url_)) {
+ DoneInitialization_Locked(false);
+ return;
+ }
+
+ // Post a task to the render thread to start loading the resource.
+ render_loop_->PostTask(FROM_HERE,
+ NewRunnableMethod(this, &SimpleDataSource::StartTask));
}
+}
- // Post a task to the render thread to start loading the resource.
+void SimpleDataSource::CancelInitialize() {
+ base::AutoLock auto_lock(lock_);
+ DCHECK(initialize_callback_.get());
+ state_ = STOPPED;
+ initialize_callback_.reset();
+
+ // Post a task to the render thread to cancel loading the resource.
render_loop_->PostTask(FROM_HERE,
- NewRunnableMethod(this, &SimpleDataSource::StartTask));
+ NewRunnableMethod(this, &SimpleDataSource::CancelTask));
}
const media::MediaFormat& SimpleDataSource::media_format() {
@@ -99,6 +139,8 @@ bool SimpleDataSource::IsStreaming() {
return false;
}
+void SimpleDataSource::SetPreload(media::Preload preload) {}
+
void SimpleDataSource::SetURLLoaderForTest(WebKit::WebURLLoader* mock_loader) {
url_loader_.reset(mock_loader);
keep_test_loader_ = true;
@@ -141,7 +183,8 @@ void SimpleDataSource::didDownloadData(
void SimpleDataSource::didReceiveData(
WebKit::WebURLLoader* loader,
const char* data,
- int data_length) {
+ int data_length,
+ int encoded_data_length) {
DCHECK(MessageLoop::current() == render_loop_);
data_.append(data, data_length);
}
@@ -157,44 +200,56 @@ void SimpleDataSource::didFinishLoading(
WebKit::WebURLLoader* loader,
double finishTime) {
DCHECK(MessageLoop::current() == render_loop_);
- base::AutoLock auto_lock(lock_);
- // It's possible this gets called after Stop(), in which case |host_| is no
- // longer valid.
- if (state_ == STOPPED)
- return;
-
- // Otherwise we should be initializing and have created a WebURLLoader.
- DCHECK_EQ(state_, INITIALIZING);
-
- // If we don't get a content length or the request has failed, report it
- // as a network error.
- if (size_ == -1)
- size_ = data_.length();
- DCHECK(static_cast<size_t>(size_) == data_.length());
-
- DoneInitialization_Locked(true);
+ // Reference to prevent destruction while inside the |initialize_callback_|
+ // call. This is a temporary fix to prevent crashes caused by holding the
+ // lock and running the destructor.
+ scoped_refptr<SimpleDataSource> destruction_guard(this);
+ {
+ base::AutoLock auto_lock(lock_);
+ // It's possible this gets called after Stop(), in which case |host_| is no
+ // longer valid.
+ if (state_ == STOPPED)
+ return;
+
+ // Otherwise we should be initializing and have created a WebURLLoader.
+ DCHECK_EQ(state_, INITIALIZING);
+
+ // If we don't get a content length or the request has failed, report it
+ // as a network error.
+ if (size_ == -1)
+ size_ = data_.length();
+ DCHECK(static_cast<size_t>(size_) == data_.length());
+
+ DoneInitialization_Locked(true);
+ }
}
void SimpleDataSource::didFail(
WebKit::WebURLLoader* loader,
const WebKit::WebURLError& error) {
DCHECK(MessageLoop::current() == render_loop_);
- base::AutoLock auto_lock(lock_);
- // It's possible this gets called after Stop(), in which case |host_| is no
- // longer valid.
- if (state_ == STOPPED)
- return;
-
- // Otherwise we should be initializing and have created a WebURLLoader.
- DCHECK_EQ(state_, INITIALIZING);
-
- // If we don't get a content length or the request has failed, report it
- // as a network error.
- if (size_ == -1)
- size_ = data_.length();
- DCHECK(static_cast<size_t>(size_) == data_.length());
-
- DoneInitialization_Locked(false);
+ // Reference to prevent destruction while inside the |initialize_callback_|
+ // call. This is a temporary fix to prevent crashes caused by holding the
+ // lock and running the destructor.
+ scoped_refptr<SimpleDataSource> destruction_guard(this);
+ {
+ base::AutoLock auto_lock(lock_);
+ // It's possible this gets called after Stop(), in which case |host_| is no
+ // longer valid.
+ if (state_ == STOPPED)
+ return;
+
+ // Otherwise we should be initializing and have created a WebURLLoader.
+ DCHECK_EQ(state_, INITIALIZING);
+
+ // If we don't get a content length or the request has failed, report it
+ // as a network error.
+ if (size_ == -1)
+ size_ = data_.length();
+ DCHECK(static_cast<size_t>(size_) == data_.length());
+
+ DoneInitialization_Locked(false);
+ }
}
bool SimpleDataSource::HasSingleOrigin() {
@@ -210,44 +265,48 @@ void SimpleDataSource::Abort() {
void SimpleDataSource::SetURL(const GURL& url) {
url_ = url;
media_format_.Clear();
- media_format_.SetAsString(media::MediaFormat::kMimeType,
- media::mime_type::kApplicationOctetStream);
media_format_.SetAsString(media::MediaFormat::kURL, url.spec());
}
void SimpleDataSource::StartTask() {
DCHECK(MessageLoop::current() == render_loop_);
- base::AutoLock auto_lock(lock_);
-
- // We may have stopped.
- if (state_ == STOPPED)
- return;
-
- CHECK(frame_);
-
- DCHECK_EQ(state_, INITIALIZING);
-
- if (url_.SchemeIs(kDataScheme)) {
- // If this using data protocol, we just need to decode it.
- std::string mime_type, charset;
- bool success = net::DataURL::Parse(url_, &mime_type, &charset, &data_);
-
- // Don't care about the mime-type just proceed if decoding was successful.
- size_ = data_.length();
- DoneInitialization_Locked(success);
- } else {
- // Prepare the request.
- WebKit::WebURLRequest request(url_);
- request.setTargetType(WebKit::WebURLRequest::TargetIsMedia);
-
- frame_->setReferrerForRequest(request, WebKit::WebURL());
-
- // This flag is for unittests as we don't want to reset |url_loader|
- if (!keep_test_loader_)
- url_loader_.reset(frame_->createAssociatedURLLoader());
-
- // Start the resource loading.
- url_loader_->loadAsynchronously(request, this);
+ // Reference to prevent destruction while inside the |initialize_callback_|
+ // call. This is a temporary fix to prevent crashes caused by holding the
+ // lock and running the destructor.
+ scoped_refptr<SimpleDataSource> destruction_guard(this);
+ {
+ base::AutoLock auto_lock(lock_);
+
+ // We may have stopped.
+ if (state_ == STOPPED)
+ return;
+
+ CHECK(frame_);
+
+ DCHECK_EQ(state_, INITIALIZING);
+
+ if (url_.SchemeIs(kDataScheme)) {
+ // If this using data protocol, we just need to decode it.
+ std::string mime_type, charset;
+ bool success = net::DataURL::Parse(url_, &mime_type, &charset, &data_);
+
+ // Don't care about the mime-type just proceed if decoding was successful.
+ size_ = data_.length();
+ DoneInitialization_Locked(success);
+ } else {
+ // Prepare the request.
+ WebKit::WebURLRequest request(url_);
+ request.setTargetType(WebKit::WebURLRequest::TargetIsMedia);
+
+ frame_->setReferrerForRequest(request, WebKit::WebURL());
+
+ // This flag is for unittests as we don't want to reset |url_loader|
+ if (!keep_test_loader_)
+ url_loader_.reset(frame_->createAssociatedURLLoader());
+
+ // Start the resource loading.
+ url_loader_->loadAsynchronously(request, this);
+ }
}
}
@@ -265,17 +324,29 @@ void SimpleDataSource::CancelTask() {
void SimpleDataSource::DoneInitialization_Locked(bool success) {
lock_.AssertAcquired();
+ media::PipelineStatus status = media::PIPELINE_ERROR_NETWORK;
if (success) {
state_ = INITIALIZED;
+
+ UpdateHostState();
+ status = media::PIPELINE_OK;
+ } else {
+ state_ = UNINITIALIZED;
+ url_loader_.reset();
+ }
+
+ scoped_ptr<media::PipelineStatusCallback> initialize_callback(
+ initialize_callback_.release());
+ initialize_callback->Run(status);
+}
+
+void SimpleDataSource::UpdateHostState() {
+ if (host()) {
host()->SetTotalBytes(size_);
host()->SetBufferedBytes(size_);
// If scheme is file or data, say we are loaded.
host()->SetLoaded(url_.SchemeIsFile() || url_.SchemeIs(kDataScheme));
- } else {
- host()->SetError(media::PIPELINE_ERROR_NETWORK);
}
- initialize_callback_->Run();
- initialize_callback_.reset();
}
} // namespace webkit_glue
diff --git a/webkit/glue/media/simple_data_source.h b/webkit/glue/media/simple_data_source.h
index 10d93ff..2c4075a 100644
--- a/webkit/glue/media/simple_data_source.h
+++ b/webkit/glue/media/simple_data_source.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -13,8 +13,9 @@
#include <algorithm>
#include <string>
+#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
-#include "base/scoped_ptr.h"
+#include "media/base/filter_factories.h"
#include "media/base/filters.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h"
@@ -31,20 +32,26 @@ namespace webkit_glue {
class SimpleDataSource : public WebDataSource,
public WebKit::WebURLLoaderClient {
public:
+ // Creates a DataSourceFactory for building SimpleDataSource objects.
+ static media::DataSourceFactory* CreateFactory(
+ MessageLoop* render_loop,
+ WebKit::WebFrame* frame,
+ WebDataSourceBuildObserverHack* build_observer);
+
SimpleDataSource(MessageLoop* render_loop, WebKit::WebFrame* frame);
virtual ~SimpleDataSource();
// media::Filter implementation.
+ virtual void set_host(media::FilterHost* host);
virtual void Stop(media::FilterCallback* callback);
// media::DataSource implementation.
- virtual void Initialize(const std::string& url,
- media::FilterCallback* callback);
virtual const media::MediaFormat& media_format();
virtual void Read(int64 position, size_t size,
uint8* data, ReadCallback* read_callback);
virtual bool GetSize(int64* size_out);
virtual bool IsStreaming();
+ virtual void SetPreload(media::Preload preload);
// Used to inject a mock used for unittests.
virtual void SetURLLoaderForTest(WebKit::WebURLLoader* mock_loader);
@@ -67,7 +74,8 @@ class SimpleDataSource : public WebDataSource,
virtual void didReceiveData(
WebKit::WebURLLoader* loader,
const char* data,
- int dataLength);
+ int dataLength,
+ int encodedDataLength);
virtual void didReceiveCachedMetadata(
WebKit::WebURLLoader* loader,
const char* data, int dataLength);
@@ -79,6 +87,9 @@ class SimpleDataSource : public WebDataSource,
const WebKit::WebURLError&);
// webkit_glue::WebDataSource implementation.
+ virtual void Initialize(const std::string& url,
+ media::PipelineStatusCallback* callback);
+ virtual void CancelInitialize();
virtual bool HasSingleOrigin();
virtual void Abort();
@@ -95,6 +106,9 @@ class SimpleDataSource : public WebDataSource,
// Perform initialization completion tasks under a lock.
void DoneInitialization_Locked(bool success);
+ // Update host() stats like total bytes & buffered bytes.
+ void UpdateHostState();
+
// Primarily used for asserting the bridge is loading on the render thread.
MessageLoop* render_loop_;
@@ -123,7 +137,7 @@ class SimpleDataSource : public WebDataSource,
base::Lock lock_;
// Filter callbacks.
- scoped_ptr<media::FilterCallback> initialize_callback_;
+ scoped_ptr<media::PipelineStatusCallback> initialize_callback_;
// Used to ensure mocks for unittests are used instead of reset in Start().
bool keep_test_loader_;
diff --git a/webkit/glue/media/simple_data_source_unittest.cc b/webkit/glue/media/simple_data_source_unittest.cc
index 977807b..61e41f2 100644
--- a/webkit/glue/media/simple_data_source_unittest.cc
+++ b/webkit/glue/media/simple_data_source_unittest.cc
@@ -59,7 +59,7 @@ class SimpleDataSourceTest : public testing::Test {
}
void InitializeDataSource(const char* url,
- media::MockCallback* callback) {
+ media::MockStatusCallback* callback) {
gurl_ = GURL(url);
frame_.reset(new NiceMock<MockWebFrame>());
@@ -86,7 +86,7 @@ class SimpleDataSourceTest : public testing::Test {
EXPECT_EQ(kDataSize, size);
for (int i = 0; i < kDataSize; ++i) {
- data_source_->didReceiveData(NULL, data_ + i, 1);
+ data_source_->didReceiveData(NULL, data_ + i, 1, 1);
}
EXPECT_CALL(host_, SetLoaded(is_loaded));
@@ -103,7 +103,6 @@ class SimpleDataSourceTest : public testing::Test {
void RequestFailed() {
InSequence s;
- EXPECT_CALL(host_, SetError(media::PIPELINE_ERROR_NETWORK));
WebURLError error;
error.reason = net::ERR_FAILED;
@@ -158,19 +157,22 @@ class SimpleDataSourceTest : public testing::Test {
};
TEST_F(SimpleDataSourceTest, InitializeHTTP) {
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
RequestSucceeded(false);
DestroyDataSource();
}
TEST_F(SimpleDataSourceTest, InitializeHTTPS) {
- InitializeDataSource(kHttpsUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpsUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
RequestSucceeded(false);
DestroyDataSource();
}
TEST_F(SimpleDataSourceTest, InitializeFile) {
- InitializeDataSource(kFileUrl, media::NewExpectedCallback());
+ InitializeDataSource(kFileUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
RequestSucceeded(true);
DestroyDataSource();
}
@@ -181,8 +183,6 @@ TEST_F(SimpleDataSourceTest, InitializeData) {
data_source_ = new SimpleDataSource(MessageLoop::current(),
frame_.get());
- EXPECT_TRUE(data_source_->IsUrlSupported(kDataUrl));
-
// There is no need to provide a message loop to data source.
data_source_->set_host(&host_);
data_source_->SetURLLoaderForTest(url_loader_);
@@ -191,14 +191,16 @@ TEST_F(SimpleDataSourceTest, InitializeData) {
EXPECT_CALL(host_, SetTotalBytes(sizeof(kDataUrlDecoded)));
EXPECT_CALL(host_, SetBufferedBytes(sizeof(kDataUrlDecoded)));
- data_source_->Initialize(kDataUrl, media::NewExpectedCallback());
+ data_source_->Initialize(kDataUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
MessageLoop::current()->RunAllPending();
DestroyDataSource();
}
TEST_F(SimpleDataSourceTest, RequestFailed) {
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_ERROR_NETWORK));
RequestFailed();
DestroyDataSource();
}
@@ -206,8 +208,8 @@ TEST_F(SimpleDataSourceTest, RequestFailed) {
TEST_F(SimpleDataSourceTest, StopWhenDownloading) {
// The callback should be deleted, but not executed.
// TODO(scherkus): should this really be the behaviour? Seems strange...
- StrictMock<media::MockCallback>* callback =
- new StrictMock<media::MockCallback>();
+ StrictMock<media::MockStatusCallback>* callback =
+ new StrictMock<media::MockStatusCallback>();
EXPECT_CALL(*callback, Destructor());
InitializeDataSource(kHttpUrl, callback);
@@ -217,7 +219,8 @@ TEST_F(SimpleDataSourceTest, StopWhenDownloading) {
}
TEST_F(SimpleDataSourceTest, AsyncRead) {
- InitializeDataSource(kFileUrl, media::NewExpectedCallback());
+ InitializeDataSource(kFileUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
RequestSucceeded(true);
AsyncRead();
DestroyDataSource();
@@ -228,20 +231,23 @@ TEST_F(SimpleDataSourceTest, AsyncRead) {
// is fixed.
TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
// Make sure no redirect case works as expected.
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
RequestSucceeded(false);
EXPECT_TRUE(data_source_->HasSingleOrigin());
DestroyDataSource();
// Test redirect to the same domain.
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1);
RequestSucceeded(false);
EXPECT_TRUE(data_source_->HasSingleOrigin());
DestroyDataSource();
// Test redirect twice to the same domain.
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1);
Redirect(kHttpRedirectToSameDomainUrl2);
RequestSucceeded(false);
@@ -249,14 +255,16 @@ TEST_F(SimpleDataSourceTest, HasSingleOrigin) {
DestroyDataSource();
// Test redirect to a different domain.
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
Redirect(kHttpRedirectToDifferentDomainUrl1);
RequestSucceeded(false);
EXPECT_FALSE(data_source_->HasSingleOrigin());
DestroyDataSource();
// Test redirect to the same domain and then to a different domain.
- InitializeDataSource(kHttpUrl, media::NewExpectedCallback());
+ InitializeDataSource(kHttpUrl,
+ media::NewExpectedStatusCallback(media::PIPELINE_OK));
Redirect(kHttpRedirectToSameDomainUrl1);
Redirect(kHttpRedirectToDifferentDomainUrl1);
RequestSucceeded(false);
diff --git a/webkit/glue/media/video_renderer_impl.cc b/webkit/glue/media/video_renderer_impl.cc
index 3bbd626..5e159fe 100644
--- a/webkit/glue/media/video_renderer_impl.cc
+++ b/webkit/glue/media/video_renderer_impl.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -49,7 +49,7 @@ void VideoRendererImpl::SetRect(const gfx::Rect& rect) {
}
// This method is always called on the renderer's thread.
-void VideoRendererImpl::Paint(skia::PlatformCanvas* canvas,
+void VideoRendererImpl::Paint(SkCanvas* canvas,
const gfx::Rect& dest_rect) {
scoped_refptr<media::VideoFrame> video_frame;
GetCurrentFrame(&video_frame);
@@ -98,7 +98,7 @@ void VideoRendererImpl::PutCurrentFrame(
// 4. Canvas is opaque.
// TODO(hclam): The fast paint method should support flipping and mirroring.
// Disable the flipping and mirroring checks once we have it.
-bool VideoRendererImpl::CanFastPaint(skia::PlatformCanvas* canvas,
+bool VideoRendererImpl::CanFastPaint(SkCanvas* canvas,
const gfx::Rect& dest_rect) {
// Fast paint does not handle opacity value other than 1.0. Hence use slow
// paint if opacity is not 1.0. Since alpha = opacity * 0xFF, we check that
@@ -152,7 +152,7 @@ bool VideoRendererImpl::CanFastPaint(skia::PlatformCanvas* canvas,
}
void VideoRendererImpl::SlowPaint(media::VideoFrame* video_frame,
- skia::PlatformCanvas* canvas,
+ SkCanvas* canvas,
const gfx::Rect& dest_rect) {
// 1. Convert YUV frame to RGB.
base::TimeDelta timestamp = video_frame->GetTimestamp();
@@ -199,7 +199,7 @@ void VideoRendererImpl::SlowPaint(media::VideoFrame* video_frame,
}
void VideoRendererImpl::FastPaint(media::VideoFrame* video_frame,
- skia::PlatformCanvas* canvas,
+ SkCanvas* canvas,
const gfx::Rect& dest_rect) {
DCHECK(video_frame->format() == media::VideoFrame::YV12 ||
video_frame->format() == media::VideoFrame::YV16);
diff --git a/webkit/glue/media/video_renderer_impl.h b/webkit/glue/media/video_renderer_impl.h
index b73c099..b14038b 100644
--- a/webkit/glue/media/video_renderer_impl.h
+++ b/webkit/glue/media/video_renderer_impl.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
@@ -30,7 +30,7 @@ class VideoRendererImpl : public WebVideoRenderer {
// WebVideoRenderer implementation.
virtual void SetWebMediaPlayerImplProxy(WebMediaPlayerImpl::Proxy* proxy);
virtual void SetRect(const gfx::Rect& rect);
- virtual void Paint(skia::PlatformCanvas* canvas, const gfx::Rect& dest_rect);
+ virtual void Paint(SkCanvas* canvas, const gfx::Rect& dest_rect);
virtual void GetCurrentFrame(scoped_refptr<media::VideoFrame>* frame_out);
virtual void PutCurrentFrame(scoped_refptr<media::VideoFrame> frame);
@@ -47,18 +47,18 @@ class VideoRendererImpl : public WebVideoRenderer {
private:
// Determine the conditions to perform fast paint. Returns true if we can do
// fast paint otherwise false.
- bool CanFastPaint(skia::PlatformCanvas* canvas, const gfx::Rect& dest_rect);
+ bool CanFastPaint(SkCanvas* canvas, const gfx::Rect& dest_rect);
// Slow paint does a YUV => RGB, and scaled blit in two separate operations.
void SlowPaint(media::VideoFrame* video_frame,
- skia::PlatformCanvas* canvas,
+ SkCanvas* canvas,
const gfx::Rect& dest_rect);
// Fast paint does YUV => RGB, scaling, blitting all in one step into the
// canvas. It's not always safe and appropriate to perform fast paint.
// CanFastPaint() is used to determine the conditions.
void FastPaint(media::VideoFrame* video_frame,
- skia::PlatformCanvas* canvas,
+ SkCanvas* canvas,
const gfx::Rect& dest_rect);
void TransformToSkIRect(const SkMatrix& matrix, const gfx::Rect& src_rect,
diff --git a/webkit/glue/media/web_data_source.h b/webkit/glue/media/web_data_source.h
index 956ac9e..25f1258 100644
--- a/webkit/glue/media/web_data_source.h
+++ b/webkit/glue/media/web_data_source.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -6,6 +6,7 @@
#define WEBKIT_GLUE_MEDIA_WEB_DATA_SOURCE_H_
#include "media/base/filters.h"
+#include "media/base/pipeline_status.h"
namespace webkit_glue {
@@ -16,6 +17,18 @@ class WebDataSource : public media::DataSource {
WebDataSource();
virtual ~WebDataSource();
+ // Initialize this object using |url|. This object calls |callback| when
+ // initialization has completed.
+ virtual void Initialize(const std::string& url,
+ media::PipelineStatusCallback* callback) = 0;
+
+ // Called to cancel initialization. The callback passed in Initialize() will
+ // be destroyed and will not be called after this method returns. Once this
+ // method returns, the object will be in an uninitialized state and
+ // Initialize() cannot be called again. The caller is expected to release
+ // its handle to this object and never call it again.
+ virtual void CancelInitialize() = 0;
+
// Returns true if the media resource has a single origin, false otherwise.
//
// Method called on the render thread.
@@ -31,6 +44,15 @@ class WebDataSource : public media::DataSource {
DISALLOW_COPY_AND_ASSIGN(WebDataSource);
};
+// Temporary hack to allow WebMediaPlayerImpl::Proxy::AddDataSource() to
+// be called when WebDataSource objects are created. This can be removed
+// once WebMediaPlayerImpl::Proxy is fixed so it doesn't have to track
+// WebDataSources. Proxy only has to track WebDataSources so it can call Abort()
+// on them at shutdown. Once cancellation is added to DataSource and pause
+// support in Demuxers cancel pending reads, Proxy shouldn't have to keep
+// a WebDataSource list or call Abort().
+typedef Callback1<WebDataSource*>::Type WebDataSourceBuildObserverHack;
+
} // namespace webkit_glue
#endif // WEBKIT_GLUE_MEDIA_WEB_DATA_SOURCE_H_
diff --git a/webkit/glue/media/web_data_source_factory.cc b/webkit/glue/media/web_data_source_factory.cc
new file mode 100644
index 0000000..d98e2da
--- /dev/null
+++ b/webkit/glue/media/web_data_source_factory.cc
@@ -0,0 +1,103 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "webkit/glue/media/web_data_source_factory.h"
+
+#include "base/logging.h"
+
+namespace webkit_glue {
+
+class WebDataSourceFactory::BuildRequest
+ : public media::AsyncDataSourceFactoryBase::BuildRequest {
+ public:
+ BuildRequest(const std::string& url, BuildCallback* callback,
+ WebDataSource* data_source,
+ WebDataSourceBuildObserverHack* build_observer);
+ virtual ~BuildRequest();
+
+ protected:
+ // AsyncDataSourceFactoryBase::BuildRequest method.
+ virtual void DoStart();
+
+ private:
+ void InitDone(media::PipelineStatus status);
+
+ scoped_refptr<WebDataSource> data_source_;
+ WebDataSourceBuildObserverHack* build_observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(BuildRequest);
+};
+
+WebDataSourceFactory::WebDataSourceFactory(
+ MessageLoop* render_loop,
+ WebKit::WebFrame* frame,
+ FactoryFunction factory_function,
+ WebDataSourceBuildObserverHack* build_observer)
+ : render_loop_(render_loop),
+ frame_(frame),
+ factory_function_(factory_function),
+ build_observer_(build_observer) {
+ DCHECK(render_loop_);
+ DCHECK(frame_);
+ DCHECK(factory_function_);
+}
+
+WebDataSourceFactory::~WebDataSourceFactory() {}
+
+media::DataSourceFactory* WebDataSourceFactory::Clone() const {
+ return new WebDataSourceFactory(render_loop_, frame_, factory_function_,
+ build_observer_);
+}
+
+bool WebDataSourceFactory::AllowRequests() const {
+ return true;
+}
+
+media::AsyncDataSourceFactoryBase::BuildRequest*
+WebDataSourceFactory::CreateRequest(const std::string& url,
+ BuildCallback* callback) {
+ WebDataSource* data_source = factory_function_(render_loop_, frame_);
+
+ return new WebDataSourceFactory::BuildRequest(url, callback, data_source,
+ build_observer_);
+}
+
+WebDataSourceFactory::BuildRequest::BuildRequest(
+ const std::string& url,
+ BuildCallback* callback,
+ WebDataSource* data_source,
+ WebDataSourceBuildObserverHack* build_observer)
+ : AsyncDataSourceFactoryBase::BuildRequest(url, callback),
+ data_source_(data_source),
+ build_observer_(build_observer) {
+}
+
+WebDataSourceFactory::BuildRequest::~BuildRequest() {
+ if (data_source_.get()) {
+ data_source_->CancelInitialize();
+ data_source_ = NULL;
+ }
+}
+
+void WebDataSourceFactory::BuildRequest::DoStart() {
+ data_source_->Initialize(url(), NewCallback(this, &BuildRequest::InitDone));
+}
+
+void WebDataSourceFactory::BuildRequest::InitDone(
+ media::PipelineStatus status) {
+ scoped_refptr<WebDataSource> data_source;
+
+ data_source = (status == media::PIPELINE_OK) ? data_source_ : NULL;
+ data_source_ = NULL;
+
+ if (build_observer_ && data_source.get()) {
+ build_observer_->Run(data_source.get());
+ }
+
+ RequestComplete(status, data_source);
+ // Don't do anything after this line. This object is deleted by
+ // RequestComplete().
+}
+
+} // namespace webkit_glue
diff --git a/webkit/glue/media/web_data_source_factory.h b/webkit/glue/media/web_data_source_factory.h
new file mode 100644
index 0000000..7163ef4
--- /dev/null
+++ b/webkit/glue/media/web_data_source_factory.h
@@ -0,0 +1,51 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_GLUE_MEDIA_BUFFERED_DATA_SOURCE_FACTORY_H_
+#define WEBKIT_GLUE_MEDIA_BUFFERED_DATA_SOURCE_FACTORY_H_
+
+#include "media/base/async_filter_factory_base.h"
+#include "webkit/glue/media/web_data_source.h"
+
+class MessageLoop;
+
+namespace WebKit {
+class WebFrame;
+}
+
+namespace webkit_glue {
+
+class WebDataSourceFactory : public media::AsyncDataSourceFactoryBase {
+ public:
+ typedef WebDataSource* (*FactoryFunction)(MessageLoop* render_loop,
+ WebKit::WebFrame* frame);
+
+ WebDataSourceFactory(MessageLoop* render_loop, WebKit::WebFrame* frame,
+ FactoryFunction factory_function,
+ WebDataSourceBuildObserverHack* build_observer);
+ virtual ~WebDataSourceFactory();
+
+ // DataSourceFactory method.
+ virtual media::DataSourceFactory* Clone() const;
+
+ protected:
+ // AsyncDataSourceFactoryBase methods.
+ virtual bool AllowRequests() const;
+ virtual AsyncDataSourceFactoryBase::BuildRequest* CreateRequest(
+ const std::string& url, BuildCallback* callback);
+
+ private:
+ class BuildRequest;
+
+ MessageLoop* render_loop_;
+ WebKit::WebFrame* frame_;
+ FactoryFunction factory_function_;
+ WebDataSourceBuildObserverHack* build_observer_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebDataSourceFactory);
+};
+
+} // namespace webkit_glue
+
+#endif // WEBKIT_GLUE_MEDIA_BUFFERED_DATA_SOURCE_FACTORY_H_
diff --git a/webkit/glue/media/web_video_renderer.h b/webkit/glue/media/web_video_renderer.h
index efd3109..9e1eed5 100644
--- a/webkit/glue/media/web_video_renderer.h
+++ b/webkit/glue/media/web_video_renderer.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -32,7 +32,7 @@ class WebVideoRenderer : public media::VideoRendererBase {
// |dest_rect|.
//
// Method called on the render thread.
- virtual void Paint(skia::PlatformCanvas* canvas,
+ virtual void Paint(SkCanvas* canvas,
const gfx::Rect& dest_rect) = 0;
// Clients of this class (painter/compositor) should use GetCurrentFrame()
diff --git a/webkit/glue/multipart_response_delegate.cc b/webkit/glue/multipart_response_delegate.cc
index d2c47d7..3a4f053 100644
--- a/webkit/glue/multipart_response_delegate.cc
+++ b/webkit/glue/multipart_response_delegate.cc
@@ -62,6 +62,7 @@ MultipartResponseDelegate::MultipartResponseDelegate(
: client_(client),
loader_(loader),
original_response_(response),
+ encoded_data_length_(0),
boundary_("--"),
first_received_data_(true),
processing_headers_(false),
@@ -76,7 +77,8 @@ MultipartResponseDelegate::MultipartResponseDelegate(
}
void MultipartResponseDelegate::OnReceivedData(const char* data,
- int data_len) {
+ int data_len,
+ int encoded_data_length) {
// stop_sending_ means that we've already received the final boundary token.
// The server should stop sending us data at this point, but if it does, we
// just throw it away.
@@ -84,6 +86,7 @@ void MultipartResponseDelegate::OnReceivedData(const char* data,
return;
data_.append(data, data_len);
+ encoded_data_length_ += encoded_data_length;
if (first_received_data_) {
// Some servers don't send a boundary token before the first chunk of
// data. We handle this case anyway (Gecko does too).
@@ -140,7 +143,9 @@ void MultipartResponseDelegate::OnReceivedData(const char* data,
// Send the last data chunk.
client_->didReceiveData(loader_,
data_.data(),
- static_cast<int>(data_length));
+ static_cast<int>(data_length),
+ encoded_data_length_);
+ encoded_data_length_ = 0;
}
}
size_t boundary_end_pos = boundary_pos + boundary_.length();
@@ -171,8 +176,12 @@ void MultipartResponseDelegate::OnReceivedData(const char* data,
if (data_[data_.length() - 1] == '\n')
send_length = data_.length();
if (client_)
- client_->didReceiveData(loader_, data_.data(), send_length);
+ client_->didReceiveData(loader_,
+ data_.data(),
+ send_length,
+ encoded_data_length_);
data_ = data_.substr(send_length);
+ encoded_data_length_ = 0;
}
}
@@ -182,7 +191,9 @@ void MultipartResponseDelegate::OnCompletedRequest() {
if (!processing_headers_ && !data_.empty() && !stop_sending_ && client_) {
client_->didReceiveData(loader_,
data_.data(),
- static_cast<int>(data_.length()));
+ static_cast<int>(data_.length()),
+ encoded_data_length_);
+ encoded_data_length_ = 0;
}
}
diff --git a/webkit/glue/multipart_response_delegate.h b/webkit/glue/multipart_response_delegate.h
index d4583bb..5536d51 100644
--- a/webkit/glue/multipart_response_delegate.h
+++ b/webkit/glue/multipart_response_delegate.h
@@ -72,7 +72,7 @@ class MultipartResponseDelegate {
const std::string& boundary);
// Passed through from ResourceHandleInternal
- void OnReceivedData(const char* data, int data_len);
+ void OnReceivedData(const char* data, int data_len, int encoded_data_length);
void OnCompletedRequest();
// The request has been canceled, so stop making calls to the client.
@@ -120,6 +120,9 @@ class MultipartResponseDelegate {
// full token.
size_t FindBoundary();
+ // Transferred data size accumulated between client callbacks.
+ int encoded_data_length_;
+
// A temporary buffer to hold data between reads for multipart data that
// gets split in the middle of a header.
std::string data_;
diff --git a/webkit/glue/multipart_response_delegate_unittest.cc b/webkit/glue/multipart_response_delegate_unittest.cc
index fbefaaa..bebb9f0 100644
--- a/webkit/glue/multipart_response_delegate_unittest.cc
+++ b/webkit/glue/multipart_response_delegate_unittest.cc
@@ -66,17 +66,20 @@ class MockWebURLLoaderClient : public WebURLLoaderClient {
response_ = response;
data_.clear();
}
- virtual void didReceiveData(WebURLLoader* loader,
- const char* data, int data_length) {
+ virtual void didReceiveData(
+ WebKit::WebURLLoader* loader,
+ const char* data,
+ int data_length,
+ int encoded_data_length) {
++received_data_;
data_.append(data, data_length);
+ total_encoded_data_length_ += encoded_data_length;
}
-
virtual void didFinishLoading(WebURLLoader*, double finishTime) {}
virtual void didFail(WebURLLoader*, const WebURLError&) {}
void Reset() {
- received_response_ = received_data_ = 0;
+ received_response_ = received_data_ = total_encoded_data_length_ = 0;
data_.clear();
response_.reset();
}
@@ -85,7 +88,7 @@ class MockWebURLLoaderClient : public WebURLLoaderClient {
return string(response_.httpHeaderField(WebString::fromUTF8(name)).utf8());
}
- int received_response_, received_data_;
+ int received_response_, received_data_, total_encoded_data_length_;
string data_;
WebURLResponse response_;
};
@@ -214,11 +217,13 @@ TEST(MultipartResponseTest, MissingBoundaries) {
"--bound--"
"ignore junk after end token --bound\n\nTest2\n");
delegate.OnReceivedData(no_start_boundary.c_str(),
+ static_cast<int>(no_start_boundary.length()),
static_cast<int>(no_start_boundary.length()));
EXPECT_EQ(1, client.received_response_);
EXPECT_EQ(1, client.received_data_);
- EXPECT_EQ(string("This is a sample response"),
- client.data_);
+ EXPECT_EQ(string("This is a sample response"), client.data_);
+ EXPECT_EQ(static_cast<int>(no_start_boundary.length()),
+ client.total_encoded_data_length_);
delegate.OnCompletedRequest();
EXPECT_EQ(1, client.received_response_);
@@ -231,16 +236,20 @@ TEST(MultipartResponseTest, MissingBoundaries) {
"bound\nContent-type: text/plain\n\n"
"This is a sample response\n");
delegate2.OnReceivedData(no_end_boundary.c_str(),
+ static_cast<int>(no_end_boundary.length()),
static_cast<int>(no_end_boundary.length()));
EXPECT_EQ(1, client.received_response_);
EXPECT_EQ(1, client.received_data_);
EXPECT_EQ("This is a sample response\n", client.data_);
+ EXPECT_EQ(static_cast<int>(no_end_boundary.length()),
+ client.total_encoded_data_length_);
delegate2.OnCompletedRequest();
EXPECT_EQ(1, client.received_response_);
EXPECT_EQ(1, client.received_data_);
- EXPECT_EQ(string("This is a sample response\n"),
- client.data_);
+ EXPECT_EQ(string("This is a sample response\n"), client.data_);
+ EXPECT_EQ(static_cast<int>(no_end_boundary.length()),
+ client.total_encoded_data_length_);
// Neither boundary
client.Reset();
@@ -249,16 +258,20 @@ TEST(MultipartResponseTest, MissingBoundaries) {
"Content-type: text/plain\n\n"
"This is a sample response\n");
delegate3.OnReceivedData(no_boundaries.c_str(),
+ static_cast<int>(no_boundaries.length()),
static_cast<int>(no_boundaries.length()));
EXPECT_EQ(1, client.received_response_);
EXPECT_EQ(1, client.received_data_);
EXPECT_EQ("This is a sample response\n", client.data_);
+ EXPECT_EQ(static_cast<int>(no_boundaries.length()),
+ client.total_encoded_data_length_);
delegate3.OnCompletedRequest();
EXPECT_EQ(1, client.received_response_);
EXPECT_EQ(1, client.received_data_);
- EXPECT_EQ(string("This is a sample response\n"),
- client.data_);
+ EXPECT_EQ(string("This is a sample response\n"), client.data_);
+ EXPECT_EQ(static_cast<int>(no_boundaries.length()),
+ client.total_encoded_data_length_);
}
TEST(MultipartResponseTest, MalformedBoundary) {
@@ -278,10 +291,13 @@ TEST(MultipartResponseTest, MalformedBoundary) {
"This is a sample response\n"
"--bound--"
"ignore junk after end token --bound\n\nTest2\n");
- delegate.OnReceivedData(data.c_str(), static_cast<int>(data.length()));
+ delegate.OnReceivedData(data.c_str(),
+ static_cast<int>(data.length()),
+ static_cast<int>(data.length()));
EXPECT_EQ(1, client.received_response_);
EXPECT_EQ(1, client.received_data_);
EXPECT_EQ(string("This is a sample response"), client.data_);
+ EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_);
delegate.OnCompletedRequest();
EXPECT_EQ(1, client.received_response_);
@@ -296,11 +312,13 @@ struct TestChunk {
const int expected_responses;
const int expected_received_data;
const char* expected_data;
+ const int expected_encoded_data_length;
};
void VariousChunkSizesTest(const TestChunk chunks[], int chunks_size,
int responses, int received_data,
- const char* completed_data) {
+ const char* completed_data,
+ int completed_encoded_data_length) {
const string data(
"--bound\n" // 0-7
"Content-type: image/png\n\n" // 8-32
@@ -320,106 +338,107 @@ void VariousChunkSizesTest(const TestChunk chunks[], int chunks_size,
ASSERT_TRUE(chunks[i].start_pos < chunks[i].end_pos);
string chunk = data.substr(chunks[i].start_pos,
chunks[i].end_pos - chunks[i].start_pos);
- delegate.OnReceivedData(chunk.c_str(), static_cast<int>(chunk.length()));
- EXPECT_EQ(chunks[i].expected_responses,
- client.received_response_);
- EXPECT_EQ(chunks[i].expected_received_data,
- client.received_data_);
- EXPECT_EQ(string(chunks[i].expected_data),
- client.data_);
+ delegate.OnReceivedData(
+ chunk.c_str(),
+ static_cast<int>(chunk.length()),
+ static_cast<int>(chunk.length()));
+ EXPECT_EQ(chunks[i].expected_responses, client.received_response_);
+ EXPECT_EQ(chunks[i].expected_received_data, client.received_data_);
+ EXPECT_EQ(string(chunks[i].expected_data), client.data_);
+ EXPECT_EQ(chunks[i].expected_encoded_data_length,
+ client.total_encoded_data_length_);
}
// Check final state
delegate.OnCompletedRequest();
- EXPECT_EQ(responses,
- client.received_response_);
- EXPECT_EQ(received_data,
- client.received_data_);
- EXPECT_EQ(string(completed_data),
- client.data_);
+ EXPECT_EQ(responses, client.received_response_);
+ EXPECT_EQ(received_data, client.received_data_);
+ string completed_data_string(completed_data);
+ EXPECT_EQ(completed_data_string, client.data_);
+ EXPECT_EQ(completed_encoded_data_length, client.total_encoded_data_length_);
}
TEST(MultipartResponseTest, BreakInBoundary) {
// Break in the first boundary
const TestChunk bound1[] = {
- { 0, 4, 0, 0, ""},
- { 4, 110, 2, 2, "foofoofoofoofoo" },
+ { 0, 4, 0, 0, "", 0 },
+ { 4, 110, 2, 2, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(bound1, arraysize(bound1),
- 2, 2, "foofoofoofoofoo");
+ 2, 2, "foofoofoofoofoo", 110);
// Break in first and second
const TestChunk bound2[] = {
- { 0, 4, 0, 0, ""},
- { 4, 55, 1, 1, "datadatadatadat" },
- { 55, 65, 1, 2, "datadatadatadatadata" },
- { 65, 110, 2, 3, "foofoofoofoofoo" },
+ { 0, 4, 0, 0, "", 0 },
+ { 4, 55, 1, 1, "datadatadatadat", 55 },
+ { 55, 65, 1, 2, "datadatadatadatadata", 65 },
+ { 65, 110, 2, 3, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(bound2, arraysize(bound2),
- 2, 3, "foofoofoofoofoo");
+ 2, 3, "foofoofoofoofoo", 110);
// Break in second only
const TestChunk bound3[] = {
- { 0, 55, 1, 1, "datadatadatadat" },
- { 55, 110, 2, 3, "foofoofoofoofoo" },
+ { 0, 55, 1, 1, "datadatadatadat", 55 },
+ { 55, 110, 2, 3, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(bound3, arraysize(bound3),
- 2, 3, "foofoofoofoofoo");
+ 2, 3, "foofoofoofoofoo", 110);
}
TEST(MultipartResponseTest, BreakInHeaders) {
// Break in first header
const TestChunk header1[] = {
- { 0, 10, 0, 0, "" },
- { 10, 35, 1, 0, "" },
- { 35, 110, 2, 2, "foofoofoofoofoo" },
+ { 0, 10, 0, 0, "", 0 },
+ { 10, 35, 1, 0, "", 0 },
+ { 35, 110, 2, 2, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(header1, arraysize(header1),
- 2, 2, "foofoofoofoofoo");
+ 2, 2, "foofoofoofoofoo", 110);
// Break in both headers
const TestChunk header2[] = {
- { 0, 10, 0, 0, "" },
- { 10, 65, 1, 1, "datadatadatadatadata" },
- { 65, 110, 2, 2, "foofoofoofoofoo" },
+ { 0, 10, 0, 0, "", 0 },
+ { 10, 65, 1, 1, "datadatadatadatadata", 65 },
+ { 65, 110, 2, 2, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(header2, arraysize(header2),
- 2, 2, "foofoofoofoofoo");
+ 2, 2, "foofoofoofoofoo", 110);
// Break at end of a header
const TestChunk header3[] = {
- { 0, 33, 1, 0, "" },
- { 33, 65, 1, 1, "datadatadatadatadata" },
- { 65, 110, 2, 2, "foofoofoofoofoo" },
+ { 0, 33, 1, 0, "", 0 },
+ { 33, 65, 1, 1, "datadatadatadatadata", 65 },
+ { 65, 110, 2, 2, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(header3, arraysize(header3),
- 2, 2, "foofoofoofoofoo");
+ 2, 2, "foofoofoofoofoo", 110);
}
TEST(MultipartResponseTest, BreakInData) {
// All data as one chunk
const TestChunk data1[] = {
- { 0, 110, 2, 2, "foofoofoofoofoo" },
+ { 0, 110, 2, 2, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(data1, arraysize(data1),
- 2, 2, "foofoofoofoofoo");
+ 2, 2, "foofoofoofoofoo", 110);
// breaks in data segment
const TestChunk data2[] = {
- { 0, 35, 1, 0, "" },
- { 35, 65, 1, 1, "datadatadatadatadata" },
- { 65, 90, 2, 1, "" },
- { 90, 110, 2, 2, "foofoofoofoofoo" },
+ { 0, 35, 1, 0, "", 0 },
+ { 35, 65, 1, 1, "datadatadatadatadata", 65 },
+ { 65, 90, 2, 1, "", 65 },
+ { 90, 110, 2, 2, "foofoofoofoofoo", 110 },
};
VariousChunkSizesTest(data2, arraysize(data2),
- 2, 2, "foofoofoofoofoo");
+ 2, 2, "foofoofoofoofoo", 110);
// Incomplete send
const TestChunk data3[] = {
- { 0, 35, 1, 0, "" },
- { 35, 90, 2, 1, "" },
+ { 0, 35, 1, 0, "", 0 },
+ { 35, 90, 2, 1, "", 90 },
};
VariousChunkSizesTest(data3, arraysize(data3),
- 2, 2, "foof");
+ 2, 2, "foof", 90);
}
TEST(MultipartResponseTest, SmallChunk) {
@@ -438,10 +457,12 @@ TEST(MultipartResponseTest, SmallChunk) {
"--boundContent-type: text/plain\n\n"
"end--bound--");
delegate.OnReceivedData(data.c_str(),
+ static_cast<int>(data.length()),
static_cast<int>(data.length()));
EXPECT_EQ(4, client.received_response_);
EXPECT_EQ(2, client.received_data_);
EXPECT_EQ(string("end"), client.data_);
+ EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_);
delegate.OnCompletedRequest();
EXPECT_EQ(4, client.received_response_);
@@ -457,13 +478,13 @@ TEST(MultipartResponseTest, MultipleBoundaries) {
MultipartResponseDelegate delegate(&client, NULL, response, "bound");
string data("--bound\r\n\r\n--bound\r\n\r\nfoofoo--bound--");
- delegate.OnReceivedData(data.c_str(), static_cast<int>(data.length()));
- EXPECT_EQ(2,
- client.received_response_);
- EXPECT_EQ(1,
- client.received_data_);
- EXPECT_EQ(string("foofoo"),
- client.data_);
+ delegate.OnReceivedData(data.c_str(),
+ static_cast<int>(data.length()),
+ static_cast<int>(data.length()));
+ EXPECT_EQ(2, client.received_response_);
+ EXPECT_EQ(1, client.received_data_);
+ EXPECT_EQ(string("foofoo"), client.data_);
+ EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_);
}
TEST(MultipartResponseTest, MultipartByteRangeParsingTest) {
@@ -626,22 +647,25 @@ TEST(MultipartResponseTest, MultipartPayloadSet) {
"Content-type: text/plain\n\n"
"response data\n"
"--bound\n");
- delegate.OnReceivedData(data.c_str(), static_cast<int>(data.length()));
- EXPECT_EQ(1,
- client.received_response_);
- EXPECT_EQ(string("response data"),
- client.data_);
+ delegate.OnReceivedData(data.c_str(),
+ static_cast<int>(data.length()),
+ static_cast<int>(data.length()));
+ EXPECT_EQ(1, client.received_response_);
+ EXPECT_EQ(string("response data"), client.data_);
+ EXPECT_EQ(static_cast<int>(data.length()), client.total_encoded_data_length_);
EXPECT_FALSE(client.response_.isMultipartPayload());
string data2(
"Content-type: text/plain\n\n"
"response data2\n"
"--bound\n");
- delegate.OnReceivedData(data2.c_str(), static_cast<int>(data2.length()));
- EXPECT_EQ(2,
- client.received_response_);
- EXPECT_EQ(string("response data2"),
- client.data_);
+ delegate.OnReceivedData(data2.c_str(),
+ static_cast<int>(data2.length()),
+ static_cast<int>(data2.length()));
+ EXPECT_EQ(2, client.received_response_);
+ EXPECT_EQ(string("response data2"), client.data_);
+ EXPECT_EQ(static_cast<int>(data.length()) + static_cast<int>(data2.length()),
+ client.total_encoded_data_length_);
EXPECT_TRUE(client.response_.isMultipartPayload());
}
diff --git a/webkit/glue/p2p_transport.h b/webkit/glue/p2p_transport.h
new file mode 100644
index 0000000..e80ffb5
--- /dev/null
+++ b/webkit/glue/p2p_transport.h
@@ -0,0 +1,56 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef WEBKIT_GLUE_P2P_TRANSPORT_H_
+#define WEBKIT_GLUE_P2P_TRANSPORT_H_
+
+#include <string>
+
+namespace net {
+class Socket;
+} // namespace net
+
+namespace webkit_glue {
+
+// Interface for P2P transport.
+class P2PTransport {
+ public:
+ enum State {
+ STATE_NONE = 0,
+ STATE_WRITABLE = 1,
+ STATE_READABLE = 2,
+ };
+
+ class EventHandler {
+ public:
+ virtual ~EventHandler() {}
+
+ // Called for each local candidate.
+ virtual void OnCandidateReady(const std::string& address) = 0;
+
+ // Called when readable of writable state of the stream changes.
+ virtual void OnStateChange(State state) = 0;
+ };
+
+ virtual ~P2PTransport() {}
+
+ // Initialize transport using specified configuration. Returns true
+ // if initialization succeeded.
+ virtual bool Init(const std::string& name,
+ const std::string& config,
+ EventHandler* event_handler) = 0;
+
+ // Add candidate received from the remote peer. Returns false if the
+ // provided address is not in a valid format.
+ virtual bool AddRemoteCandidate(const std::string& address) = 0;
+
+ // Returns socket interface that can be used to send/receive
+ // data. Returned object is owned by the transport. Pending calls on
+ // the socket are canceled when the transport is destroyed.
+ virtual net::Socket* GetChannel() = 0;
+};
+
+} // namespace webkit_glue
+
+#endif // WEBKIT_GLUE_P2P_TRANSPORT_H_
diff --git a/webkit/glue/resource_fetcher.cc b/webkit/glue/resource_fetcher.cc
index 39cc59c..28885b4 100644
--- a/webkit/glue/resource_fetcher.cc
+++ b/webkit/glue/resource_fetcher.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -23,10 +23,12 @@ using WebKit::WebURLResponse;
namespace webkit_glue {
ResourceFetcher::ResourceFetcher(const GURL& url, WebFrame* frame,
- Callback* c)
+ WebURLRequest::TargetType target_type,
+ Callback* callback)
: url_(url),
+ target_type_(target_type),
completed_(false),
- callback_(c) {
+ callback_(callback) {
// Can't do anything without a frame. However, delegate can be NULL (so we
// can do a http request and ignore the results).
DCHECK(frame);
@@ -47,6 +49,7 @@ void ResourceFetcher::Cancel() {
void ResourceFetcher::Start(WebFrame* frame) {
WebURLRequest request(url_);
+ request.setTargetType(target_type_);
frame->dispatchWillSendRequest(request);
loader_.reset(WebKit::webKitClient()->createURLLoader());
@@ -85,7 +88,8 @@ void ResourceFetcher::didReceiveResponse(
}
void ResourceFetcher::didReceiveData(
- WebURLLoader* loader, const char* data, int data_length) {
+ WebURLLoader* loader, const char* data, int data_length,
+ int encoded_data_length) {
DCHECK(!completed_);
DCHECK(data_length > 0);
@@ -120,8 +124,9 @@ void ResourceFetcher::didFail(WebURLLoader* loader, const WebURLError& error) {
// A resource fetcher with a timeout
ResourceFetcherWithTimeout::ResourceFetcherWithTimeout(
- const GURL& url, WebFrame* frame, int timeout_secs, Callback* c)
- : ResourceFetcher(url, frame, c) {
+ const GURL& url, WebFrame* frame, WebURLRequest::TargetType target_type,
+ int timeout_secs, Callback* callback)
+ : ResourceFetcher(url, frame, target_type, callback) {
timeout_timer_.Start(TimeDelta::FromSeconds(timeout_secs), this,
&ResourceFetcherWithTimeout::TimeoutFired);
}
diff --git a/webkit/glue/resource_fetcher.h b/webkit/glue/resource_fetcher.h
index eb9411b..6af9b54 100644
--- a/webkit/glue/resource_fetcher.h
+++ b/webkit/glue/resource_fetcher.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
@@ -16,10 +16,11 @@
#include "base/basictypes.h"
#include "base/callback.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "base/timer.h"
#include "googleurl/src/gurl.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoaderClient.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLRequest.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLResponse.h"
class GURL;
@@ -27,7 +28,6 @@ class GURL;
namespace WebKit {
class WebFrame;
class WebURLLoader;
-class WebURLRequest;
struct WebURLError;
}
@@ -43,7 +43,8 @@ class ResourceFetcher : public WebKit::WebURLLoaderClient {
// We need a frame to make requests.
ResourceFetcher(
- const GURL& url, WebKit::WebFrame* frame, Callback* callback);
+ const GURL& url, WebKit::WebFrame* frame,
+ WebKit::WebURLRequest::TargetType target_type, Callback* callback);
~ResourceFetcher();
// Stop the request and don't call the callback.
@@ -63,8 +64,10 @@ class ResourceFetcher : public WebKit::WebURLLoaderClient {
WebKit::WebURLLoader* loader, const WebKit::WebURLResponse& response);
virtual void didReceiveCachedMetadata(
WebKit::WebURLLoader* loader, const char* data, int data_length);
+
virtual void didReceiveData(
- WebKit::WebURLLoader* loader, const char* data, int data_length);
+ WebKit::WebURLLoader* loader, const char* data, int data_length,
+ int encoded_data_length);
virtual void didFinishLoading(
WebKit::WebURLLoader* loader, double finishTime);
virtual void didFail(
@@ -75,6 +78,9 @@ class ResourceFetcher : public WebKit::WebURLLoaderClient {
// URL we're fetching
GURL url_;
+ // Target type
+ WebKit::WebURLRequest::TargetType target_type_;
+
// A copy of the original resource response
WebKit::WebURLResponse response_;
@@ -102,8 +108,11 @@ class ResourceFetcher : public WebKit::WebURLLoaderClient {
// A resource fetcher with a timeout
class ResourceFetcherWithTimeout : public ResourceFetcher {
public:
- ResourceFetcherWithTimeout(const GURL& url, WebKit::WebFrame* frame,
- int timeout_secs, Callback* c);
+ ResourceFetcherWithTimeout(const GURL& url,
+ WebKit::WebFrame* frame,
+ WebKit::WebURLRequest::TargetType target_type,
+ int timeout_secs,
+ Callback* callback);
virtual ~ResourceFetcherWithTimeout();
private:
diff --git a/webkit/glue/resource_fetcher_unittest.cc b/webkit/glue/resource_fetcher_unittest.cc
index 965d285..2888a94 100644
--- a/webkit/glue/resource_fetcher_unittest.cc
+++ b/webkit/glue/resource_fetcher_unittest.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -15,6 +15,7 @@
#include "webkit/tools/test_shell/test_shell_test.h"
using WebKit::WebFrame;
+using WebKit::WebURLRequest;
using WebKit::WebURLResponse;
using webkit_glue::ResourceFetcher;
using webkit_glue::ResourceFetcherWithTimeout;
@@ -102,7 +103,7 @@ TEST_F(ResourceFetcherTests, FLAKY_ResourceFetcherDownload) {
GURL url(test_server_.GetURL("files/test_shell/index.html"));
scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate);
scoped_ptr<ResourceFetcher> fetcher(new ResourceFetcher(
- url, frame, delegate->NewCallback()));
+ url, frame, WebURLRequest::TargetIsMainFrame, delegate->NewCallback()));
delegate->WaitForResponse();
@@ -114,7 +115,9 @@ TEST_F(ResourceFetcherTests, FLAKY_ResourceFetcherDownload) {
// Test 404 response.
url = test_server_.GetURL("files/thisfiledoesntexist.html");
delegate.reset(new FetcherDelegate);
- fetcher.reset(new ResourceFetcher(url, frame, delegate->NewCallback()));
+ fetcher.reset(new ResourceFetcher(url, frame,
+ WebURLRequest::TargetIsMainFrame,
+ delegate->NewCallback()));
delegate->WaitForResponse();
@@ -133,7 +136,7 @@ TEST_F(ResourceFetcherTests, FLAKY_ResourceFetcherDidFail) {
GURL url("http://localhost:1339/doesnotexist");
scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate);
scoped_ptr<ResourceFetcher> fetcher(new ResourceFetcher(
- url, frame, delegate->NewCallback()));
+ url, frame, WebURLRequest::TargetIsMainFrame, delegate->NewCallback()));
delegate->WaitForResponse();
@@ -155,7 +158,8 @@ TEST_F(ResourceFetcherTests, ResourceFetcherTimeout) {
GURL url(test_server_.GetURL("slow?1"));
scoped_ptr<FetcherDelegate> delegate(new FetcherDelegate);
scoped_ptr<ResourceFetcher> fetcher(new ResourceFetcherWithTimeout(
- url, frame, 0, delegate->NewCallback()));
+ url, frame, WebURLRequest::TargetIsMainFrame,
+ 0, delegate->NewCallback()));
delegate->WaitForResponse();
@@ -195,7 +199,8 @@ TEST_F(ResourceFetcherTests, ResourceFetcherDeletedInCallback) {
GURL url(test_server_.GetURL("slow?1"));
scoped_ptr<EvilFetcherDelegate> delegate(new EvilFetcherDelegate);
scoped_ptr<ResourceFetcher> fetcher(new ResourceFetcherWithTimeout(
- url, frame, 0, delegate->NewCallback()));
+ url, frame, WebURLRequest::TargetIsMainFrame,
+ 0, delegate->NewCallback()));
delegate->SetFetcher(fetcher.release());
delegate->WaitForResponse();
diff --git a/webkit/glue/resource_loader_bridge.cc b/webkit/glue/resource_loader_bridge.cc
index 3e9c9e8..4cc012d 100644
--- a/webkit/glue/resource_loader_bridge.cc
+++ b/webkit/glue/resource_loader_bridge.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -35,6 +35,7 @@ ResourceDevToolsInfo::~ResourceDevToolsInfo() {}
ResourceResponseInfo::ResourceResponseInfo()
: content_length(-1),
+ encoded_data_length(-1),
appcache_id(appcache::kNoCacheId),
connection_id(0),
connection_reused(false),
diff --git a/webkit/glue/resource_loader_bridge.h b/webkit/glue/resource_loader_bridge.h
index 3519269..e1a5a99 100644
--- a/webkit/glue/resource_loader_bridge.h
+++ b/webkit/glue/resource_loader_bridge.h
@@ -25,9 +25,9 @@
#include "base/file_descriptor_posix.h"
#endif
#include "base/file_path.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
#include "base/platform_file.h"
-#include "base/ref_counted.h"
-#include "base/scoped_ptr.h"
#include "base/time.h"
#include "base/values.h"
#include "googleurl/src/gurl.h"
@@ -141,6 +141,10 @@ struct ResourceResponseInfo {
// Content length if available. -1 if not available
int64 content_length;
+ // Length of the encoded data transferred over the network. In case there is
+ // no data, contains -1.
+ int64 encoded_data_length;
+
// The appcache this response was loaded from, or kNoCacheId.
int64 appcache_id;
@@ -301,7 +305,12 @@ class ResourceLoaderBridge {
// Called when a chunk of response data is available. This method may
// be called multiple times or not at all if an error occurs.
- virtual void OnReceivedData(const char* data, int len) = 0;
+ // The encoded_data_length is the length of the encoded data transferred
+ // over the network, which could be different from data length (e.g. for
+ // gzipped content), or -1 if if unknown.
+ virtual void OnReceivedData(const char* data,
+ int data_length,
+ int encoded_data_length) = 0;
// Called when metadata generated by the renderer is retrieved from the
// cache. This method may be called zero or one times.
diff --git a/webkit/glue/resource_type.h b/webkit/glue/resource_type.h
index 1de4fd2..224656a 100644
--- a/webkit/glue/resource_type.h
+++ b/webkit/glue/resource_type.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -23,6 +23,7 @@ class ResourceType {
WORKER, // the main resource of a dedicated worker.
SHARED_WORKER, // the main resource of a shared worker.
PREFETCH, // an explicitly requested prefetch
+ FAVICON, // a favicon
LAST_TYPE // Place holder so we don't need to change ValidType
// everytime.
};
diff --git a/webkit/glue/resources/input_speech_recording.png b/webkit/glue/resources/input_speech_recording.png
index 59734a5..5c68bc8 100644
--- a/webkit/glue/resources/input_speech_recording.png
+++ b/webkit/glue/resources/input_speech_recording.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_fth.png b/webkit/glue/resources/pdf_button_fth.png
deleted file mode 100644
index 3b2cc9b..0000000
--- a/webkit/glue/resources/pdf_button_fth.png
+++ /dev/null
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_fth_hover.png b/webkit/glue/resources/pdf_button_fth_hover.png
deleted file mode 100644
index 2904fd7..0000000
--- a/webkit/glue/resources/pdf_button_fth_hover.png
+++ /dev/null
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_fth_pressed.png b/webkit/glue/resources/pdf_button_fth_pressed.png
deleted file mode 100644
index 6388c3a..0000000
--- a/webkit/glue/resources/pdf_button_fth_pressed.png
+++ /dev/null
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_ftp.png b/webkit/glue/resources/pdf_button_ftp.png
new file mode 100644
index 0000000..06180b5
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_ftp.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_ftp_hover.png b/webkit/glue/resources/pdf_button_ftp_hover.png
new file mode 100644
index 0000000..e860119
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_ftp_hover.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_ftp_pressed.png b/webkit/glue/resources/pdf_button_ftp_pressed.png
new file mode 100644
index 0000000..8b00560
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_ftp_pressed.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_ftw.png b/webkit/glue/resources/pdf_button_ftw.png
index d4dacc5..6204843 100644
--- a/webkit/glue/resources/pdf_button_ftw.png
+++ b/webkit/glue/resources/pdf_button_ftw.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_ftw_hover.png b/webkit/glue/resources/pdf_button_ftw_hover.png
index e5c98f4..e7a48ab 100644
--- a/webkit/glue/resources/pdf_button_ftw_hover.png
+++ b/webkit/glue/resources/pdf_button_ftw_hover.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_ftw_pressed.png b/webkit/glue/resources/pdf_button_ftw_pressed.png
index 8db22b7..e300247 100644
--- a/webkit/glue/resources/pdf_button_ftw_pressed.png
+++ b/webkit/glue/resources/pdf_button_ftw_pressed.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_print.png b/webkit/glue/resources/pdf_button_print.png
new file mode 100644
index 0000000..025eca1
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_print.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_print_hover.png b/webkit/glue/resources/pdf_button_print_hover.png
new file mode 100644
index 0000000..0328b19
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_print_hover.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_print_pressed.png b/webkit/glue/resources/pdf_button_print_pressed.png
new file mode 100644
index 0000000..c1148f5
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_print_pressed.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_save.png b/webkit/glue/resources/pdf_button_save.png
new file mode 100644
index 0000000..8848bac
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_save.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_save_hover.png b/webkit/glue/resources/pdf_button_save_hover.png
new file mode 100644
index 0000000..a6f2527
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_save_hover.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_save_pressed.png b/webkit/glue/resources/pdf_button_save_pressed.png
new file mode 100644
index 0000000..237fad4
--- /dev/null
+++ b/webkit/glue/resources/pdf_button_save_pressed.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_zoomin.png b/webkit/glue/resources/pdf_button_zoomin.png
index 3d399c6..f53382f 100644
--- a/webkit/glue/resources/pdf_button_zoomin.png
+++ b/webkit/glue/resources/pdf_button_zoomin.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_zoomin_hover.png b/webkit/glue/resources/pdf_button_zoomin_hover.png
index 597f489..4534f2f 100644
--- a/webkit/glue/resources/pdf_button_zoomin_hover.png
+++ b/webkit/glue/resources/pdf_button_zoomin_hover.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_zoomin_pressed.png b/webkit/glue/resources/pdf_button_zoomin_pressed.png
index 7847808..ecfa4bb 100644
--- a/webkit/glue/resources/pdf_button_zoomin_pressed.png
+++ b/webkit/glue/resources/pdf_button_zoomin_pressed.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_zoomout.png b/webkit/glue/resources/pdf_button_zoomout.png
index c1b7c7c..1c31809 100644
--- a/webkit/glue/resources/pdf_button_zoomout.png
+++ b/webkit/glue/resources/pdf_button_zoomout.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_zoomout_hover.png b/webkit/glue/resources/pdf_button_zoomout_hover.png
index aa555cc..12009a5 100644
--- a/webkit/glue/resources/pdf_button_zoomout_hover.png
+++ b/webkit/glue/resources/pdf_button_zoomout_hover.png
Binary files differ
diff --git a/webkit/glue/resources/pdf_button_zoomout_pressed.png b/webkit/glue/resources/pdf_button_zoomout_pressed.png
index e16d8d6..fa922d7 100644
--- a/webkit/glue/resources/pdf_button_zoomout_pressed.png
+++ b/webkit/glue/resources/pdf_button_zoomout_pressed.png
Binary files differ
diff --git a/webkit/glue/resources/webkit_strings_ar.xtb b/webkit/glue/resources/webkit_strings_ar.xtb
index 0f2e739..59f5f87 100644
--- a/webkit/glue/resources/webkit_strings_ar.xtb
+++ b/webkit/glue/resources/webkit_strings_ar.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">أخفق تثبيت المكون الإضافي من <ph name="URL"/></translation>
<translation id="9186171386827445984">جارٍ تحميل المستند: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> من الصفحات...</translation>
<translation id="1235745349614807883">محو آخر عمليات البحث</translation>
+<translation id="1171774979989969504">الرجاء إدخال عنوان البريد الإلكتروني.</translation>
+<translation id="709897737746224366">الرجاء مطابقة التنسيق المطلوب.</translation>
<translation id="5048533449481078685">محدّد القائمة</translation>
<translation id="372362261556059955">المكوّن الإضافي المطلوب</translation>
<translation id="4202807286478387388">الدخول</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">تحميل...</translation>
<translation id="6845533974506654842">اضغط</translation>
<translation id="8244226242650769279">مخطّط صورة</translation>
+<translation id="310520048233152454">الرجاء إدخال عنوان URL.</translation>
<translation id="2548326553472216322">لا عمليات بحث حديثة</translation>
+<translation id="7263440858009898357">الرجاء تحديد عنصر من القائمة.</translation>
+<translation id="5164977714490026579">يجب أن تكون القيمة أكبر من أو تساوي <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (درجة عالية)</translation>
<translation id="3040011195152428237">رابط</translation>
<translation id="2745343197843472802">الحصول على المكوّن الإضافي</translation>
+<translation id="8451268428117625855">الرجاء تحديد ملف.</translation>
<translation id="5776402066334188252">الرجاء التأكيد على أنك تريد تثبيت المكوّن الإضافي هذا. يجب تثبيت المكونات الإضافية التي تثق فيها فقط.</translation>
-<translation id="4003986561708175844">لم يتم تثبيت المكون الإضافي المطلوب</translation>
<translation id="3018094406922859308">جارٍ تنزيل المكوّن الإضافي...</translation>
<translation id="7364796246159120393">اختيار ملفّ</translation>
+<translation id="2761667185364618470">الرجاء تحديد هذا المربع إذا أردت المتابعة.</translation>
<translation id="8964020114565522021">سحب الملفّ إلى هنا</translation>
+<translation id="5129723458012748440">لم يتم تثبيت المكون الإضافي <ph name="PLUGIN"/>.</translation>
<translation id="838869780401515933">الاختيار</translation>
<translation id="2846343701378493991">1024 (درجة متوسطة)</translation>
<translation id="5476505524087279545">إزالة علامة الاختيار</translation>
<translation id="3789841737615482174">تثبيت</translation>
+<translation id="2507943997699731163">الرجاء ملء هذا الحقل.</translation>
<translation id="5253117816378681419">الرجاء التأكيد على أنك تريد تثبيت المكوّن الإضافي <ph name="PLUGIN"/>. يجب تثبيت المكونات الإضافية التي تثق فيها فقط.</translation>
<translation id="6663448176199120256">آخر عمليات البحث</translation>
+<translation id="7335060848622232389">تم تعطيل تثبيت المكونات الإضافية.</translation>
<translation id="2597378329261239068">هذا المستند محمي بكلمة المرور. الرجاء إدخال كلمة مرور.</translation>
+<translation id="5466621249238537318">الرجاء تحديد ملف واحد أو أكثر.</translation>
+<translation id="8750798805984357768">الرجاء اختيار أحد هذه الخيارات.</translation>
<translation id="7740050170769002709">محتوى HTML</translation>
+<translation id="2226276347425096477">الرجاء اختصار هذا النص حتى يصل إلى <ph name="MAX_CHARACTERS"/> من الحروف أو أقل (أنت الآن تستخدم <ph name="CURRENT_LENGTH"/> من الحروف).</translation>
+<translation id="1639239467298939599">جارٍ التحميل.</translation>
+<translation id="2908441821576996758">الرجاء إدخال قائمة مفصولة بفواصل لعناوين البريد الإلكتروني.</translation>
<translation id="5939518447894949180">إعادة</translation>
+<translation id="835897206747267392">قيمة غير صحيحة</translation>
+<translation id="3851140433852960970">لا يتوفر أي مكون إضافي لعرض هذا المحتوى.</translation>
<translation id="1842960171412779397">الاختيار</translation>
+<translation id="3450233048674729344">يجب أن تكون القيمة أقل من أو تساوي <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">لم يتم تثبيت المكون الإضافي المطلوب.</translation>
<translation id="7638452146404718955">انقر هنا لتنزيل المكون الإضافي</translation>
<translation id="6119846243427417423">تنشيط</translation>
<translation id="8444882422881193423">عدد الملفات: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">لم يتم تثبيت المكون الإضافي <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">لا يتوفر أي مكون إضافي لعرض هذا المحتوى</translation>
+<translation id="3934680773876859118">إخفاق تحميل مستند PDF</translation>
<translation id="8597182159515967513">العنوان</translation>
<translation id="2653659639078652383">إرسال</translation>
<translation id="8475551193147984329">المكوّن الإضافي المطلوب <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_bg.xtb b/webkit/glue/resources/webkit_strings_bg.xtb
index 09f4a71..41ce997 100644
--- a/webkit/glue/resources/webkit_strings_bg.xtb
+++ b/webkit/glue/resources/webkit_strings_bg.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Инсталирането на приставката от <ph name="URL"/> не бе успешно</translation>
<translation id="9186171386827445984">Документът се зарежда: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> страници...</translation>
<translation id="1235745349614807883">Изчистване на скорошните търсения</translation>
+<translation id="1171774979989969504">Моля, въведете имейл адрес.</translation>
+<translation id="709897737746224366">Моля, спазвайте изисквания формат.</translation>
<translation id="5048533449481078685">списъчен показалец</translation>
<translation id="372362261556059955">Необходима е допълнителна приставка</translation>
<translation id="4202807286478387388">преминаване</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Зарежда се...</translation>
<translation id="6845533974506654842">натискане</translation>
<translation id="8244226242650769279">карта с изображения</translation>
+<translation id="310520048233152454">Моля, въведете URL адрес.</translation>
<translation id="2548326553472216322">Няма скорошни търсения</translation>
+<translation id="7263440858009898357">Моля, изберете елемент в списъка.</translation>
+<translation id="5164977714490026579">Стойността трябва да е по-голяма или равна на <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (висока степен на сложност)</translation>
<translation id="3040011195152428237">връзка</translation>
<translation id="2745343197843472802">Изтеглете приставката</translation>
+<translation id="8451268428117625855">Моля, изберете файл.</translation>
<translation id="5776402066334188252">Моля, потвърдете, че искате да инсталирате тази приставка. Трябва да инсталирате само приставки, на които имате доверие.</translation>
-<translation id="4003986561708175844">Необходимата приставка не е инсталирана</translation>
<translation id="3018094406922859308">Приставката се изтегля...</translation>
<translation id="7364796246159120393">Избор на файл</translation>
+<translation id="2761667185364618470">Моля, поставете отметка в това квадратче, ако искате да продължите.</translation>
<translation id="8964020114565522021">Плъзнете файла тук</translation>
+<translation id="5129723458012748440">Не е инсталирана приставката „<ph name="PLUGIN"/>“.</translation>
<translation id="838869780401515933">отмятане</translation>
<translation id="2846343701378493991">1024 (средна степен на сложност)</translation>
<translation id="5476505524087279545">премахване на отметката</translation>
<translation id="3789841737615482174">Инсталиране</translation>
+<translation id="2507943997699731163">Моля, попълнете това поле.</translation>
<translation id="5253117816378681419">Моля, потвърдете, че искате да инсталирате приставката <ph name="PLUGIN"/>. Трябва да инсталирате само приставки, на които имате доверие.</translation>
<translation id="6663448176199120256">Скорошни търсения</translation>
+<translation id="7335060848622232389">Инсталирането на приставки е деактивирано.</translation>
<translation id="2597378329261239068">Този документ е защитен с парола. Моля, въведете я.</translation>
+<translation id="5466621249238537318">Моля, изберете един или повече файлове.</translation>
+<translation id="8750798805984357768">Моля, изберете една от тези опции.</translation>
<translation id="7740050170769002709">HTML съдържание</translation>
+<translation id="2226276347425096477">Моля, съкратете този текст до <ph name="MAX_CHARACTERS"/> знака или по-малко (понастоящем използвате <ph name="CURRENT_LENGTH"/> знака).</translation>
+<translation id="1639239467298939599">Зарежда се</translation>
+<translation id="2908441821576996758">Моля, въведете списък с имейл адреси, разделени със запетаи.</translation>
<translation id="5939518447894949180">Повторно задаване</translation>
+<translation id="835897206747267392">Невалидна стойност.</translation>
+<translation id="3851140433852960970">Няма налична приставка за показване на това съдържание.</translation>
<translation id="1842960171412779397">Избиране</translation>
+<translation id="3450233048674729344">Стойността трябва да е по-малка или равна на <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Необходимата приставка не е инсталирана.</translation>
<translation id="7638452146404718955">Кликнете тук, за да изтеглите приставката</translation>
<translation id="6119846243427417423">активиране</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> файла</translation>
-<translation id="4470547978413275879">Не е инсталирана приставката <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">Няма налична приставка за показване на това съдържание</translation>
+<translation id="3934680773876859118">PDF документът не успя да се зареди</translation>
<translation id="8597182159515967513">заглавие</translation>
<translation id="2653659639078652383">Изпращане</translation>
<translation id="8475551193147984329">Необходима е приставката <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_bn.xtb b/webkit/glue/resources/webkit_strings_bn.xtb
index 7143769..ed72a15 100644
--- a/webkit/glue/resources/webkit_strings_bn.xtb
+++ b/webkit/glue/resources/webkit_strings_bn.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/>-এর থেকে প্ল্যাগ-ইন ইনস্টল করতে ব্যর্থ হয়েছে</translation>
<translation id="9186171386827445984">নথি লোড হচ্ছে: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> পৃষ্ঠা...</translation>
<translation id="1235745349614807883">সাম্প্রতিক অনুসন্ধানগুলি সাফ করুন</translation>
+<translation id="1171774979989969504">দয়া করে কোন ইমেল ঠিকানা প্রবেশ করান:</translation>
+<translation id="709897737746224366">দয়া করে অনুরোধ হওয়া বিন্যাসটি মেলান৷</translation>
<translation id="5048533449481078685">তালিকা নির্দেশক</translation>
<translation id="372362261556059955">অতিরিক্ত প্লাগ-ইন দরকার</translation>
<translation id="4202807286478387388">লাফ দিন</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">লোড হচ্ছে...</translation>
<translation id="6845533974506654842">টিপুন</translation>
<translation id="8244226242650769279">ছবি মানচিত্র</translation>
+<translation id="310520048233152454">দয়া করে একটি বৈধ URL প্রবেশ করুন৷</translation>
<translation id="2548326553472216322">কোন সাম্প্রতিক অনুসন্ধান নেই</translation>
+<translation id="7263440858009898357">তালিকা থেকে একটি আইটেম নির্বাচন করুন৷ </translation>
+<translation id="5164977714490026579">মানটি অবশ্যই <ph name="MINIMUM"/>এর চেয়ে বেশি বা সমান হবে৷</translation>
<translation id="5944544982112848342">2048 (উচ্চ গ্রেড)</translation>
<translation id="3040011195152428237">লিঙ্ক</translation>
<translation id="2745343197843472802">প্লাগ-ইন পান</translation>
+<translation id="8451268428117625855">দয়া করে একটি ফাইল নির্বাচন করুন৷</translation>
<translation id="5776402066334188252">আপনি প্ল্যাগ-ইন ইনস্টল করতে চান কি না দয়া করে নিশ্চিত করুন৷ আপনার কেবল সেই প্ল্যাগ-ইনগুলি ইনস্টল করা উচিত যা আপনি বিশ্বাস করেন৷</translation>
-<translation id="4003986561708175844">প্রয়োজনীয় প্ল্যাগ-ইন ইনস্টল করা নেই</translation>
<translation id="3018094406922859308">প্লাগ-ইন ডাউনলোড হচ্ছে...</translation>
<translation id="7364796246159120393">ফাইল চয়ন করুন</translation>
+<translation id="2761667185364618470">আপনি যদি এগিয়ে যেতে চান তবে দয়া করে এই বাক্সটি পরীক্ষা করুন৷</translation>
<translation id="8964020114565522021">ফাইল এখানে টেনে আনুন</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> প্লাগ-ইন ইনস্টল নেই|</translation>
<translation id="838869780401515933">চেক করুন</translation>
<translation id="2846343701378493991">1024 (মধ্যম গ্রেড)</translation>
<translation id="5476505524087279545">আনচেক</translation>
<translation id="3789841737615482174">ইনস্টল করুন</translation>
+<translation id="2507943997699731163">দয়া করে এই ক্ষেত্রটি পূরণ করুন৷</translation>
<translation id="5253117816378681419">আপনি <ph name="PLUGIN"/> প্ল্যাগ-ইনটি ইনস্টল করতে চান কি না দয়া করে নিশ্চিত করুন৷ আপনার কেবল সেই প্ল্যাগ-ইনগুলি ইনস্টল করার উচিত যেগুলিকে আপনি বিশ্বাস করেন৷</translation>
<translation id="6663448176199120256">সাম্প্রতিক অনুসন্ধানগুলি</translation>
+<translation id="7335060848622232389">প্ল্যাগ-ইন ইনস্টল করা অক্ষম করা হয়েছে৷</translation>
<translation id="2597378329261239068">এই দস্তাবেজটি পাসওয়ার্ড সুরক্ষিত৷ দয়া করে একটি পাসওয়ার্ড লিখুন৷</translation>
+<translation id="5466621249238537318">দয়া করে এক বা একাধিক ফাইল নির্বাচন করুন৷</translation>
+<translation id="8750798805984357768">দয়া করে বিকল্পগুলির একটি নির্বাচন করুন৷</translation>
<translation id="7740050170769002709">HTML সামগ্রী</translation>
+<translation id="2226276347425096477">দয়া করে এই পাঠ্যটি <ph name="MAX_CHARACTERS"/>টি অক্ষর বা তার কমে (আপনি বর্তমানে <ph name="CURRENT_LENGTH"/>টি অক্ষর ব্যবহার করছেন) সংক্ষিপ্ত করুন৷</translation>
+<translation id="1639239467298939599">লোড হচ্ছে</translation>
+<translation id="2908441821576996758">দয়া করে ইমেল ঠিকানাগুলির একটি কমা দিয়ে আলাদা করা মান প্রবেশ করান৷</translation>
<translation id="5939518447894949180">রিসেট করুন</translation>
+<translation id="835897206747267392">অকার্যকর মান৷</translation>
+<translation id="3851140433852960970">এই সামগ্রী প্রদর্শন করার জন্য কোনও প্ল্যাগ-ইন উপলব্ধ নেই৷</translation>
<translation id="1842960171412779397">নির্বাচন করুন</translation>
+<translation id="3450233048674729344">মানটি অবশ্যই <ph name="MAXIMUM"/>এর চেয়ে কম বা সমান হবে৷</translation>
+<translation id="9198010615634362518">প্রয়োজনীয় প্ল্যাগ-ইন ইনস্টল করা নেই৷</translation>
<translation id="7638452146404718955">প্ল্যাগ-ইন ডাউনলোড করার জন্য এখানে ক্লিক করুন</translation>
<translation id="6119846243427417423">সক্রিয় করুন</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> টি ফাইল</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> প্লাগ-ইন ইনস্টল নেই</translation>
-<translation id="6765711848403622008">এই সামগ্রী প্রদর্শন করার জন্য কোনও প্ল্যাগ-ইন উপলব্ধ নেই</translation>
+<translation id="3934680773876859118">PDF দস্তাবেজ লোড হতে ব্যর্থ</translation>
<translation id="8597182159515967513">শিরোনামা</translation>
<translation id="2653659639078652383">জমা</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> প্লাগ-ইন প্রয়োজন</translation>
diff --git a/webkit/glue/resources/webkit_strings_ca.xtb b/webkit/glue/resources/webkit_strings_ca.xtb
index 59756a8..baaa04e 100644
--- a/webkit/glue/resources/webkit_strings_ca.xtb
+++ b/webkit/glue/resources/webkit_strings_ca.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">S'ha produït un error en instal·lar el connector des de <ph name="URL"/></translation>
<translation id="9186171386827445984">S'està carregant el document: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pàgines...</translation>
<translation id="1235745349614807883">Esborra les cerques recents</translation>
+<translation id="1171774979989969504">Introduïu una adreça electrònica.</translation>
+<translation id="709897737746224366">Feu servir el format sol·licitat.</translation>
<translation id="5048533449481078685">marcador de llistes</translation>
<translation id="372362261556059955">Es necessita un connector addicional</translation>
<translation id="4202807286478387388">salta</translation>
@@ -16,31 +18,46 @@
<translation id="370665806235115550">S'està carregant...</translation>
<translation id="6845533974506654842">prem</translation>
<translation id="8244226242650769279">mapa d'imatges</translation>
+<translation id="310520048233152454">Introduïu un URL.</translation>
<translation id="2548326553472216322">No hi ha cerques recents</translation>
+<translation id="7263440858009898357">Seleccioneu un element de la llista.</translation>
+<translation id="5164977714490026579">El valor ha de ser més gran o igual que <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Gran)</translation>
<translation id="3040011195152428237">enllaç</translation>
<translation id="2745343197843472802">Obtén el connector</translation>
+<translation id="8451268428117625855">Seleccioneu un fitxer.</translation>
<translation id="5776402066334188252">Confirmeu que voleu instal·lar aquest connector. Us recomanem que només instal·leu connectors de la vostra confiança.</translation>
-<translation id="4003986561708175844">El connector necessari no està instal·lat</translation>
<translation id="3018094406922859308">S'està baixant el connector...</translation>
<translation id="7364796246159120393">Selecciona el fitxer</translation>
+<translation id="2761667185364618470">Marqueu aquesta casella si voleu continuar.</translation>
<translation id="8964020114565522021">Arrossegueu el fitxer aquí.</translation>
+<translation id="5129723458012748440">El connector <ph name="PLUGIN"/> no està instal·lat.</translation>
<translation id="838869780401515933">marca</translation>
<translation id="2846343701378493991">1024 (Mitjà)</translation>
<translation id="5476505524087279545">desmarca</translation>
<translation id="3789841737615482174">Instal·la</translation>
+<translation id="2507943997699731163">Empleneu aquest camp.</translation>
<translation id="5253117816378681419">Confirmeu que voleu instal·lar el connector <ph name="PLUGIN"/>. Us recomanem que només instal·leu connectors de la vostra confiança.</translation>
<translation id="6663448176199120256">Cerques recents</translation>
+<translation id="7335060848622232389">S'ha desactivat la instal·lació de connectors.</translation>
<translation id="2597378329261239068">Aquest document està protegit mitjançant contrasenya. Introduïu una contrasenya.</translation>
+<translation id="5466621249238537318">Seleccioneu un o diversos fitxers.</translation>
+<translation id="8750798805984357768">Seleccioneu una d'aquestes opcions.</translation>
<translation id="7740050170769002709">Contingut HTML</translation>
+<translation id="2226276347425096477">Escurceu aquest text a un màxim de <ph name="MAX_CHARACTERS"/> caràcters (ara n'esteu utilitzant <ph name="CURRENT_LENGTH"/>).</translation>
+<translation id="1639239467298939599">S'està carregant</translation>
+<translation id="2908441821576996758">Introduïu una llista d'adreces electròniques separades per comes.</translation>
<translation id="5939518447894949180">Restablir</translation>
+<translation id="835897206747267392">Valor no vàlid.</translation>
+<translation id="3851140433852960970">No hi ha cap connector disponible per mostrar aquest contingut.</translation>
<translation id="1842960171412779397">selecciona</translation>
+<translation id="3450233048674729344">El valor ha de ser més petit o igual que <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">El connector necessari no està instal·lat.</translation>
<translation id="7638452146404718955">Feu clic aquí per baixar el connector</translation>
<translation id="6119846243427417423">activa</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fitxers</translation>
-<translation id="4470547978413275879">El connector <ph name="PLUGIN"/> no està instal·lat</translation>
-<translation id="6765711848403622008">No hi ha cap connector disponible per mostrar aquest contingut</translation>
-<translation id="8597182159515967513">Capçalera</translation>
+<translation id="3934680773876859118">No es pot carregar el document en format PDF</translation>
+<translation id="8597182159515967513">Encapçalament</translation>
<translation id="2653659639078652383">Envia</translation>
<translation id="8475551193147984329">Es necessita el connector <ph name="PLUGIN"/></translation>
</translationbundle> \ No newline at end of file
diff --git a/webkit/glue/resources/webkit_strings_cs.xtb b/webkit/glue/resources/webkit_strings_cs.xtb
index 8d3784f..7b5042b 100644
--- a/webkit/glue/resources/webkit_strings_cs.xtb
+++ b/webkit/glue/resources/webkit_strings_cs.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Instalace pluginu z adresy URL <ph name="URL"/> se nezdařila</translation>
<translation id="9186171386827445984">Načítání dokumentu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stran...</translation>
<translation id="1235745349614807883">Smazat nedávná vyhledávání</translation>
+<translation id="1171774979989969504">Zadejte prosím e-mailovou adresu.</translation>
+<translation id="709897737746224366">Zadejte hodnotu, která odpovídá požadovanému formátu.</translation>
<translation id="5048533449481078685">značka seznamu</translation>
<translation id="372362261556059955">Je zapotřebí další plugin</translation>
<translation id="4202807286478387388">přejít</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Načítání...</translation>
<translation id="6845533974506654842">zmáčknout</translation>
<translation id="8244226242650769279">obrázková mapa</translation>
+<translation id="310520048233152454">Zadejte prosím adresu URL.</translation>
<translation id="2548326553472216322">Žádná nedávná vyhledávání</translation>
+<translation id="7263440858009898357">Vyberte prosím v seznamu některou položku.</translation>
+<translation id="5164977714490026579">Hodnota musí být větší nebo rovna <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (vysoká kvalita)</translation>
<translation id="3040011195152428237">odkaz</translation>
<translation id="2745343197843472802">Získat plugin</translation>
+<translation id="8451268428117625855">Vyberte prosím soubor.</translation>
<translation id="5776402066334188252">Potvrďte prosím, zda tento plugin chcete nainstalovat. Instalujte pouze pluginy, kterým důvěřujete.</translation>
-<translation id="4003986561708175844">Požadovaný plugin není nainstalován</translation>
<translation id="3018094406922859308">Stahování pluginu...</translation>
<translation id="7364796246159120393">Vybrat soubor</translation>
+<translation id="2761667185364618470">Chcete-li pokračovat, zaškrtněte toto políčko.</translation>
<translation id="8964020114565522021">Přetáhnout soubor sem</translation>
+<translation id="5129723458012748440">Plugin <ph name="PLUGIN"/> není nainstalován.</translation>
<translation id="838869780401515933">zaškrtnout</translation>
<translation id="2846343701378493991">1024 (Střední kvalita)</translation>
<translation id="5476505524087279545">odstranit zaškrtnutí</translation>
<translation id="3789841737615482174">Instalovat</translation>
+<translation id="2507943997699731163">Vyplňte prosím toto pole.</translation>
<translation id="5253117816378681419">Potvrďte prosím, zda chcete nainstalovat plugin <ph name="PLUGIN"/>. Instalujte pouze pluginy, kterým důvěřujete.</translation>
<translation id="6663448176199120256">Nedávná vyhledávání</translation>
+<translation id="7335060848622232389">Instalování pluginů bylo zakázáno.</translation>
<translation id="2597378329261239068">Tento dokument je chráněn heslem. Zadejte prosím heslo.</translation>
+<translation id="5466621249238537318">Vyberte prosím jeden nebo více souborů.</translation>
+<translation id="8750798805984357768">Vyberte jednu z těchto možností.</translation>
<translation id="7740050170769002709">Obsah ve formátu HTML</translation>
+<translation id="2226276347425096477">Zkraťte prosím tento text na <ph name="MAX_CHARACTERS"/> znaků nebo méně. (Aktuálně má <ph name="CURRENT_LENGTH"/> znaků.)</translation>
+<translation id="1639239467298939599">Načítání</translation>
+<translation id="2908441821576996758">Zadejte seznam e-mailových adres oddělených čárkami.</translation>
<translation id="5939518447894949180">Resetovat</translation>
+<translation id="835897206747267392">Neplatná hodnota.</translation>
+<translation id="3851140433852960970">Není k dispozici žádný plugin k zobrazení tohoto obsahu.</translation>
<translation id="1842960171412779397">zvolit</translation>
+<translation id="3450233048674729344">Hodnota musí být menší nebo rovna <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Požadovaný plugin není nainstalován.</translation>
<translation id="7638452146404718955">Plugin můžete stáhnout kliknutím sem</translation>
<translation id="6119846243427417423">aktivovat</translation>
<translation id="8444882422881193423">Počet souborů: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Není nainstalován plugin <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">Není k dispozici žádný plugin k zobrazení tohoto obsahu</translation>
+<translation id="3934680773876859118">Načítání dokumentu PDF se nezdařilo.</translation>
<translation id="8597182159515967513">záhlaví</translation>
<translation id="2653659639078652383">Odeslat</translation>
<translation id="8475551193147984329">Je požadován plugin <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_da.xtb b/webkit/glue/resources/webkit_strings_da.xtb
index 71d2a6a..ea94bfc 100644
--- a/webkit/glue/resources/webkit_strings_da.xtb
+++ b/webkit/glue/resources/webkit_strings_da.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Installation af plugin fra <ph name="URL"/> mislykkedes</translation>
<translation id="9186171386827445984">Indlæser dokument: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sider...</translation>
<translation id="1235745349614807883">Slet nylige søgninger</translation>
+<translation id="1171774979989969504">Angiv en e-mail-adresse.</translation>
+<translation id="709897737746224366">Find et match til det anmodede format.</translation>
<translation id="5048533449481078685">listemarkering</translation>
<translation id="372362261556059955">Ekstra plugin påkrævet</translation>
<translation id="4202807286478387388">hop</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Indlæser ...</translation>
<translation id="6845533974506654842">tryk</translation>
<translation id="8244226242650769279">billedekort</translation>
+<translation id="310520048233152454">Angiv en webadresse.</translation>
<translation id="2548326553472216322">Ingen nylige søgninger</translation>
+<translation id="7263440858009898357">Vælg et punkt på listen.</translation>
+<translation id="5164977714490026579">Værdien skal være større end eller lig med <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Høj klasse)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Hent plugin</translation>
+<translation id="8451268428117625855">Vælg en fil.</translation>
<translation id="5776402066334188252">Bekræft, at du gerne vil installere dette plugin. Du skal kun installere plugins, som du har tillid til.</translation>
-<translation id="4003986561708175844">Det krævede plugin er ikke installeret</translation>
<translation id="3018094406922859308">Downloader plugin...</translation>
<translation id="7364796246159120393">Vælg fil</translation>
+<translation id="2761667185364618470">Marker dette felt, hvis du vil fortsætte.</translation>
<translation id="8964020114565522021">Træk filer hertil</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/>-plugin er ikke installeret.</translation>
<translation id="838869780401515933">marker</translation>
<translation id="2846343701378493991">1024 (Mellemklasse)</translation>
<translation id="5476505524087279545">fjern markering</translation>
<translation id="3789841737615482174">Installer</translation>
+<translation id="2507943997699731163">Udfyld dette felt.</translation>
<translation id="5253117816378681419">Bekræft, at du vil installere dette <ph name="PLUGIN"/>-plugin. Du skal kun installere plugins, som du har tillid til.</translation>
<translation id="6663448176199120256">Nylige søgninger</translation>
+<translation id="7335060848622232389">Installation af plug-ins er blevet deaktiveret.</translation>
<translation id="2597378329261239068">Dette dokument er adgangskodebeskyttet. Indtast en adgangskode.</translation>
+<translation id="5466621249238537318">Vælg en eller flere filer.</translation>
+<translation id="8750798805984357768">Vælg en af disse muligheder.</translation>
<translation id="7740050170769002709">HTML-indhold</translation>
+<translation id="2226276347425096477">Forkort denne tekst til <ph name="MAX_CHARACTERS"/> tegn eller færre (du bruger i øjeblikket <ph name="CURRENT_LENGTH"/> tegn).</translation>
+<translation id="1639239467298939599">Indlæser...</translation>
+<translation id="2908441821576996758">Angiv en kommasepareret liste over e-mail-adresser.</translation>
<translation id="5939518447894949180">Nulstil</translation>
+<translation id="835897206747267392">Ugyldig værdi.</translation>
+<translation id="3851140433852960970">Der er intet tilgængeligt plugin, som kan vise dette indhold.</translation>
<translation id="1842960171412779397">vælg</translation>
+<translation id="3450233048674729344">Værdien skal være mindre end eller lig med <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Det påkrævede plugin er ikke installeret.</translation>
<translation id="7638452146404718955">Klik her for at downloade plugin</translation>
<translation id="6119846243427417423">aktiver</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> filer</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/>-plugin er ikke installeret</translation>
-<translation id="6765711848403622008">Intet tilgængeligt plugin kan vise dette indhold</translation>
+<translation id="3934680773876859118">PDF-dokumentet kunne ikke indlæses</translation>
<translation id="8597182159515967513">overskrift</translation>
<translation id="2653659639078652383">Indsend</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/>-plugin er påkrævet</translation>
diff --git a/webkit/glue/resources/webkit_strings_de.xtb b/webkit/glue/resources/webkit_strings_de.xtb
index 6d27410..26ce85a 100644
--- a/webkit/glue/resources/webkit_strings_de.xtb
+++ b/webkit/glue/resources/webkit_strings_de.xtb
@@ -4,42 +4,59 @@
<translation id="4519964825805946997">Installation des Plug-ins von <ph name="URL"/> fehlgeschlagen</translation>
<translation id="9186171386827445984">Dokument wird geladen <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> Seiten...</translation>
<translation id="1235745349614807883">Vor kurzem durchgeführte Suchanfragen löschen</translation>
+<translation id="1171774979989969504">Geben Sie eine E-Mail-Adresse ein.</translation>
+<translation id="709897737746224366">Ihre Eingabe muss mit dem geforderten Format übereinstimmen.</translation>
<translation id="5048533449481078685">Listenmarkierung</translation>
<translation id="372362261556059955">Zusätzliches Plug-in erforderlich</translation>
<translation id="4202807286478387388">springen</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Abbrechen</translation>
-<translation id="795667975304826397">Keine Datei ausgewählt</translation>
+<translation id="795667975304826397">Keine ausgewählt</translation>
<translation id="1416462845279468967">Plug-in-Installation fehlgeschlagen</translation>
<translation id="8141602879876242471">Dieser Index kann durchsucht werden. Geben Sie Suchbegriffe ein:</translation>
<translation id="5650795167354946011">Klicken Sie nach der Installation des Plug-ins hier, um eine Aktualisierung durchzuführen.</translation>
<translation id="370665806235115550">Wird geladen...</translation>
<translation id="6845533974506654842">klicken</translation>
<translation id="8244226242650769279">Imagemap</translation>
+<translation id="310520048233152454">Geben Sie eine URL ein.</translation>
<translation id="2548326553472216322">Keine vor kurzem durchgeführte Suchanfragen</translation>
+<translation id="7263440858009898357">Wählen Sie ein Element in der Liste aus.</translation>
+<translation id="5164977714490026579">Wert muss größer als oder gleich <ph name="MINIMUM"/> sein.</translation>
<translation id="5944544982112848342">2048 (High Grade)</translation>
<translation id="3040011195152428237">Link</translation>
<translation id="2745343197843472802">Plug-in abrufen</translation>
+<translation id="8451268428117625855">Wählen Sie eine Datei aus.</translation>
<translation id="5776402066334188252">Bitte bestätigen Sie, dass Sie dieses Plug-in installieren möchten. Installieren Sie nur Plug-ins, denen Sie vertrauen.</translation>
-<translation id="4003986561708175844">Das erforderliche Plug-in ist nicht installiert.</translation>
<translation id="3018094406922859308">Plug-in wird heruntergeladen...</translation>
<translation id="7364796246159120393">Datei auswählen</translation>
+<translation id="2761667185364618470">Aktivieren Sie dieses Kontrollkästchen, wenn Sie fortfahren möchten.</translation>
<translation id="8964020114565522021">Datei hier ablegen</translation>
+<translation id="5129723458012748440">Das Plug-in <ph name="PLUGIN"/> ist nicht installiert.</translation>
<translation id="838869780401515933">auswählen</translation>
<translation id="2846343701378493991">1024 (mittlere Stufe)</translation>
<translation id="5476505524087279545">Auswahl aufheben</translation>
<translation id="3789841737615482174">Installieren</translation>
+<translation id="2507943997699731163">Füllen Sie dieses Feld aus.</translation>
<translation id="5253117816378681419">Bitte bestätigen Sie, dass Sie das Plug-in <ph name="PLUGIN"/> installieren möchten. Installieren Sie nur Plug-ins, denen Sie vertrauen.</translation>
<translation id="6663448176199120256">Vor kurzem durchgeführte Suchanfragen</translation>
+<translation id="7335060848622232389">Die Installation von Plug-ins wurde deaktiviert.</translation>
<translation id="2597378329261239068">Dieses Dokument ist passwortgeschützt. Geben Sie ein Passwort ein.</translation>
+<translation id="5466621249238537318">Wählen Sie eine oder mehrere Dateien aus.</translation>
+<translation id="8750798805984357768">Wählen Sie eine dieser Optionen aus.</translation>
<translation id="7740050170769002709">HTML-Inhalte</translation>
+<translation id="2226276347425096477">Kürzen Sie diesen Text auf max. <ph name="MAX_CHARACTERS"/> Zeichen. Derzeit verwenden Sie <ph name="CURRENT_LENGTH"/> Zeichen.</translation>
+<translation id="1639239467298939599">Wird geladen...</translation>
+<translation id="2908441821576996758">Geben Sie eine durch Kommas getrennte Liste der E-Mail-Adressen ein.</translation>
<translation id="5939518447894949180">Zurücksetzen</translation>
+<translation id="835897206747267392">Ungültiger Wert.</translation>
+<translation id="3851140433852960970">Kein Plug-in zum Anzeigen dieser Inhalte verfügbar</translation>
<translation id="1842960171412779397">auswählen</translation>
+<translation id="3450233048674729344">Wert muss kleiner als oder gleich <ph name="MAXIMUM"/> sein.</translation>
+<translation id="9198010615634362518">Das erforderliche Plug-in ist nicht installiert.</translation>
<translation id="7638452146404718955">Hier klicken, um das Plug-in herunterzuladen</translation>
<translation id="6119846243427417423">aktivieren</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> Dateien</translation>
-<translation id="4470547978413275879">Plug-in <ph name="PLUGIN"/> nicht installiert</translation>
-<translation id="6765711848403622008">Kein Plug-in zum Anzeigen dieses Contents verfügbar</translation>
+<translation id="3934680773876859118">Fehler beim Laden des PDF-Dokuments</translation>
<translation id="8597182159515967513">Kopfzeile</translation>
<translation id="2653659639078652383">Senden</translation>
<translation id="8475551193147984329">Plug-in <ph name="PLUGIN"/> ist erforderlich</translation>
diff --git a/webkit/glue/resources/webkit_strings_el.xtb b/webkit/glue/resources/webkit_strings_el.xtb
index c429294..f9bfc2a 100644
--- a/webkit/glue/resources/webkit_strings_el.xtb
+++ b/webkit/glue/resources/webkit_strings_el.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Η εγκατάσταση της προσθήκης από τη διεύθυνση <ph name="URL"/> απέτυχε</translation>
<translation id="9186171386827445984">Φόρτωση εγγράφου: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> σελίδες...</translation>
<translation id="1235745349614807883">Εκκαθάριση πρόσφατων αναζητήσεων</translation>
+<translation id="1171774979989969504">Εισαγάγετε μια διεύθυνση ηλεκτρονικού ταχυδρομείου.</translation>
+<translation id="709897737746224366">Αντιστοιχίστε τη ζητούμενη μορφή.</translation>
<translation id="5048533449481078685">δείκτης λίστας</translation>
<translation id="372362261556059955">Απαιτείται επιπλέον προσθήκη</translation>
<translation id="4202807286478387388">μεταπήδηση</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Φόρτωση...</translation>
<translation id="6845533974506654842">πατήστε</translation>
<translation id="8244226242650769279">χάρτης εικόνας</translation>
+<translation id="310520048233152454">Εισαγάγετε μια διεύθυνση URL.</translation>
<translation id="2548326553472216322">Δεν υπάρχουν πρόσφατες αναζητήσεις</translation>
+<translation id="7263440858009898357">Επιλέξτε ένα στοιχείο από τη λίστα.</translation>
+<translation id="5164977714490026579">Η τιμή πρέπει να είναι μεγαλύτερη ή ίση του <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Υψηλός βαθμός)</translation>
<translation id="3040011195152428237">σύνδεσμος</translation>
<translation id="2745343197843472802">Λήψη προσθήκης</translation>
+<translation id="8451268428117625855">Επιλέξτε ένα αρχείο.</translation>
<translation id="5776402066334188252">Επιβεβαιώστε ότι θέλετε να εγκαταστήσετε αυτή την προσθήκη. Πρέπει να εγκαθιστάτε μόνο προσθήκες που θεωρείτε αξιόπιστες.</translation>
-<translation id="4003986561708175844">Η απαιτούμενη προσθήκη δεν έχει εγκατασταθεί</translation>
<translation id="3018094406922859308">Λήψη προσθήκης...</translation>
<translation id="7364796246159120393">Επιλογή αρχείου</translation>
+<translation id="2761667185364618470">Αν θέλετε να συνεχίσετε, επιλέξτε αυτό το πλαίσιο.</translation>
<translation id="8964020114565522021">Σύρετε το αρχείο εδώ</translation>
+<translation id="5129723458012748440">Η προσθήκη <ph name="PLUGIN"/> δεν έχει εγκατασταθεί.</translation>
<translation id="838869780401515933">ενεργοποίηση</translation>
<translation id="2846343701378493991">1024 (Μέτριος βαθμός)</translation>
<translation id="5476505524087279545">απενεργοποίηση</translation>
<translation id="3789841737615482174">Εγκατάσταση</translation>
+<translation id="2507943997699731163">Συμπληρώστε αυτό το πεδίο.</translation>
<translation id="5253117816378681419">Επιβεβαιώστε ότι θέλετε να εγκαταστήσετε την προσθήκη <ph name="PLUGIN"/>. Πρέπει να εγκαθιστάτε μόνο προσθήκες που θεωρείτε αξιόπιστες.</translation>
<translation id="6663448176199120256">Πρόσφατες αναζητήσεις</translation>
+<translation id="7335060848622232389">Η εγκατάσταση προσθηκών έχει απενεργοποιηθεί.</translation>
<translation id="2597378329261239068">Αυτό το έγγραφο προστατεύεται με κωδικό πρόσβασης. Πληκτρολογήστε έναν κωδικό πρόσβασης.</translation>
+<translation id="5466621249238537318">Επιλέξτε ένα ή περισσότερα αρχεία.</translation>
+<translation id="8750798805984357768">Ορίστε μία από αυτές τις επιλογές.</translation>
<translation id="7740050170769002709">Περιεχόμενο HTML</translation>
+<translation id="2226276347425096477">Κάντε πιο σύντομο αυτό το κείμενο ώστε να έχει το πολύ <ph name="MAX_CHARACTERS"/> χαρακτήρες (αυτήν τη στιγμή χρησιμοποιείτε <ph name="CURRENT_LENGTH"/> χαρακτήρες).</translation>
+<translation id="1639239467298939599">Γίνεται φόρτωση</translation>
+<translation id="2908441821576996758">Εισαγάγετε μια λίστα διευθύνσεων ηλεκτρονικού ταχυδρομείου διαχωρισμένη με κόμματα.</translation>
<translation id="5939518447894949180">Επαναφορά</translation>
+<translation id="835897206747267392">Μη έγκυρη τιμή.</translation>
+<translation id="3851140433852960970">Δεν υπάρχει διαθέσιμη προσθήκη για την εμφάνιση αυτού του περιεχομένου.</translation>
<translation id="1842960171412779397">επιλογή</translation>
+<translation id="3450233048674729344">Η τιμή πρέπει να είναι μικρότερη ή ίση του <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Η απαιτούμενη προσθήκη δεν είναι εγκατεστημένη.</translation>
<translation id="7638452146404718955">Κάντε κλικ εδώ για να κάνετε λήψη της προσθήκης</translation>
<translation id="6119846243427417423">ενεργοποίηση</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> αρχεία</translation>
-<translation id="4470547978413275879">Η προσθήκη <ph name="PLUGIN"/> δεν έχει εγκατασταθεί</translation>
-<translation id="6765711848403622008">Δεν υπάρχει διαθέσιμη προσθήκη για την εμφάνιση αυτού του περιεχομένου</translation>
+<translation id="3934680773876859118">Δεν ήταν δυνατή η φόρτωση του εγγράφου PDF</translation>
<translation id="8597182159515967513">επικεφαλίδα</translation>
<translation id="2653659639078652383">Υποβολή</translation>
<translation id="8475551193147984329">Απαιτείται η προσθήκη <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_en-GB.xtb b/webkit/glue/resources/webkit_strings_en-GB.xtb
index 417f44a..84f8afe 100644
--- a/webkit/glue/resources/webkit_strings_en-GB.xtb
+++ b/webkit/glue/resources/webkit_strings_en-GB.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Failed to install plug-in from <ph name="URL"/></translation>
<translation id="9186171386827445984">Loading document: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pages...</translation>
<translation id="1235745349614807883">Clear Recent Searches</translation>
+<translation id="1171774979989969504">Please enter an email address.</translation>
+<translation id="709897737746224366">Please match the format requested.</translation>
<translation id="5048533449481078685">list marker</translation>
<translation id="372362261556059955">Additional plug-in needed</translation>
<translation id="4202807286478387388">jump</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Loading...</translation>
<translation id="6845533974506654842">press</translation>
<translation id="8244226242650769279">image map</translation>
+<translation id="310520048233152454">Please enter a URL.</translation>
<translation id="2548326553472216322">No recent searches</translation>
+<translation id="7263440858009898357">Please select an item in the list.</translation>
+<translation id="5164977714490026579">Value must be greater than or equal to <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (High Grade)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Get Plug-in</translation>
+<translation id="8451268428117625855">Please select a file.</translation>
<translation id="5776402066334188252">Please confirm that you would like to install this plug-in. You should only install plug-ins that you trust.</translation>
-<translation id="4003986561708175844">The plug-in required is not installed</translation>
<translation id="3018094406922859308">Downloading plug-in...</translation>
<translation id="7364796246159120393">Choose File</translation>
+<translation id="2761667185364618470">Please tick this box if you want to proceed.</translation>
<translation id="8964020114565522021">Drag file here</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> plug-in is not installed.</translation>
<translation id="838869780401515933">tick</translation>
<translation id="2846343701378493991">1024 (Medium Grade)</translation>
<translation id="5476505524087279545">untick</translation>
<translation id="3789841737615482174">Install</translation>
+<translation id="2507943997699731163">Please fill in this field.</translation>
<translation id="5253117816378681419">Please confirm that you would like to install the <ph name="PLUGIN"/> plug-in. You should only install plug-ins that you trust.</translation>
<translation id="6663448176199120256">Recent Searches</translation>
+<translation id="7335060848622232389">Installing plug-ins has been disabled.</translation>
<translation id="2597378329261239068">This document is password-protected. Please enter a password.</translation>
+<translation id="5466621249238537318">Please select one or more files.</translation>
+<translation id="8750798805984357768">Please select one of these options.</translation>
<translation id="7740050170769002709">HTML content</translation>
+<translation id="2226276347425096477">Please shorten this text to <ph name="MAX_CHARACTERS"/> characters or less (you are currently using <ph name="CURRENT_LENGTH"/> characters).</translation>
+<translation id="1639239467298939599">Loading</translation>
+<translation id="2908441821576996758">Please enter a comma-separated list of email addresses.</translation>
<translation id="5939518447894949180">Reset</translation>
+<translation id="835897206747267392">Invalid value.</translation>
+<translation id="3851140433852960970">No plug-in available to display this content</translation>
<translation id="1842960171412779397">select</translation>
+<translation id="3450233048674729344">Value must be less than or equal to <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">The plug-in required is not installed.</translation>
<translation id="7638452146404718955">Click here to download plug-in</translation>
<translation id="6119846243427417423">activate</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> files</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> plug-in is not installed</translation>
-<translation id="6765711848403622008">No plug-in available to display this content</translation>
+<translation id="3934680773876859118">Failed to load PDF document</translation>
<translation id="8597182159515967513">heading</translation>
<translation id="2653659639078652383">Submit</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> plug-in needed</translation>
diff --git a/webkit/glue/resources/webkit_strings_es-419.xtb b/webkit/glue/resources/webkit_strings_es-419.xtb
index 5ec0935..82df076 100644
--- a/webkit/glue/resources/webkit_strings_es-419.xtb
+++ b/webkit/glue/resources/webkit_strings_es-419.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Error al instalar el complemento desde <ph name="URL"/></translation>
<translation id="9186171386827445984">Cargando documento: páginas <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/>...</translation>
<translation id="1235745349614807883">Eliminar búsquedas recientes</translation>
+<translation id="1171774979989969504">Ingresa una dirección de correo electrónico.</translation>
+<translation id="709897737746224366">Haz coincidir el formato solicitado.</translation>
<translation id="5048533449481078685">marcador de listas</translation>
<translation id="372362261556059955">Se necesita un complemento adicional</translation>
<translation id="4202807286478387388">saltar</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Cargando...</translation>
<translation id="6845533974506654842">hacer clic</translation>
<translation id="8244226242650769279">mapa de imágenes</translation>
+<translation id="310520048233152454">Ingresa una URL.</translation>
<translation id="2548326553472216322">No hay búsquedas recientes</translation>
+<translation id="7263440858009898357">Selecciona un elemento de la lista</translation>
+<translation id="5164977714490026579">El valor debe ser mayor de o igual a <ph name="MINIMUM"/></translation>
<translation id="5944544982112848342">2048 (Grado elevado)</translation>
<translation id="3040011195152428237">enlace</translation>
<translation id="2745343197843472802">Obtener complemento</translation>
+<translation id="8451268428117625855">Selecciona un archivo.</translation>
<translation id="5776402066334188252">Confirma que deseas instalar este complemento. Sólo deberías instalar los complementos confiables.</translation>
-<translation id="4003986561708175844">El complemento requerido no está instalado</translation>
<translation id="3018094406922859308">Descargando complemento...</translation>
<translation id="7364796246159120393">Seleccionar archivo</translation>
+<translation id="2761667185364618470">Controla esta casilla si deseas continuar.</translation>
<translation id="8964020114565522021">Arrastre el archivo hasta aquí</translation>
+<translation id="5129723458012748440">El complemento <ph name="PLUGIN"/> no está instalado.</translation>
<translation id="838869780401515933">marcar</translation>
<translation id="2846343701378493991">1024 (Mediano)</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="3789841737615482174">Instalar</translation>
+<translation id="2507943997699731163">Completa este campo</translation>
<translation id="5253117816378681419">Confirma que deseas instalar el complemento <ph name="PLUGIN"/>. Sólo deberías instalar los complementos confiables.</translation>
<translation id="6663448176199120256">Búsquedas recientes</translation>
+<translation id="7335060848622232389">Se ha desactivado la instalación de complementos.</translation>
<translation id="2597378329261239068">Este documento está protegido por contraseña. Ingresa una contraseña.</translation>
+<translation id="5466621249238537318">Selecciona uno o más archivos.</translation>
+<translation id="8750798805984357768">Selecciona una de estas opciones.</translation>
<translation id="7740050170769002709">Contenido HTML</translation>
+<translation id="2226276347425096477">Acorta este texto a <ph name="MAX_CHARACTERS"/> caracteres o menos (actualmente estás usando <ph name="CURRENT_LENGTH"/> caracteres).</translation>
+<translation id="1639239467298939599">Cargando</translation>
+<translation id="2908441821576996758">Ingresa una lista de direcciones de correo electrónico separadas por coma</translation>
<translation id="5939518447894949180">Restablecer</translation>
+<translation id="835897206747267392">Valor no válido.</translation>
+<translation id="3851140433852960970">Ningún complemento disponible para mostrar este contenido.</translation>
<translation id="1842960171412779397">seleccionar</translation>
+<translation id="3450233048674729344">El valor debe ser menor de o igual a <ph name="MAXIMUM"/></translation>
+<translation id="9198010615634362518">El complemento requerido no está instalado.</translation>
<translation id="7638452146404718955">Haz clic aquí para descargar el complemento</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> archivos</translation>
-<translation id="4470547978413275879">El complemento <ph name="PLUGIN"/> no está instalado</translation>
-<translation id="6765711848403622008">No se encuentra disponible ningún complemento para mostrar este contenido</translation>
+<translation id="3934680773876859118">No se pudo cargar el documento PDF</translation>
<translation id="8597182159515967513">cabecera</translation>
<translation id="2653659639078652383">Enviar</translation>
<translation id="8475551193147984329">Se necesita el complemento <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_es.xtb b/webkit/glue/resources/webkit_strings_es.xtb
index 8315543..2979daf 100644
--- a/webkit/glue/resources/webkit_strings_es.xtb
+++ b/webkit/glue/resources/webkit_strings_es.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Se ha producido un error al descargar el complemento de la página <ph name="URL"/>.</translation>
<translation id="9186171386827445984">Cargando documento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> páginas...</translation>
<translation id="1235745349614807883">Eliminar búsquedas recientes</translation>
+<translation id="1171774979989969504">Introduce una dirección de correo electrónico</translation>
+<translation id="709897737746224366">Utiliza un formato que coincida con el solicitado</translation>
<translation id="5048533449481078685">marcador de listas</translation>
<translation id="372362261556059955">Se necesita un complemento adicional</translation>
<translation id="4202807286478387388">saltar</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Cargando...</translation>
<translation id="6845533974506654842">pulsar</translation>
<translation id="8244226242650769279">mapa de imágenes</translation>
+<translation id="310520048233152454">Introduce una URL</translation>
<translation id="2548326553472216322">No hay búsquedas recientes</translation>
+<translation id="7263440858009898357">Selecciona un elemento de la lista</translation>
+<translation id="5164977714490026579">El valor debe superior o igual a <ph name="MINIMUM"/></translation>
<translation id="5944544982112848342">2048 (Grado elevado)</translation>
<translation id="3040011195152428237">enlace</translation>
<translation id="2745343197843472802">Obtener complemento</translation>
+<translation id="8451268428117625855">Selecciona un archivo</translation>
<translation id="5776402066334188252">Confirma que quieres instalar este complemento. Solo debes instalar complementos en los que confíes.</translation>
-<translation id="4003986561708175844">No está instalado el complemento necesario.</translation>
<translation id="3018094406922859308">Cargando complemento...</translation>
<translation id="7364796246159120393">Seleccionar archivo</translation>
+<translation id="2761667185364618470">Selecciona esta casilla de verificación si quieres continuar</translation>
<translation id="8964020114565522021">Arrastrar archivo hasta aquí</translation>
+<translation id="5129723458012748440">El complemento <ph name="PLUGIN"/> no está instalado.</translation>
<translation id="838869780401515933">marcar</translation>
<translation id="2846343701378493991">1024 (Mediano)</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="3789841737615482174">Instalar</translation>
+<translation id="2507943997699731163">Completa este campo</translation>
<translation id="5253117816378681419">Confirma que quieres instalar el complemento <ph name="PLUGIN"/>. Solo debes instalar complementos en los que confíes.</translation>
<translation id="6663448176199120256">Búsquedas recientes</translation>
+<translation id="7335060848622232389">Se ha inhabilitado la instalación de complementos.</translation>
<translation id="2597378329261239068">Este documento está protegido por contraseña. Introduce una contraseña.</translation>
+<translation id="5466621249238537318">Selecciona uno o varios archivos</translation>
+<translation id="8750798805984357768">Selecciona una de estas opciones</translation>
<translation id="7740050170769002709">Contenido HTML</translation>
+<translation id="2226276347425096477">Reduce la longitud de este texto a <ph name="MAX_CHARACTERS"/> caracteres o menos (actualmente, el texto tiene <ph name="CURRENT_LENGTH"/> caracteres)</translation>
+<translation id="1639239467298939599">Cargando</translation>
+<translation id="2908441821576996758">Introduce una lista de direcciones de correo electrónico separada por comas</translation>
<translation id="5939518447894949180">Restablecer</translation>
+<translation id="835897206747267392">Valor no válido</translation>
+<translation id="3851140433852960970">No hay ningún complemento disponible para mostrar este contenido.</translation>
<translation id="1842960171412779397">seleccionar</translation>
+<translation id="3450233048674729344">El valor debe inferior o igual a <ph name="MAXIMUM"/></translation>
+<translation id="9198010615634362518">No está instalado el complemento necesario.</translation>
<translation id="7638452146404718955">Haz clic aquí para descargar el complemento.</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> archivos</translation>
-<translation id="4470547978413275879">El complemento <ph name="PLUGIN"/> no está instalado.</translation>
-<translation id="6765711848403622008">No hay ningún complemento disponible para mostrar este contenido.</translation>
+<translation id="3934680773876859118">Se ha producido un error al cargar el documento PDF.</translation>
<translation id="8597182159515967513">cabecera</translation>
<translation id="2653659639078652383">Enviar</translation>
<translation id="8475551193147984329">Es necesario el complemento <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_et.xtb b/webkit/glue/resources/webkit_strings_et.xtb
index e5932ac..c8a642e 100644
--- a/webkit/glue/resources/webkit_strings_et.xtb
+++ b/webkit/glue/resources/webkit_strings_et.xtb
@@ -4,11 +4,13 @@
<translation id="4519964825805946997">Pistikprogrammi installimine asukohast <ph name="URL"/> ebaõnnestus.</translation>
<translation id="9186171386827445984">Dokumendi laadimine: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> lehte ...</translation>
<translation id="1235745349614807883">Kustuta viimased otsingud</translation>
+<translation id="1171774979989969504">Sisestage meiliaadress.</translation>
+<translation id="709897737746224366">Vastendage nõutav vorming.</translation>
<translation id="5048533449481078685">loendilooja</translation>
<translation id="372362261556059955">Vaja on täiendavat pistikprogrammi</translation>
<translation id="4202807286478387388">liigu</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
-<translation id="7658239707568436148">Loobu</translation>
+<translation id="7658239707568436148">Tühista</translation>
<translation id="795667975304826397">Ühtegi faili pole valitud</translation>
<translation id="1416462845279468967">Pistikprogrammi installimine nurjus</translation>
<translation id="8141602879876242471">See on otsitav indeks. Sisestage otsingu jaoks märksõnad:</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Laadimine...</translation>
<translation id="6845533974506654842">vajuta</translation>
<translation id="8244226242650769279">hüperpilt</translation>
+<translation id="310520048233152454">Sisestage URL.</translation>
<translation id="2548326553472216322">Pole viimaseid otsingud</translation>
+<translation id="7263440858009898357">Valige loendist element.</translation>
+<translation id="5164977714490026579">Väärtus peab olema suurem või võrdne <ph name="MINIMUM"/>-ga.</translation>
<translation id="5944544982112848342">2048 (kõrge)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Hangi pistikprogramm</translation>
+<translation id="8451268428117625855">Valige üks fail.</translation>
<translation id="5776402066334188252">Palun kinnitage, et soovite pistikprogrammi installida. Peaksite installima vaid usaldusväärseid pistikprogramme.</translation>
-<translation id="4003986561708175844">Nõutav pistikprogramm ei ole installitud</translation>
<translation id="3018094406922859308">Pistikprogrammi allalaadimine...</translation>
<translation id="7364796246159120393">Vali fail</translation>
+<translation id="2761667185364618470">Märkige see ruut, kui soovite jätkata.</translation>
<translation id="8964020114565522021">Lohistage fail siia</translation>
+<translation id="5129723458012748440">Pistikprogramm <ph name="PLUGIN"/> ei ole installitud.</translation>
<translation id="838869780401515933">mrgista</translation>
<translation id="2846343701378493991">1024 (keskmine)</translation>
<translation id="5476505524087279545">eemalda mrgistus</translation>
<translation id="3789841737615482174">Installi</translation>
+<translation id="2507943997699731163">Täitke see väli.</translation>
<translation id="5253117816378681419">Palun kinnitage, et soovite pistikprogrammi <ph name="PLUGIN"/> installida. Peaksite installima vaid usaldusväärseid pistikprogramme.</translation>
<translation id="6663448176199120256">Viimased otsingud</translation>
+<translation id="7335060848622232389">Pistikprogrammide installimine on keelatud.</translation>
<translation id="2597378329261239068">Dokument on parooliga kaitstud. Sisestage parool.</translation>
+<translation id="5466621249238537318">Valige üks või mitu faili.</translation>
+<translation id="8750798805984357768">Tehke üks nendest valikutest.</translation>
<translation id="7740050170769002709">HTML-sisu</translation>
+<translation id="2226276347425096477">Lühendage seda teksti <ph name="MAX_CHARACTERS"/> tähemärgini või rohkem (praegu kasutate <ph name="CURRENT_LENGTH"/> tähemärki).</translation>
+<translation id="1639239467298939599">Laadimine</translation>
+<translation id="2908441821576996758">Sisestage meiliaadresside loend komadega eraldatult.</translation>
<translation id="5939518447894949180">Lähtesta</translation>
+<translation id="835897206747267392">Kehtetu väärtus.</translation>
+<translation id="3851140433852960970">Sisu kuvamiseks ei ole pistikprogrammi saadaval.</translation>
<translation id="1842960171412779397">vali</translation>
+<translation id="3450233048674729344">Väärtus peab olema väiksem või võrdne <ph name="MAXIMUM"/>-ga.</translation>
+<translation id="9198010615634362518">Nõutav pistikprogramm ei ole installitud.</translation>
<translation id="7638452146404718955">Pistikprogrammi allalaadimiseks klõpsake siin</translation>
<translation id="6119846243427417423">aktiveeri</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> faili</translation>
-<translation id="4470547978413275879">Pistikprogramm <ph name="PLUGIN"/> ei ole installitud</translation>
-<translation id="6765711848403622008">Sisu kuvamiseks ei ole saadaval pistikprogrammi</translation>
+<translation id="3934680773876859118">PDF-dokumendi laadimine nurjus</translation>
<translation id="8597182159515967513">pealkiri</translation>
<translation id="2653659639078652383">Esita</translation>
<translation id="8475551193147984329">Vajalik on pistikprogramm <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_fa.xtb b/webkit/glue/resources/webkit_strings_fa.xtb
index 094ad9f..df8ff69 100644
--- a/webkit/glue/resources/webkit_strings_fa.xtb
+++ b/webkit/glue/resources/webkit_strings_fa.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">نصب افزونه از <ph name="URL"/> ناموفق بود</translation>
<translation id="9186171386827445984">در حال بارگیری سند: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> صفحات...</translation>
<translation id="1235745349614807883">پاک کردن جستجوهای اخیر</translation>
+<translation id="1171774979989969504">لطفاً یک آدرس ایمیل وارد کنید.</translation>
+<translation id="709897737746224366">لطفاً با قالب درخواستی مطابقت دهید.</translation>
<translation id="5048533449481078685">علامت گذار لیست</translation>
<translation id="372362261556059955">افزونه دیگری مورد نیاز است</translation>
<translation id="4202807286478387388">پرش</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">درحال بارگیری...</translation>
<translation id="6845533974506654842">فشار دادن</translation>
<translation id="8244226242650769279">نقشه تصویر</translation>
+<translation id="310520048233152454">لطفاً یک URL وارد کنید.</translation>
<translation id="2548326553472216322">جستجوی جدیدی وجود ندارد</translation>
+<translation id="7263440858009898357">لطفاً یک مورد را در لیست انتخاب کنید.</translation>
+<translation id="5164977714490026579">مقدار باید بیشتر یا مساوی با <ph name="MINIMUM"/> باشد.</translation>
<translation id="5944544982112848342">2048 (درجه بالا)</translation>
<translation id="3040011195152428237">پیوند</translation>
<translation id="2745343197843472802">دریافت افزونه</translation>
+<translation id="8451268428117625855">لطفاً یک فایل انتخاب کنید.</translation>
<translation id="5776402066334188252">لطفاً تأیید کنید که می خواهید این افزونه را نصب کنید. شما باید فقط افزونه هایی را نصب کنید که به آنها اعتماد دارید.</translation>
-<translation id="4003986561708175844">افزونه ضروری نصب نشده است</translation>
<translation id="3018094406922859308">در حال دانلود افزونه...</translation>
<translation id="7364796246159120393">انتخاب فایل</translation>
+<translation id="2761667185364618470">در صورتی که می خواهید ادامه دهید، این کادر را انتخاب کنید.</translation>
<translation id="8964020114565522021">فایل را اینجا بکشید</translation>
+<translation id="5129723458012748440">افزونه <ph name="PLUGIN"/> نصب نشده است.</translation>
<translation id="838869780401515933">علامتگذاری</translation>
<translation id="2846343701378493991">1024 (درجه متوسط)</translation>
<translation id="5476505524087279545">برداشتن علامت</translation>
<translation id="3789841737615482174">نصب</translation>
+<translation id="2507943997699731163">لطفاً این قسمت را تکمیل کنید.</translation>
<translation id="5253117816378681419">لطفاً تأیید کنید که مایلید افزونه <ph name="PLUGIN"/> نصب شود. فقط باید افزونه هایی را نصب کنید که به آنها اعتماد دارید.</translation>
<translation id="6663448176199120256">جستجوهای جدید</translation>
+<translation id="7335060848622232389">نصب افزونه ها غیرفعال شد.</translation>
<translation id="2597378329261239068">این سند توسط رمز ورود محافظت می شود. لطفاً یک رمز ورود وارد کنید.</translation>
+<translation id="5466621249238537318">لطفاً یک یا چند فایل را انتخاب کنید.</translation>
+<translation id="8750798805984357768">لطفاً یکی از این گزینه ها را انتخاب کنید.</translation>
<translation id="7740050170769002709">محتوای HTML</translation>
+<translation id="2226276347425096477">لطفاً این متن را به اندازه <ph name="MAX_CHARACTERS"/> نویسه یا کمتر کوتاه کنید (شما در حال حاضر از <ph name="CURRENT_LENGTH"/> نویسه استفاده می کنید).</translation>
+<translation id="1639239467298939599">بارگیری</translation>
+<translation id="2908441821576996758">لطفاً لیستی از آدرس های ایمیل که با کاما از هم جدا شده اند را وارد کنید.</translation>
<translation id="5939518447894949180">بازنشانی</translation>
+<translation id="835897206747267392">مقدار نامعتبر.</translation>
+<translation id="3851140433852960970">هیچ افزونه ای برای نمایش این محتوا در دسترس نیست.</translation>
<translation id="1842960171412779397">انتخاب</translation>
+<translation id="3450233048674729344">مقدار باید کمتر یا برابر با <ph name="MAXIMUM"/> باشد.</translation>
+<translation id="9198010615634362518">افزونه مورد نیاز نصب نشده است.</translation>
<translation id="7638452146404718955">برای دانلود کردن افزونه اینجا را کلیک کنید</translation>
<translation id="6119846243427417423">فعالسازی</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> فایل</translation>
-<translation id="4470547978413275879">افزونه <ph name="PLUGIN"/> نصب نشده است</translation>
-<translation id="6765711848403622008">هیچ افزونه ای برای نمایش این محتوا در دسترس نیست</translation>
+<translation id="3934680773876859118">بارگیری سند PDF انجام نشد</translation>
<translation id="8597182159515967513">عنوان</translation>
<translation id="2653659639078652383">ارائه</translation>
<translation id="8475551193147984329">افزونه <ph name="PLUGIN"/> مورد نیاز است</translation>
diff --git a/webkit/glue/resources/webkit_strings_fi.xtb b/webkit/glue/resources/webkit_strings_fi.xtb
index 604021f..30a1b3a 100644
--- a/webkit/glue/resources/webkit_strings_fi.xtb
+++ b/webkit/glue/resources/webkit_strings_fi.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Laajennuksen asennus osoitteesta <ph name="URL"/> epäonnistui</translation>
<translation id="9186171386827445984">Ladataan asiakirjaa: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sivua...</translation>
<translation id="1235745349614807883">Poista viimeisimmät haut</translation>
+<translation id="1171774979989969504">Anna sähköpostiosoite.</translation>
+<translation id="709897737746224366">Käytä pyydettyä muotoilua.</translation>
<translation id="5048533449481078685">luettelon merkitsijä</translation>
<translation id="372362261556059955">Toinen laajennus vaaditaan</translation>
<translation id="4202807286478387388">siirry</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Ladataan...</translation>
<translation id="6845533974506654842">paina</translation>
<translation id="8244226242650769279">kuvakartta</translation>
+<translation id="310520048233152454">Anna URL-osoite.</translation>
<translation id="2548326553472216322">Ei viimeisimpiä hakuja</translation>
+<translation id="7263440858009898357">Valitse kohde luettelosta.</translation>
+<translation id="5164977714490026579">Arvon tulee olla suurempi tai yhtä suuri kuin <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (korkea taso)</translation>
<translation id="3040011195152428237">linkki</translation>
<translation id="2745343197843472802">Hanki laajennus</translation>
+<translation id="8451268428117625855">Valitse tiedosto.</translation>
<translation id="5776402066334188252">Vahvista, että haluat asentaa tämän laajennuksen. Suosittelemme asentamaan vain laajennuksia, joihin luotat.</translation>
-<translation id="4003986561708175844">Vaadittua laajennusta ei ole asennettu</translation>
<translation id="3018094406922859308">Laajennusta ladataan...</translation>
<translation id="7364796246159120393">Valitse tiedosto</translation>
+<translation id="2761667185364618470">Valitse tämä ruutu jatkaaksesi.</translation>
<translation id="8964020114565522021">Vedä tiedosto tähän</translation>
+<translation id="5129723458012748440">Laajennusta <ph name="PLUGIN"/> ei ole asennettu.</translation>
<translation id="838869780401515933">valitse</translation>
<translation id="2846343701378493991">1024 (keskitaso)</translation>
<translation id="5476505524087279545">poista valinta</translation>
<translation id="3789841737615482174">Asenna</translation>
+<translation id="2507943997699731163">Täytä tämä kenttä.</translation>
<translation id="5253117816378681419">Vahvista, että haluat asentaa laajennuksen <ph name="PLUGIN"/>. Suosittelemme asentamaan vain laajennuksia, joihin luotat.</translation>
<translation id="6663448176199120256">Viimeisimmät haut</translation>
+<translation id="7335060848622232389">Laajennuksien asentaminen on poistettu käytöstä.</translation>
<translation id="2597378329261239068">Tämä asiakirja on suojattu salasanalla. Anna salasana.</translation>
+<translation id="5466621249238537318">Valitse vähintään yksi tiedosto.</translation>
+<translation id="8750798805984357768">Valitse yksi vaihtoehdoista.</translation>
<translation id="7740050170769002709">HTML-sisältö</translation>
+<translation id="2226276347425096477">Lyhennä tämä teksti alle <ph name="MAX_CHARACTERS"/> merkkiin (tällä hetkellä käytössä <ph name="CURRENT_LENGTH"/> merkkiä).</translation>
+<translation id="1639239467298939599">Ladataan</translation>
+<translation id="2908441821576996758">Anna pilkuilla erotettu sähköpostiosoitteiden luettelo.</translation>
<translation id="5939518447894949180">Tyhjennä</translation>
+<translation id="835897206747267392">Virheellinen arvo.</translation>
+<translation id="3851140433852960970">Tämän sisällön näyttämiseen ei ole saatavissa laajennusta.</translation>
<translation id="1842960171412779397">Valitse</translation>
+<translation id="3450233048674729344">Arvon tulee olla pienempi tai yhtä suuri kuin <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Vaadittua laajennusta ei ole asennettu.</translation>
<translation id="7638452146404718955">Lataa laajennus napsauttamalla tätä</translation>
<translation id="6119846243427417423">aktivoi</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> tiedostoa</translation>
-<translation id="4470547978413275879">Laajennusta <ph name="PLUGIN"/> ei asennettu</translation>
-<translation id="6765711848403622008">Tämän sisällön näyttämiseen ei ole saatavissa laajennusta</translation>
+<translation id="3934680773876859118">PDF-asiakirjan lataaminen epäonnistui</translation>
<translation id="8597182159515967513">otsikko</translation>
<translation id="2653659639078652383">Lähetä</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/>-laajennus vaaditaan</translation>
diff --git a/webkit/glue/resources/webkit_strings_fil.xtb b/webkit/glue/resources/webkit_strings_fil.xtb
index 8459aca..1c28c61 100644
--- a/webkit/glue/resources/webkit_strings_fil.xtb
+++ b/webkit/glue/resources/webkit_strings_fil.xtb
@@ -4,11 +4,13 @@
<translation id="4519964825805946997">Nabigong ma-install ang plug-in mula sa <ph name="URL"/></translation>
<translation id="9186171386827445984">Nilo-load ang dokumento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> (na) pahina...</translation>
<translation id="1235745349614807883">Lisiman ang Kasalukuyang Mga Paghahanap</translation>
+<translation id="1171774979989969504">Mangyaring magpasok ng email address.</translation>
+<translation id="709897737746224366">Pakitugma ang hiniling na format.</translation>
<translation id="5048533449481078685">Ilista ang marker</translation>
<translation id="372362261556059955">Kinakailangan ang karagdagang plug-in</translation>
<translation id="4202807286478387388">tumalon</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
-<translation id="7658239707568436148">Ikansela</translation>
+<translation id="7658239707568436148">Kanselahin</translation>
<translation id="795667975304826397">Walang napiling file</translation>
<translation id="1416462845279468967">Nabigo ang pag-install ng plug-in</translation>
<translation id="8141602879876242471">Isa itong paghahanap ng index. Ipasok ang paghahanap sa mga keyword:</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Kumakarga...</translation>
<translation id="6845533974506654842">pindutin</translation>
<translation id="8244226242650769279">mapa ng imahe</translation>
+<translation id="310520048233152454">Mangyaring magpasok ng URL.</translation>
<translation id="2548326553472216322">Walang kamakailang mga paghahanap</translation>
+<translation id="7263440858009898357">Mangyaring pumili ng item sa listahan.</translation>
+<translation id="5164977714490026579">Dapat mas mataas kaysa sa o katumbas ng <ph name="MINIMUM"/> ang halaga.</translation>
<translation id="5944544982112848342">2048 (Pinakamataas na Marka)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Kumuha ng Plug-in</translation>
+<translation id="8451268428117625855">Mangyaring pumili ng file.</translation>
<translation id="5776402066334188252">Pakikumpirma na nais mong i-install ang plug-in na ito. Dapat mong i-install lamang ang mga plug-in na iyong pinagkakatiwalaan.</translation>
-<translation id="4003986561708175844">Hindi na-install ang kinakailangang plug-in</translation>
<translation id="3018094406922859308">Nagda-download ng plug-in...</translation>
<translation id="7364796246159120393">Pumili ng File</translation>
+<translation id="2761667185364618470">Pakitingnan ang kahon na ito kung gusto mong magpatuloy.</translation>
<translation id="8964020114565522021">Kaldkarin dito ang file</translation>
+<translation id="5129723458012748440">Hindi naka-install ang <ph name="PLUGIN"/> na plug-in.</translation>
<translation id="838869780401515933">I-tsek</translation>
<translation id="2846343701378493991">1024 (Katamtamang Grado)</translation>
<translation id="5476505524087279545">i-uncheck</translation>
<translation id="3789841737615482174">Install</translation>
+<translation id="2507943997699731163">Pakipunan ang field na ito.</translation>
<translation id="5253117816378681419">Pakikumpirma na gusto mong i-install ang <ph name="PLUGIN"/> plug-in na ito. Dapat mong i-install lamang ang mga plug-in na iyong pinagkakatiwalaan.</translation>
<translation id="6663448176199120256">Kasalukuyang Mga Paghahanap</translation>
+<translation id="7335060848622232389">Hindi pinagana ang pag-install ng mga plug-in.</translation>
<translation id="2597378329261239068">Protektado ng password ang dokumentong ito. Mangyaring magpasok ng password.</translation>
+<translation id="5466621249238537318">Mangyaring pumili ng isa o higit pang mga file.</translation>
+<translation id="8750798805984357768">Mangyaring pumili ng isa sa mga opsyong ito.</translation>
<translation id="7740050170769002709">HTML na nilalaman</translation>
+<translation id="2226276347425096477">Mangyaring paikliin ang tekstong ito ng <ph name="MAX_CHARACTERS"/> (na) character o mas mababa (kasalukuyan kang gumagamit ng <ph name="CURRENT_LENGTH"/> (na) character).</translation>
+<translation id="1639239467298939599">Naglo-load</translation>
+<translation id="2908441821576996758">Mangyaring magpasok ng listahan ng email address na pinaghihiwalay ng kuwit.</translation>
<translation id="5939518447894949180">I-reset</translation>
+<translation id="835897206747267392">Di-wastong halaga.</translation>
+<translation id="3851140433852960970">Walang available na plug-in na magpapakita ng nilalamang ito.</translation>
<translation id="1842960171412779397">piliin</translation>
+<translation id="3450233048674729344">Dapat mas mababa kaysa sa o katumbas ng <ph name="MAXIMUM"/> ang halaga.</translation>
+<translation id="9198010615634362518">Hindi naka-install ang kinakailangang plug-in.</translation>
<translation id="7638452146404718955">Mag-click dito upang ma-download ang plug-in</translation>
<translation id="6119846243427417423">isaaktibo</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> mga file</translation>
-<translation id="4470547978413275879">Hindi naka-install ang <ph name="PLUGIN"/> na plug-in</translation>
-<translation id="6765711848403622008">Walang magagamit na plug-in upang maipakita ang nilalamang ito</translation>
+<translation id="3934680773876859118">Nabigong i-load ang dokumentong PDF</translation>
<translation id="8597182159515967513">heading</translation>
<translation id="2653659639078652383">Isumite</translation>
<translation id="8475551193147984329">Kinakailangan ang plug-in na <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_fr.xtb b/webkit/glue/resources/webkit_strings_fr.xtb
index ab1e32f..45d05c5 100644
--- a/webkit/glue/resources/webkit_strings_fr.xtb
+++ b/webkit/glue/resources/webkit_strings_fr.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Échec de l'installation du plug-in depuis <ph name="URL"/></translation>
<translation id="9186171386827445984">Chargement du document : <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pages...</translation>
<translation id="1235745349614807883">Effacer les recherches récentes</translation>
+<translation id="1171774979989969504">Veuillez saisir une adresse e-mail.</translation>
+<translation id="709897737746224366">Veuillez respecter le format requis.</translation>
<translation id="5048533449481078685">marqueur de liste</translation>
<translation id="372362261556059955">Plug-in supplémentaire requis</translation>
<translation id="4202807286478387388">accéder</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Chargement...</translation>
<translation id="6845533974506654842">appuyer</translation>
<translation id="8244226242650769279">image map</translation>
+<translation id="310520048233152454">Veuillez saisir une URL.</translation>
<translation id="2548326553472216322">Aucune recherche récente</translation>
+<translation id="7263440858009898357">Sélectionnez un élément dans la liste.</translation>
+<translation id="5164977714490026579">Cette valeur doit être supérieure ou égale à <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (haute sécurité)</translation>
<translation id="3040011195152428237">Lien</translation>
<translation id="2745343197843472802">Télécharger le plug-in</translation>
+<translation id="8451268428117625855">Veuillez sélectionner un fichier.</translation>
<translation id="5776402066334188252">Merci de confirmer que vous souhaitez installer ce plug-in. N'installez que les plug-ins que vous considérez fiables.</translation>
-<translation id="4003986561708175844">Le plug-in requis n'est pas installé.</translation>
<translation id="3018094406922859308">Téléchargement du plug-in...</translation>
<translation id="7364796246159120393">Choisissez un fichier</translation>
+<translation id="2761667185364618470">Veuillez cocher cette case si vous souhaitez continuer.</translation>
<translation id="8964020114565522021">Placer le fichier ici</translation>
+<translation id="5129723458012748440">Le plug-in <ph name="PLUGIN"/> n'est pas installé.</translation>
<translation id="838869780401515933">cocher</translation>
<translation id="2846343701378493991">1024 (sécurité moyenne)</translation>
<translation id="5476505524087279545">décocher</translation>
<translation id="3789841737615482174">Installer</translation>
+<translation id="2507943997699731163">Veuillez renseigner ce champ.</translation>
<translation id="5253117816378681419">Merci de confirmer que vous souhaitez installer le plug-in <ph name="PLUGIN"/>. N'installez que les plug-ins que vous considérez fiables.</translation>
<translation id="6663448176199120256">Recherches récentes</translation>
+<translation id="7335060848622232389">L'installation de plug-ins a été désactivée.</translation>
<translation id="2597378329261239068">Ce document est protégé par mot de passe. Veuillez saisir ce dernier.</translation>
+<translation id="5466621249238537318">Veuillez sélectionner un ou plusieurs fichiers.</translation>
+<translation id="8750798805984357768">Veuillez sélectionner l'une de ces options.</translation>
<translation id="7740050170769002709">Contenu HTML</translation>
+<translation id="2226276347425096477">Veuillez réduire ce texte à <ph name="MAX_CHARACTERS"/> caractères maximum (il compte actuellement <ph name="CURRENT_LENGTH"/> caractères).</translation>
+<translation id="1639239467298939599">Chargement en cours</translation>
+<translation id="2908441821576996758">Veuillez saisir une liste d'adresses e-mail séparées par une virgule.</translation>
<translation id="5939518447894949180">Réinitialiser</translation>
+<translation id="835897206747267392">Valeur incorrecte</translation>
+<translation id="3851140433852960970">Aucun plug-in disponible pour afficher ce contenu.</translation>
<translation id="1842960171412779397">sélectionner</translation>
+<translation id="3450233048674729344">Cette valeur doit être inférieure ou égale à <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Le plug-in requis n'est pas installé.</translation>
<translation id="7638452146404718955">Cliquer ici pour télécharger le plug-in</translation>
<translation id="6119846243427417423">activer</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fichiers</translation>
-<translation id="4470547978413275879">Le plug-in <ph name="PLUGIN"/> n'est pas installé.</translation>
-<translation id="6765711848403622008">Aucun plug-in disponible pour afficher ce contenu</translation>
+<translation id="3934680773876859118">Échec du chargement du document PDF</translation>
<translation id="8597182159515967513">en-tête</translation>
<translation id="2653659639078652383">Valider</translation>
<translation id="8475551193147984329">Le plug-in <ph name="PLUGIN"/> est requis.</translation>
diff --git a/webkit/glue/resources/webkit_strings_gu.xtb b/webkit/glue/resources/webkit_strings_gu.xtb
index ad48fa1..e1cc331 100644
--- a/webkit/glue/resources/webkit_strings_gu.xtb
+++ b/webkit/glue/resources/webkit_strings_gu.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> થી પ્લગ-ઇન ઇન્સ્ટોલ કરવામાં નિષ્ફળ રહ્યાં</translation>
<translation id="9186171386827445984">દસ્તાવેજ લોડ કરી રહ્યું છે: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> પૃષ્ઠ...</translation>
<translation id="1235745349614807883">હાલની શોધને સાફ કરો</translation>
+<translation id="1171774979989969504">કૃપા કરી કોઈ ઇમેઇલ સરનામું દાખલ કરો.</translation>
+<translation id="709897737746224366">કૃપા કરીને વિનંતી કરેલા ફોર્મેટ સાથે મેળ કરો.</translation>
<translation id="5048533449481078685">સૂચિ માર્કર</translation>
<translation id="372362261556059955">વધારાનું પ્લગ-ઇન આવશ્યક છે </translation>
<translation id="4202807286478387388">જંપ કરો</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">લોડ કરી રહ્યું છે...</translation>
<translation id="6845533974506654842">દબાવો</translation>
<translation id="8244226242650769279">છબી નકશો</translation>
+<translation id="310520048233152454">કૃપા કરી કોઈ URL દાખલ કરો.</translation>
<translation id="2548326553472216322">હાલની શોધો નથી</translation>
+<translation id="7263440858009898357">કૃપા કરીને સૂચિમાંથી એક આઇટમ પસંદ કરો.</translation>
+<translation id="5164977714490026579">મૂલ્ય <ph name="MINIMUM"/> જેટલું અથવા આનાથી વધુ હોવું આવશ્યક છે.</translation>
<translation id="5944544982112848342">2048 (ઉચ્ચ ગ્રેડ)</translation>
<translation id="3040011195152428237">લિંક</translation>
<translation id="2745343197843472802">પ્લગ-ઇન મેળવો</translation>
+<translation id="8451268428117625855">કૃપા કરીને કોઈ ફાઇલ પસંદ કરો.</translation>
<translation id="5776402066334188252">કૃપા કરીને પુષ્ટી કરો કે તમે આ પ્લગ-ઇન ઇન્સ્ટોલ કરવાનું પસંદ કરશો. તમારે ફક્ત તે જ પ્લગ-ઇન્સ ઇન્સ્ટોલ કરવા જોઈએ જે વિશ્વસ્ત હોય.</translation>
-<translation id="4003986561708175844">જોઈતું પ્લગ-ઇન ઇન્સ્ટોલ કરેલું નથી</translation>
<translation id="3018094406922859308">પ્લગ-ઇન ડાઉનલોડ કરી રહ્યું છે...</translation>
<translation id="7364796246159120393">ફાઇલ પસંદ કરો</translation>
+<translation id="2761667185364618470">જો તમે આગળ વધવા માંગતા હો તો કૃપા કરીને આ બૉક્સને ચેક કરો.</translation>
<translation id="8964020114565522021">ફાઇલને અહીં ખેંચો</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> પ્લગ-ઇન ઇન્સ્ટોલ કરેલું નથી.</translation>
<translation id="838869780401515933">તપાસો</translation>
<translation id="2846343701378493991">1024 (મધ્યમ ગ્રેડ)</translation>
<translation id="5476505524087279545">અનચેક કરો</translation>
<translation id="3789841737615482174">ઇન્સ્ટોલ કરો</translation>
+<translation id="2507943997699731163">કૃપા કરીને આ ફીલ્ડ ભરો.</translation>
<translation id="5253117816378681419">કૃપા કરીને પુષ્ટી કરો કે તમે <ph name="PLUGIN"/> પ્લગ-ઇન ઇન્સ્ટોલ કરવાનું પસંદ કરશો. તમારે ફક્ત તે જ પ્લગ-ઇન્સ ઇન્સ્ટોલ કરવા જોઈએ જે વિશ્વસ્ત હોય.</translation>
<translation id="6663448176199120256">તાજેતરની શોધ</translation>
+<translation id="7335060848622232389">પ્લગ-ઇન્સ ઇન્સ્ટોલ કરવાનું સક્ષમ કરવામાં આવ્યું છે.</translation>
<translation id="2597378329261239068">આ દસ્તાવેજ પાસવર્ડ સુરક્ષિત છે. કૃપા કરીને પાસવર્ડ દાખલ કરો.</translation>
+<translation id="5466621249238537318">કૃપા કરીને એક અથવા વધુ ફાઇલ પસંદ કરો. </translation>
+<translation id="8750798805984357768">કૃપા કરીને આ વિકલ્પોમાંથી કોઈ એક પસંદ કરો.</translation>
<translation id="7740050170769002709">HTML સામગ્રી</translation>
+<translation id="2226276347425096477">કૃપા કરીને આ ટેક્સ્ટને <ph name="MAX_CHARACTERS"/> અક્ષર અથવા તેથી ઓછા સુધી નાનો કરો (તમે હાલમાં <ph name="CURRENT_LENGTH"/> અક્ષરોનો ઉપયોગ કરી રહ્યા છો).</translation>
+<translation id="1639239467298939599">લોડ કરી રહ્યું છે</translation>
+<translation id="2908441821576996758">કૃપા કરીને અલ્પવિરામથી વિભાજિત ઇમેઇલ સરનામાંઓની સૂચિ દાખલ કરો.</translation>
<translation id="5939518447894949180">રીસેટ કરો</translation>
+<translation id="835897206747267392">અમાન્ય મૂલ્ય.</translation>
+<translation id="3851140433852960970">આ સામગ્રી પ્રદર્શિત કરવા માટે કોઈ પ્લગઇન ઉપલબ્ધ નથી.</translation>
<translation id="1842960171412779397">પસંદ કરો</translation>
+<translation id="3450233048674729344">મૂલ્ય <ph name="MAXIMUM"/> જેટલું અથવા આનાથી ઓછું હોવું આવશ્યક છે.</translation>
+<translation id="9198010615634362518">જોઈતું પ્લગ-ઇન ઇન્સ્ટોલ કરેલું નથી.</translation>
<translation id="7638452146404718955">પ્લગ-ઇન ડાઉનલોડ કરવા માટે અહીં ક્લિક કરો</translation>
<translation id="6119846243427417423">સક્રિય કરો</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ફાઇલો</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> પ્લગ-ઇન ઇન્સ્ટોલ કરેલું નથી</translation>
-<translation id="6765711848403622008">આ સામગ્રી પ્રદર્શિત કરવા માટે કોઈ પ્લગઇન ઉપલબ્ધ નથી</translation>
+<translation id="3934680773876859118">PDF દસ્તાવેજ લોડ કરવામાં નિષ્ફળ રહ્યા</translation>
<translation id="8597182159515967513">મથાળું</translation>
<translation id="2653659639078652383">સબમિટ કરો</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> પ્લગ-ઇન આવશ્યક છે </translation>
diff --git a/webkit/glue/resources/webkit_strings_hi.xtb b/webkit/glue/resources/webkit_strings_hi.xtb
index e7ef77f..91d94be 100644
--- a/webkit/glue/resources/webkit_strings_hi.xtb
+++ b/webkit/glue/resources/webkit_strings_hi.xtb
@@ -1,46 +1,63 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="hi">
-<translation id="4519964825805946997"><ph name="URL"/> से प्लग-इन स्थापित करने में विफल हुआ</translation>
+<translation id="4519964825805946997"><ph name="URL"/> से प्लग-इन इंस्‍टॉल करने में विफल</translation>
<translation id="9186171386827445984">दस्तावेज़ लोड कर रहा है: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> पृष्ठ...</translation>
<translation id="1235745349614807883">हाल ही की खोजें साफ़ करें</translation>
+<translation id="1171774979989969504">कृपया ई-मेल पता दर्ज करें.</translation>
+<translation id="709897737746224366">कृपया अनुरोधित प्रारूप का मिलान करें.</translation>
<translation id="5048533449481078685">सूची चिन्हक</translation>
<translation id="372362261556059955">अतिरिक्त प्‍लग-इन की आवश्यकता है</translation>
-<translation id="4202807286478387388">जाएँ</translation>
+<translation id="4202807286478387388">जाएं</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">रद्द करें</translation>
<translation id="795667975304826397">कोई फाइल नहीं चुनी गई</translation>
-<translation id="1416462845279468967">प्लग-इन स्थापना विफल हुई</translation>
-<translation id="8141602879876242471">यह एक खोजने योग्य इंडेक्स है. खोज कुंजीशब्द प्रविष्ट करें :</translation>
+<translation id="1416462845279468967">प्लग-इन स्थापना विफल</translation>
+<translation id="8141602879876242471">इस अनुक्रमणिका को खोजा जा सकता है. खोज कुंजीशब्द प्रविष्ट करें:</translation>
<translation id="5650795167354946011">प्लग-इन स्थापित करने के बाद, रीफ़्रेश करने के लिए यहां क्लिक करें</translation>
-<translation id="370665806235115550">लोड हो रहा है ...</translation>
-<translation id="6845533974506654842">दबाएँ</translation>
-<translation id="8244226242650769279">चित्र मैप</translation>
-<translation id="2548326553472216322">हाल ही में कोई खोज नहीं</translation>
+<translation id="370665806235115550">लोड हो रहा है...</translation>
+<translation id="6845533974506654842">दबाएं</translation>
+<translation id="8244226242650769279">छवि मानचित्र</translation>
+<translation id="310520048233152454">कृपया URL लिखें.</translation>
+<translation id="2548326553472216322">हाल ही कोई खोज नहीं</translation>
+<translation id="7263440858009898357">कृपया सूची में किसी आइटम का चयन करें.</translation>
+<translation id="5164977714490026579">मान <ph name="MINIMUM"/> से कम या इसके बराबर होना चाहिए.</translation>
<translation id="5944544982112848342">2048 (उच्च ग्रेड)</translation>
-<translation id="3040011195152428237">लिंक</translation>
+<translation id="3040011195152428237">संपर्क</translation>
<translation id="2745343197843472802">प्‍लग-इन प्राप्त करें</translation>
-<translation id="5776402066334188252">कृपया पुष्टि करें कि आप यह प्लग-इन स्थापित करना चाहेंगे. आपको केवल वे प्लग-इन स्थापित करने चाहिए जिन पर आप विश्वास करते हैं.</translation>
-<translation id="4003986561708175844">आवश्यक प्लग-इन स्थापित नहीं है</translation>
-<translation id="3018094406922859308">प्लग-इन डाउनलोड किया जा रहा है...</translation>
+<translation id="8451268428117625855">कृपया किसी फ़ाइल का चयन करें.</translation>
+<translation id="5776402066334188252">कृपया पुष्टि करें कि आप यह प्लग-इन इंस्‍टॉल करना चाहेंगे. आपको केवल वे प्लग-इन इंस्‍टॉल करने चाहिए जिन पर आप विश्वास करते हैं.</translation>
+<translation id="3018094406922859308">प्लग-इन डाउनलोड कर रहा है...</translation>
<translation id="7364796246159120393">फ़ाइल चुनें</translation>
-<translation id="8964020114565522021">फाइल खींचकर यहाँ लाएं</translation>
+<translation id="2761667185364618470">यदि आप आगे बढ़ना चाहते हैं तो इस बॉक्‍स को चेक करें.</translation>
+<translation id="8964020114565522021">यहां फाइल खींचकर लाएं</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> प्‍लग-इन इंस्टॉल नहीं है.</translation>
<translation id="838869780401515933">चेक करें</translation>
<translation id="2846343701378493991">1024 (मध्यम ग्रेड)</translation>
<translation id="5476505524087279545">अनचेक करें</translation>
-<translation id="3789841737615482174">स्थापित करें</translation>
-<translation id="5253117816378681419">कृपया पुष्टि करें कि आप <ph name="PLUGIN"/> प्लग-इन स्थापित करना चाहेंगे. आपको केवल वे प्लग-इन स्थापित करने चाहिए जिन पर आप विश्वास करते हैं.</translation>
+<translation id="3789841737615482174">इंस्‍टॉल करें</translation>
+<translation id="2507943997699731163">कृपया इस फ़ील्ड को भरें.</translation>
+<translation id="5253117816378681419">कृपया पुष्टि करें कि आप <ph name="PLUGIN"/> प्लग-इन इंस्‍टॉल करना चाहेंगे. आपको केवल वे प्लग-इन इंस्‍टॉल करने चाहिए जिन पर आप विश्वास करते हैं.</translation>
<translation id="6663448176199120256">हाल ही में की गई खोजें</translation>
-<translation id="2597378329261239068">यह दस्तावेज़ पासवर्ड सुरक्षित है. कृपया एक पासवर्ड दर्ज करें.</translation>
+<translation id="7335060848622232389">प्‍लग-इन इंस्टॉल करना अक्षम किया गया.</translation>
+<translation id="2597378329261239068">यह दस्तावेज़ पासवर्ड सुरक्षित है. कृपया पासवर्ड दर्ज करें.</translation>
+<translation id="5466621249238537318">कृपया एक या अधिक फ़ाइल का चयन करें.</translation>
+<translation id="8750798805984357768">कृपया इनमें से कोई विकल्प चुनें.</translation>
<translation id="7740050170769002709">HTML सामग्री</translation>
-<translation id="5939518447894949180">पुन: सेट करें</translation>
-<translation id="1842960171412779397">चुनें</translation>
+<translation id="2226276347425096477">कृपया इस टेक्स्ट को <ph name="MAX_CHARACTERS"/> वर्णों या कम तक छोटा करें (वर्तमान में आप <ph name="CURRENT_LENGTH"/> वर्णों का उपयोग कर रहे हैं).</translation>
+<translation id="1639239467298939599">लोड हो रहा है</translation>
+<translation id="2908441821576996758">कृपया ईमेल पतों की अल्पविराम द्वारा विभाजित सूची दर्ज करें.</translation>
+<translation id="5939518447894949180">रीसेट करें</translation>
+<translation id="835897206747267392">अमान्य मान.</translation>
+<translation id="3851140433852960970">यह सामग्री प्रदर्शित करने के लिए कोई प्लग-इन उपलब्ध नहीं है.</translation>
+<translation id="1842960171412779397">चयन करें</translation>
+<translation id="3450233048674729344">मान <ph name="MAXIMUM"/> से कम या इसके बराबर होना चाहिए.</translation>
+<translation id="9198010615634362518">आवश्यक प्लग-इन इंस्टॉल नहीं की गई है.</translation>
<translation id="7638452146404718955">प्लग-इन डाउनलोड करने के लिए यहां क्लिक करें</translation>
<translation id="6119846243427417423">सक्रिय करें</translation>
-<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> फ़ाइलें</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> प्लग-इन स्थापित नहीं है</translation>
-<translation id="6765711848403622008">इस सामग्री को प्रदर्शित करने के लिए कोई प्लग-इन उपलब्ध नहीं है</translation>
+<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> फ़ाइल</translation>
+<translation id="3934680773876859118">PDF दस्तावेज़ लोड करने में विफल</translation>
<translation id="8597182159515967513">हेडिंग</translation>
-<translation id="2653659639078652383">जमा करें</translation>
+<translation id="2653659639078652383">सबमिट करें</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> प्लग-इन की आवश्यकता है</translation>
</translationbundle> \ No newline at end of file
diff --git a/webkit/glue/resources/webkit_strings_hr.xtb b/webkit/glue/resources/webkit_strings_hr.xtb
index dfef690..973b7ab 100644
--- a/webkit/glue/resources/webkit_strings_hr.xtb
+++ b/webkit/glue/resources/webkit_strings_hr.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Nije uspjela instalacija dodatka s adrese <ph name="URL"/></translation>
<translation id="9186171386827445984">Učitavanje dokumenta: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stranica...</translation>
<translation id="1235745349614807883">Obriši najnovija pretraživanja</translation>
+<translation id="1171774979989969504">Unesite adresu e-pošte.</translation>
+<translation id="709897737746224366">Udovoljite zadanom formatu.</translation>
<translation id="5048533449481078685">oznaka popisa</translation>
<translation id="372362261556059955">Potreban je dodatni dodatak</translation>
<translation id="4202807286478387388">skoči</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Učitavanje...</translation>
<translation id="6845533974506654842">pritisni</translation>
<translation id="8244226242650769279">karta slika</translation>
+<translation id="310520048233152454">Unesite URL.</translation>
<translation id="2548326553472216322">Nema najnovijih pretraživanja</translation>
+<translation id="7263440858009898357">Odaberite stavku s popisa.</translation>
+<translation id="5164977714490026579">Vrijednost mora biti <ph name="MINIMUM"/> ili veća.</translation>
<translation id="5944544982112848342">2048 (visoki stupanj)</translation>
<translation id="3040011195152428237">veza</translation>
<translation id="2745343197843472802">Nabavi dodatak</translation>
+<translation id="8451268428117625855">Odaberite datoteku.</translation>
<translation id="5776402066334188252">Potvrdite da želite instalirati dodatak. Instalirajte samo dodatke koje smatrate pouzdanima.</translation>
-<translation id="4003986561708175844">Potreban dodatak nije instaliran</translation>
<translation id="3018094406922859308">Preuzimanje dodatka...</translation>
<translation id="7364796246159120393">Odaberi datoteku</translation>
+<translation id="2761667185364618470">Označite taj okvir ako želite ići dalje.</translation>
<translation id="8964020114565522021">Povucite datoteku ovamo</translation>
+<translation id="5129723458012748440">Nije instaliran dodatak <ph name="PLUGIN"/></translation>
<translation id="838869780401515933">označi</translation>
<translation id="2846343701378493991">1024 (srednji)</translation>
<translation id="5476505524087279545">ukloni oznaku</translation>
<translation id="3789841737615482174">Instaliraj</translation>
+<translation id="2507943997699731163">Ispunite ovo polje.</translation>
<translation id="5253117816378681419">Potvrdite da želite instalirati dodatak <ph name="PLUGIN"/>. Instalirajte samo dodatke koje smatrate pouzdanima.</translation>
<translation id="6663448176199120256">Najnovija pretraživanja</translation>
+<translation id="7335060848622232389">Onemogućeno je instaliranje dodataka.</translation>
<translation id="2597378329261239068">Ovaj je dokument zaštićen zaporkom. Unesite zaporku.</translation>
+<translation id="5466621249238537318">Izaberite jednu ili više datoteka.</translation>
+<translation id="8750798805984357768">Izaberite jednu od tih opcija.</translation>
<translation id="7740050170769002709">HTML sadržaj</translation>
+<translation id="2226276347425096477">Skratite taj tekst na <ph name="MAX_CHARACTERS"/> znakova ili manje (trenutačno upotrebljavate <ph name="CURRENT_LENGTH"/> znakova).</translation>
+<translation id="1639239467298939599">Učitavanje</translation>
+<translation id="2908441821576996758">Unesite popis adresa e-pošte odijeljen zarezima.</translation>
<translation id="5939518447894949180">Ponovno postavi</translation>
+<translation id="835897206747267392">Nevažeća vrijednost.</translation>
+<translation id="3851140433852960970">Nema dostupnog dodatka za prikaz ovog sadržaja.</translation>
<translation id="1842960171412779397">odaberi</translation>
+<translation id="3450233048674729344">Vrijednost mora biti <ph name="MAXIMUM"/> ili manja.</translation>
+<translation id="9198010615634362518">Potreban dodatak nije instaliran.</translation>
<translation id="7638452146404718955">Kliknite ovdje za preuzimanje dodatka</translation>
<translation id="6119846243427417423">aktiviraj</translation>
<translation id="8444882422881193423">Broj datoteka: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Nije instaliran dodatak za <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">Nema dostupnog dodatka za prikaz ovog sadržaja</translation>
+<translation id="3934680773876859118">Učitavanje dokumenta PDF nije uspjelo</translation>
<translation id="8597182159515967513">naslov</translation>
<translation id="2653659639078652383">Pošalji</translation>
<translation id="8475551193147984329">Potreban je dodatak <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_hu.xtb b/webkit/glue/resources/webkit_strings_hu.xtb
index 1b43f0f..17f27a8 100644
--- a/webkit/glue/resources/webkit_strings_hu.xtb
+++ b/webkit/glue/resources/webkit_strings_hu.xtb
@@ -4,42 +4,59 @@
<translation id="4519964825805946997">A plug-in telepítése nem sikerült a következő helyről: <ph name="URL"/></translation>
<translation id="9186171386827445984">Dokumentum betöltése: <ph name="NUMBER_OF_PAGES"/>/<ph name="PAGE_NUMBER"/>. oldal...</translation>
<translation id="1235745349614807883">Friss keresések törlése</translation>
+<translation id="1171774979989969504">Kérjük, adjon meg egy e-mail címet.</translation>
+<translation id="709897737746224366">Kérjük, tartsa magát a kívánt formátumhoz.</translation>
<translation id="5048533449481078685">listajelölő</translation>
<translation id="372362261556059955">További plug-in szükséges</translation>
<translation id="4202807286478387388">Mehet</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Mégse</translation>
-<translation id="795667975304826397">Nem lett fájl kiválasztva</translation>
+<translation id="795667975304826397">Nincs fájl kiválasztva</translation>
<translation id="1416462845279468967">A plug-in telepítése sikertelen</translation>
<translation id="8141602879876242471">Ez egy kereshető index. Írjon be keresési kulcsszavakat:</translation>
<translation id="5650795167354946011">A plug-in telepítését követően kattintson ide a frissítéshez</translation>
<translation id="370665806235115550">Betöltés…</translation>
<translation id="6845533974506654842">Gomb lenyomása</translation>
<translation id="8244226242650769279">képtérkép</translation>
+<translation id="310520048233152454">Adjon meg egy URL-t.</translation>
<translation id="2548326553472216322">Nincsenek friss keresések</translation>
+<translation id="7263440858009898357">Kérjük, válasszon egyet a lista elemei közül.</translation>
+<translation id="5164977714490026579">Az érték legyen nagyobb vagy egyenlő, mint <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (magasfokú)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Plug-in beszerzése</translation>
+<translation id="8451268428117625855">Válasszon egy fájlt.</translation>
<translation id="5776402066334188252">Kérjük, igazolja, hogy ezt a plug-int szeretné telepíteni. Csak azokat a plug-ineket telepítse, amelyekben megbízik.</translation>
-<translation id="4003986561708175844">A szükséges plug-in nem lett telepítve</translation>
<translation id="3018094406922859308">Plug-in letöltése...</translation>
<translation id="7364796246159120393">Fájl kiválasztása</translation>
+<translation id="2761667185364618470">Kérjük, jelölje be ezt a jelölőnégyzetet, ha tovább kíván haladni.</translation>
<translation id="8964020114565522021">Húzza át ide a fájlt</translation>
+<translation id="5129723458012748440">A(z) <ph name="PLUGIN"/> plug-in nincs telepítve.</translation>
<translation id="838869780401515933">Megjelölés</translation>
<translation id="2846343701378493991">1024 (Közepes)</translation>
<translation id="5476505524087279545">Megjelölés eltávolítása</translation>
<translation id="3789841737615482174">Telepítés</translation>
+<translation id="2507943997699731163">Kérjük, töltse ki ezt a mezőt.</translation>
<translation id="5253117816378681419">Kérjük, erősítse meg, hogy valóban telepíteni szeretné a következő plug-int: <ph name="PLUGIN"/>. Csak azokat a plug-ineket telepítse, amelyekben megbízik.</translation>
<translation id="6663448176199120256">Friss keresések</translation>
+<translation id="7335060848622232389">A plug-inek telepítése le van tiltva.</translation>
<translation id="2597378329261239068">Ez a dokumentum jelszóval védett. Kérjük, adja meg a jelszót.</translation>
+<translation id="5466621249238537318">Kérjük, válasszon ki egy vagy több fájlt.</translation>
+<translation id="8750798805984357768">Kérjük, válassza ki az egyik opciót.</translation>
<translation id="7740050170769002709">HTML-tartalom</translation>
+<translation id="2226276347425096477">Kérjük, rövidítse le a szöveget legfeljebb <ph name="MAX_CHARACTERS"/> karakterre (jelenleg <ph name="CURRENT_LENGTH"/> karaktert használ).</translation>
+<translation id="1639239467298939599">Betöltés</translation>
+<translation id="2908441821576996758">Kérjük, adjon meg egy vesszőkkel elválasztott e-mail címlistát.</translation>
<translation id="5939518447894949180">Visszaállítás</translation>
+<translation id="835897206747267392">Érvénytelen érték.</translation>
+<translation id="3851140433852960970">Nincs megfelelő plug-in a tartalom megjelenítéséhez.</translation>
<translation id="1842960171412779397">Kiválasztás</translation>
+<translation id="3450233048674729344">Az érték legyen kisebb vagy egyenlő, mint <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">A szükséges plug-in nincs telepítve.</translation>
<translation id="7638452146404718955">Ide kattintva letöltheti a plug-int</translation>
<translation id="6119846243427417423">Aktiválás</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fájl</translation>
-<translation id="4470547978413275879">A következő plug-in nincs telepítve: <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">Nincs elérhető plug-in a tartalom megjelenítéséhez</translation>
+<translation id="3934680773876859118">PDF dokumentum betöltése sikertelen</translation>
<translation id="8597182159515967513">fejléc</translation>
<translation id="2653659639078652383">Elküldés</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> plug-in szükséges</translation>
diff --git a/webkit/glue/resources/webkit_strings_id.xtb b/webkit/glue/resources/webkit_strings_id.xtb
index 50c97a2..daa6799 100644
--- a/webkit/glue/resources/webkit_strings_id.xtb
+++ b/webkit/glue/resources/webkit_strings_id.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Gagal memasang pengaya dari <ph name="URL"/></translation>
<translation id="9186171386827445984">Memuat dokumen: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> halaman...</translation>
<translation id="1235745349614807883">Hapus Penelusuran Barusan</translation>
+<translation id="1171774979989969504">Masukkan alamat email.</translation>
+<translation id="709897737746224366">Sesuaikan dengan format yang diminta.</translation>
<translation id="5048533449481078685">penanda daftar</translation>
<translation id="372362261556059955">Diperlukan pengaya tambahan</translation>
<translation id="4202807286478387388">lompati</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Membuka...</translation>
<translation id="6845533974506654842">tekan</translation>
<translation id="8244226242650769279">gambar peta</translation>
+<translation id="310520048233152454">Masukkan URL.</translation>
<translation id="2548326553472216322">Tidak ada penelusuran terkini</translation>
+<translation id="7263440858009898357">Pilih item pada daftar.</translation>
+<translation id="5164977714490026579">Nilai harus lebih besar daripada atau sama dengan <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Tingkat Tinggi)</translation>
<translation id="3040011195152428237">tautan</translation>
<translation id="2745343197843472802">Dapatkan Pengaya</translation>
+<translation id="8451268428117625855">Pilih berkas.</translation>
<translation id="5776402066334188252">Konfirmasikan bahwa Anda ingin memasang pengaya ini. Anda harus memasang pengaya yang dipercayai saja.</translation>
-<translation id="4003986561708175844">Pengaya yang diperlukan belum terpasang</translation>
<translation id="3018094406922859308">Mengunduh pengaya...</translation>
<translation id="7364796246159120393">Pilih Berkas</translation>
+<translation id="2761667185364618470">Centang kotak ini jika Anda ingin melanjutkan.</translation>
<translation id="8964020114565522021">Tarik file ke sini</translation>
+<translation id="5129723458012748440">Pengaya <ph name="PLUGIN"/> tidak dipasang.</translation>
<translation id="838869780401515933">centangi</translation>
<translation id="2846343701378493991">1024 (Tingkat Menengah)</translation>
<translation id="5476505524087279545">batalkan centang</translation>
<translation id="3789841737615482174">Instal</translation>
+<translation id="2507943997699731163">Harap isi bidang ini.</translation>
<translation id="5253117816378681419">Konfirmasikan bahwa Anda ingin memasang pengaya <ph name="PLUGIN"/>. Anda harus memasang pengaya yang Anda percayai saja.</translation>
<translation id="6663448176199120256">Penelusuran Barusan</translation>
+<translation id="7335060848622232389">Pemasangan pengaya telah dinonaktifkan.</translation>
<translation id="2597378329261239068">Dokumen ini dilindungi sandi. Masukkan sandi.</translation>
+<translation id="5466621249238537318">Pilih salah satu atau beberapa berkas.</translation>
+<translation id="8750798805984357768">Pilih salah satu opsi berikut.</translation>
<translation id="7740050170769002709">Konten HTML</translation>
+<translation id="2226276347425096477">Pendekkan teks ini menjadi <ph name="MAX_CHARACTERS"/> karakter atau kurang (saat ini Anda menggunakan <ph name="CURRENT_LENGTH"/> karakter).</translation>
+<translation id="1639239467298939599">Memuat</translation>
+<translation id="2908441821576996758">Masukkan daftar alamat email yang dipisahkan dengan koma.</translation>
<translation id="5939518447894949180">Atur ulang</translation>
+<translation id="835897206747267392">Nilai tidak valid.</translation>
+<translation id="3851140433852960970">Tidak ada pengaya yang tersedia untuk menampilkan konten ini.</translation>
<translation id="1842960171412779397">pilih</translation>
+<translation id="3450233048674729344">Nilai harus lebih kecil atau sama dengan <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Pengaya yang diperlukan tidak dipasang.</translation>
<translation id="7638452146404718955">Klik di sini untuk mengunduh pengaya</translation>
<translation id="6119846243427417423">aktifkan</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> berkas</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> pengaya belum terpasang</translation>
-<translation id="6765711848403622008">Tidak tersedia pengaya untuk menampilkan konten ini</translation>
+<translation id="3934680773876859118">Gagal memuat dokumen PDF</translation>
<translation id="8597182159515967513">kepala</translation>
<translation id="2653659639078652383">Kirim</translation>
<translation id="8475551193147984329">Pengaya <ph name="PLUGIN"/> diperlukan</translation>
diff --git a/webkit/glue/resources/webkit_strings_it.xtb b/webkit/glue/resources/webkit_strings_it.xtb
index 1fae27f..6ee3309 100644
--- a/webkit/glue/resources/webkit_strings_it.xtb
+++ b/webkit/glue/resources/webkit_strings_it.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Installazione del plug-in da <ph name="URL"/> non riuscita</translation>
<translation id="9186171386827445984">Caricamento del documento in corso: pagine <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/>...</translation>
<translation id="1235745349614807883">Cancella ricerche recenti</translation>
+<translation id="1171774979989969504">Inserisci un indirizzo email.</translation>
+<translation id="709897737746224366">Rispetta il formato richiesto.</translation>
<translation id="5048533449481078685">indicatore elenco</translation>
<translation id="372362261556059955">È necessario un plug-in aggiuntivo</translation>
<translation id="4202807286478387388">vai</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Caricamento in corso...</translation>
<translation id="6845533974506654842">premi</translation>
<translation id="8244226242650769279">image map</translation>
+<translation id="310520048233152454">Inserisci un URL.</translation>
<translation id="2548326553472216322">Nessuna ricerca recente</translation>
+<translation id="7263440858009898357">Seleziona un elemento nell'elenco.</translation>
+<translation id="5164977714490026579">Il valore deve essere superiore o uguale a <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (alta qualità)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Scarica plug-in</translation>
+<translation id="8451268428117625855">Seleziona un file.</translation>
<translation id="5776402066334188252">Conferma l'installazione del plug-in. Dovresti installare soltanto plug-in attendibili.</translation>
-<translation id="4003986561708175844">Il plug-in richiesto non è installato</translation>
<translation id="3018094406922859308">Download del plug-in in corso...</translation>
<translation id="7364796246159120393">Scegli file</translation>
+<translation id="2761667185364618470">Seleziona questa casella se intendi procedere.</translation>
<translation id="8964020114565522021">Trascina il file qui</translation>
+<translation id="5129723458012748440">Il plug-in <ph name="PLUGIN"/> non è installato.</translation>
<translation id="838869780401515933">seleziona</translation>
<translation id="2846343701378493991">1024 (Medium Grade)</translation>
<translation id="5476505524087279545">deseleziona</translation>
<translation id="3789841737615482174">Installa</translation>
+<translation id="2507943997699731163">Compila questo campo.</translation>
<translation id="5253117816378681419">Conferma che desideri installare il plug-in <ph name="PLUGIN"/>. Dovresti installare soltanto plug-in attendibili.</translation>
<translation id="6663448176199120256">Ricerche recenti</translation>
+<translation id="7335060848622232389">L'installazione dei plug-in è stata disattivata.</translation>
<translation id="2597378329261239068">Questo documento è protetto da password. Inserisci una password.</translation>
+<translation id="5466621249238537318">Seleziona uno o più file.</translation>
+<translation id="8750798805984357768">Seleziona una di queste opzioni.</translation>
<translation id="7740050170769002709">Contenuti HTML</translation>
+<translation id="2226276347425096477">Riduci questo testo a <ph name="MAX_CHARACTERS"/> caratteri o meno (attualmente stai utilizzando <ph name="CURRENT_LENGTH"/> caratteri).</translation>
+<translation id="1639239467298939599">Caricamento</translation>
+<translation id="2908441821576996758">Inserisci un elenco di indirizzi email separati da virgola.</translation>
<translation id="5939518447894949180">Ripristina</translation>
+<translation id="835897206747267392">Valore non valido.</translation>
+<translation id="3851140433852960970">Nessun plug-in disponibile per visualizzare questi contenuti</translation>
<translation id="1842960171412779397">seleziona</translation>
+<translation id="3450233048674729344">Il valore deve essere inferiore o uguale a <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Il plug-in richiesto non è installato.</translation>
<translation id="7638452146404718955">Fai clic qui per scaricare il plug-in</translation>
<translation id="6119846243427417423">attiva</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> file</translation>
-<translation id="4470547978413275879">Il plug-in <ph name="PLUGIN"/> non è installato</translation>
-<translation id="6765711848403622008">Nessun plug-in disponibile per visualizzare questo contenuto</translation>
+<translation id="3934680773876859118">Caricamento del documento PDF non riuscito</translation>
<translation id="8597182159515967513">intestazione</translation>
<translation id="2653659639078652383">Invia</translation>
<translation id="8475551193147984329">È necessario il plug-in <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_iw.xtb b/webkit/glue/resources/webkit_strings_iw.xtb
index f748311..1e236dc 100644
--- a/webkit/glue/resources/webkit_strings_iw.xtb
+++ b/webkit/glue/resources/webkit_strings_iw.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">התקנת הפלאגין מתוך <ph name="URL"/> נכשלה</translation>
<translation id="9186171386827445984">טוען מסמך: דפים <ph name="NUMBER_OF_PAGES"/>/<ph name="PAGE_NUMBER"/>...</translation>
<translation id="1235745349614807883">הסר חיפושים אחרונים</translation>
+<translation id="1171774979989969504">הזן כתובת דוא&quot;ל.</translation>
+<translation id="709897737746224366">התאם את הפורמט המבוקש.</translation>
<translation id="5048533449481078685">סמן רשימה</translation>
<translation id="372362261556059955">פלאגין נוסף נחוץ</translation>
<translation id="4202807286478387388">קפוץ</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">טוען...</translation>
<translation id="6845533974506654842">לחץ</translation>
<translation id="8244226242650769279">מפת תמונות</translation>
+<translation id="310520048233152454">הזן כתובת אתר.</translation>
<translation id="2548326553472216322">אין חיפושים אחרונים</translation>
+<translation id="7263440858009898357">בחר פריט מהרשימה.</translation>
+<translation id="5164977714490026579">הערך חייב להיות גדול מ-<ph name="MINIMUM"/> או שווה לו.</translation>
<translation id="5944544982112848342">2048 (High Grade)</translation>
<translation id="3040011195152428237">קישור</translation>
<translation id="2745343197843472802">השג פלאגין</translation>
+<translation id="8451268428117625855">בחר קובץ.</translation>
<translation id="5776402066334188252">אשר שברצונך להתקין פלאגין זה. יש להתקין רכיבי פלאגין שאתה בוטח בהם בלבד.</translation>
-<translation id="4003986561708175844">הפלאגין הדרוש אינו מותקן</translation>
<translation id="3018094406922859308">מוריד פלאגין...</translation>
<translation id="7364796246159120393">בחר קובץ</translation>
+<translation id="2761667185364618470">סמן תיבה זו אם אתה רוצה להמשיך.</translation>
<translation id="8964020114565522021">גרור את הקובץ לכאן</translation>
+<translation id="5129723458012748440">הפלאגין <ph name="PLUGIN"/> אינו מותקן.</translation>
<translation id="838869780401515933">סמן</translation>
<translation id="2846343701378493991">1024 (Medium Grade)</translation>
<translation id="5476505524087279545">בטל סימון</translation>
<translation id="3789841737615482174">התקן</translation>
+<translation id="2507943997699731163">מלא שדה זה.</translation>
<translation id="5253117816378681419">אשר שברצונך להתקין את הפלאגין <ph name="PLUGIN"/>. יש להתקין רכיבי פלאגין שאתה בוטח בהם בלבד.</translation>
<translation id="6663448176199120256">חיפושים אחרונים</translation>
+<translation id="7335060848622232389">התקנת יישומי הפלאגין הושבתה.</translation>
<translation id="2597378329261239068">מסמך זה מוגן באמצעות סיסמה. הזן סיסמה.</translation>
+<translation id="5466621249238537318">בחר קובץ אחד או יותר.</translation>
+<translation id="8750798805984357768">בחר אחת מהאפשרויות הבאות.</translation>
<translation id="7740050170769002709">תוכן HTML</translation>
+<translation id="2226276347425096477">קצר טקסט זה ל-<ph name="MAX_CHARACTERS"/> תווים או פחות (אתה משתמש כעת ב-<ph name="CURRENT_LENGTH"/> תווים).</translation>
+<translation id="1639239467298939599">טוען</translation>
+<translation id="2908441821576996758">הזן רשימה של כתובות דוא&quot;ל המופרדות באמצעות פסיקים.</translation>
<translation id="5939518447894949180">אפס</translation>
+<translation id="835897206747267392">ערך לא חוקי.</translation>
+<translation id="3851140433852960970">אין פלאגין זמין להצגת תוכן זה.</translation>
<translation id="1842960171412779397">בחר</translation>
+<translation id="3450233048674729344">הערך חייב להיות קטן מ-<ph name="MAXIMUM"/> או שווה לו.</translation>
+<translation id="9198010615634362518">הפלאגין הדרוש אינו מותקן.</translation>
<translation id="7638452146404718955">לחץ כאן להורדת פלאגין</translation>
<translation id="6119846243427417423">הפעל</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> קבצים</translation>
-<translation id="4470547978413275879">הפלאגין <ph name="PLUGIN"/> אינו מותקן</translation>
-<translation id="6765711848403622008">אין פלאגין זמין להצגת תוכן זה</translation>
+<translation id="3934680773876859118">הטעינה של מסמך PDF נכשלה</translation>
<translation id="8597182159515967513">כותרת</translation>
<translation id="2653659639078652383">שלח</translation>
<translation id="8475551193147984329">הפלאגין <ph name="PLUGIN"/> דרוש</translation>
diff --git a/webkit/glue/resources/webkit_strings_ja.xtb b/webkit/glue/resources/webkit_strings_ja.xtb
index 865979d..95db67b 100644
--- a/webkit/glue/resources/webkit_strings_ja.xtb
+++ b/webkit/glue/resources/webkit_strings_ja.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> からプラグインをインストールできませんでした</translation>
<translation id="9186171386827445984">ドキュメントの読み込み中: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> ページ...</translation>
<translation id="1235745349614807883">最近の検索履歴を消去</translation>
+<translation id="1171774979989969504">メール アドレスを入力してください。</translation>
+<translation id="709897737746224366">指定されている形式で入力してください。</translation>
<translation id="5048533449481078685">リスト マーカー</translation>
<translation id="372362261556059955">追加のプラグインが必要です</translation>
<translation id="4202807286478387388">ジャンプ</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">読み込み中...</translation>
<translation id="6845533974506654842">押す</translation>
<translation id="8244226242650769279">イメージ マップ</translation>
+<translation id="310520048233152454">URL を入力してください。</translation>
<translation id="2548326553472216322">最近の検索はありません</translation>
+<translation id="7263440858009898357">リスト内の項目を選択してください。</translation>
+<translation id="5164977714490026579">値は <ph name="MINIMUM"/> 以上にする必要があります。</translation>
<translation id="5944544982112848342">2048 (高)</translation>
<translation id="3040011195152428237">リンク</translation>
<translation id="2745343197843472802">プラグインをダウンロード</translation>
+<translation id="8451268428117625855">ファイルを選択してください。</translation>
<translation id="5776402066334188252">このプラグインをインストールしてもよいかご確認ください。信頼できるプラグインのみをインストールする必要があります。</translation>
-<translation id="4003986561708175844">必要なプラグインがインストールされていません</translation>
<translation id="3018094406922859308">プラグインをダウンロードしています...</translation>
<translation id="7364796246159120393">ファイルを選択</translation>
+<translation id="2761667185364618470">次に進むにはこのチェックボックスをオンにしてください。</translation>
<translation id="8964020114565522021">ファイルをここにドラッグ</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> プラグインがインストールされていません。</translation>
<translation id="838869780401515933">チェックを付ける</translation>
<translation id="2846343701378493991">1024 (中)</translation>
<translation id="5476505524087279545">チェックを外す</translation>
<translation id="3789841737615482174">インストール</translation>
+<translation id="2507943997699731163">このフィールドを入力してください。</translation>
<translation id="5253117816378681419">この <ph name="PLUGIN"/> プラグインをインストールしてもよいかご確認ください。信頼できるプラグインのみをインストールする必要があります。</translation>
<translation id="6663448176199120256">最近の検索</translation>
+<translation id="7335060848622232389">プラグインのインストールが無効になっています。</translation>
<translation id="2597378329261239068">このドキュメントはパスワードで保護されています。パスワードを入力してください。</translation>
+<translation id="5466621249238537318">1 つ以上のファイルを選択してください。</translation>
+<translation id="8750798805984357768">これらのオプションから 1 つ選択してください。</translation>
<translation id="7740050170769002709">HTML コンテンツ</translation>
+<translation id="2226276347425096477">このテキストを半角 <ph name="MAX_CHARACTERS"/> 文字以下にしてください(現時点で半角 <ph name="CURRENT_LENGTH"/> 文字です)。</translation>
+<translation id="1639239467298939599">読み込み中</translation>
+<translation id="2908441821576996758">メール アドレスのカンマ区切りリストを入力してください。</translation>
<translation id="5939518447894949180">リセット</translation>
+<translation id="835897206747267392">値が無効です。</translation>
+<translation id="3851140433852960970">このコンテンツの表示に使用できるプラグインはありません。</translation>
<translation id="1842960171412779397">選択</translation>
+<translation id="3450233048674729344">値は <ph name="MAXIMUM"/> 以下にする必要があります。</translation>
+<translation id="9198010615634362518">必要なプラグインがインストールされていません。</translation>
<translation id="7638452146404718955">ここをクリックしてプラグインをダウンロード</translation>
<translation id="6119846243427417423">アクティブにする</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ファイル</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> プラグインがインストールされていません</translation>
-<translation id="6765711848403622008">このコンテンツの表示に使用できるプラグインはありません</translation>
+<translation id="3934680773876859118">PDF ドキュメントを読み込むことができませんでした</translation>
<translation id="8597182159515967513">見出し</translation>
<translation id="2653659639078652383">送信</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> プラグインが必要です</translation>
diff --git a/webkit/glue/resources/webkit_strings_kn.xtb b/webkit/glue/resources/webkit_strings_kn.xtb
index 9a8f827..c7e441a 100644
--- a/webkit/glue/resources/webkit_strings_kn.xtb
+++ b/webkit/glue/resources/webkit_strings_kn.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> ನಿಂದ ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಸ್ಥಾಪಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ</translation>
<translation id="9186171386827445984">ಲೋಡಿಂಗ್ ಡಾಕ್ಯುಮೆಂಟ್: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> ಪುಟಗಳು...</translation>
<translation id="1235745349614807883">ಇತ್ತೀಚಿನ ಹುಡುಕಾಟವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation>
+<translation id="1171774979989969504">ದಯವಿಟ್ಟು ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ.</translation>
+<translation id="709897737746224366">ದಯವಿಟ್ಟು ವಿನಂತಿಸಿದ ಸ್ವರೂಪವನ್ನು ಹೊಂದಿಸಿ.</translation>
<translation id="5048533449481078685">ಪಟ್ಟಿ ಗುರುತು</translation>
<translation id="372362261556059955">ಹೆಚ್ಚುವರಿ ಪ್ಲಗ್-ಇನ್ ಅಗತ್ಯವಿದೆ</translation>
<translation id="4202807286478387388">ಹಾರು</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
<translation id="6845533974506654842">ಒತ್ತಿ</translation>
<translation id="8244226242650769279">ಇಮೇಜ್ ನಕ್ಷೆ</translation>
+<translation id="310520048233152454">ದಯವಿಟ್ಟು URL ಅನ್ನು ನಮೂದಿಸಿ.</translation>
<translation id="2548326553472216322">ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು ಇಲ್ಲ</translation>
+<translation id="7263440858009898357">ಪಟ್ಟಿಯಲ್ಲಿನ ಐಟಂ ಅನ್ನು ದಯವಿಟ್ಟು ಆಯ್ಕೆ ಮಾಡಿ.</translation>
+<translation id="5164977714490026579">ಮೌಲ್ಯವು <ph name="MINIMUM"/> ಕ್ಕಿಂತಲೂ ಹೆಚ್ಚಾಗಿರಬೇಕು ಅಥವಾ ಸಮನಾಗಿರಬೇಕು.</translation>
<translation id="5944544982112848342">2048 (ಉನ್ನತ ಶ್ರೇಣಿ)</translation>
<translation id="3040011195152428237">ಲಿಂಕ್</translation>
<translation id="2745343197843472802">ಪ್ಲಗ್-ಇನ್ ಪಡೆಯಿರಿ</translation>
+<translation id="8451268428117625855">ದಯವಿಟ್ಟು ಫೈಲ್ ಆಯ್ಕೆಮಾಡಿ.</translation>
<translation id="5776402066334188252">ನೀವು ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲು ಬಯಸುವುದಾದಲ್ಲಿ ದಯವಿಟ್ಟು ಖಚಿತಪಡಿಸಿ. ನಿಮಗೆ ನಂಬಿಕೆ ಇರುವ ಫ್ಲಗ್-ಇನ್‌ಗಳನ್ನು ಮಾತ್ರ ನೀವು ಸ್ಥಾಪಿಸಬೇಕು.</translation>
-<translation id="4003986561708175844">ಅಗತ್ಯವಿರುವ ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಅಳವಡಿಸಲಾಗಿಲ್ಲ</translation>
<translation id="3018094406922859308">ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation>
<translation id="7364796246159120393">ಫೈಲ್ ಆಯ್ಕೆ ಮಾಡಿ</translation>
+<translation id="2761667185364618470">ನೀವು ಮುಂದುವರೆಯಬೇಕಾದರೆ ದಯವಿಟ್ಟು ಈ ಬಾಕ್ಸ್ ಅನ್ನು ಪರೀಕ್ಷಿಸಿ.</translation>
<translation id="8964020114565522021">ಇಲ್ಲಿ ಫೈಲ್ ಅನ್ನು ಎಳೆಯಿರಿ</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> ನ ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ.</translation>
<translation id="838869780401515933">ಪರಿಶೀಲಿಸು</translation>
<translation id="2846343701378493991">1024 (ಮದ್ಯಮ ಶ್ರೇಣಿ)</translation>
<translation id="5476505524087279545">ಪರೀಕ್ಷಿಸಬೇಡಿ</translation>
<translation id="3789841737615482174">ಇನ್‌ಸ್ಟಾಲ್</translation>
+<translation id="2507943997699731163">ದಯವಿಟ್ಟು ಈ ಕ್ಷೇತ್ರವನ್ನು ಭರ್ತಿ ಮಾಡಿ.</translation>
<translation id="5253117816378681419">ನೀವು <ph name="PLUGIN"/> ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಅಳವಡಿಸಲು ಬಯಸುವುದಾದಲ್ಲಿ ದಯವಿಟ್ಟು ಖಚಿತಪಡಿಸಿ. ನೀವು ನಂಬುವಂತಹ ಫ್ಲಗ್-ಇನ್‌ಗಳನ್ನು ಮಾತ್ರ ನೀವು ಅಳವಡಿಸಬೇಕು.</translation>
<translation id="6663448176199120256">ಇತ್ತೀಚಿನ ಹುಡುಕಾಟಗಳು</translation>
+<translation id="7335060848622232389">ಪ್ಲಗ್ ಇನ್‌ಗಳ ಸ್ಥಾಪನೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ.</translation>
<translation id="2597378329261239068">ಈ ಡಾಕ್ಯುಮೆಂಟ್‌ ಅನ್ನು ಪಾಸ್‌ವರ್ಡ್‌ನಿಂದ ರಕ್ಷಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸಿ.</translation>
+<translation id="5466621249238537318">ದಯವಿಟ್ಟು ಒಂದು ಅಥವಾ ಹೆಚ್ಚು ಫೈಲ್‌ಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ.</translation>
+<translation id="8750798805984357768">ದಯವಿಟ್ಟು ಈ ಕೆಳಗಿನ ಆಯ್ಕೆಗಳಲ್ಲಿ ಒಂದನ್ನು ಆರಿಸಿ.</translation>
<translation id="7740050170769002709">HTML ವಿಷಯ</translation>
+<translation id="2226276347425096477">ದಯವಿಟ್ಟು ಈ ಪಠ್ಯವನ್ನು <ph name="MAX_CHARACTERS"/> ಅಕ್ಷರಗಳಿಗೆ ಅಥವಾ ಅದಕ್ಕಿಂತಲೂ ಕಡಿಮೆಗೆ ಸೀಮಿತಗೊಳಿಸಿ (ನೀವು ಪ್ರಸ್ತುತವಾಗಿ <ph name="CURRENT_LENGTH"/> ಅಕ್ಷರಗಳನ್ನು ಬಳಸುತ್ತಿರುವಿರಿ).</translation>
+<translation id="1639239467298939599">ಲೋಡ್ ಆಗುತ್ತಿದೆ</translation>
+<translation id="2908441821576996758">ದಯವಿಟ್ಟು ಅಲ್ಪ ವಿರಾಮದಿಂದ ಬೇರ್ಪಡಿಸಿದ ಇಮೇಲ್ ವಿಳಾಸಗಳ ಪಟ್ಟಿಯನ್ನು ನಮೂದಿಸಿ.</translation>
<translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation>
+<translation id="835897206747267392">ಅಮಾನ್ಯ ಮೌಲ್ಯ.</translation>
+<translation id="3851140433852960970">ಈ ವಿಷಯವನ್ನು ಪ್ರದರ್ಶಿಸಲು ಯಾವುದೇ ಪ್ಲಗ್-ಇನ್ ಲಭ್ಯವಿಲ್ಲ.</translation>
<translation id="1842960171412779397">ಆಯ್ಕೆ ಮಾಡಿ</translation>
+<translation id="3450233048674729344">ಮೌಲ್ಯವು <ph name="MAXIMUM"/> ಕ್ಕೆ ಸಮನಾಗಿರಬಹುದು ಅಥವಾ ಅದಕ್ಕಿಂತಲೂ ಕಡಿಮೆ ಆಗಿರಬಹುದು.</translation>
+<translation id="9198010615634362518">ಅಗತ್ಯವಿರುವ ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಅಳವಡಿಸಲಾಗಿಲ್ಲ.</translation>
<translation id="7638452146404718955">ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಡೌನ್‌ಲೋಡ್ ಮಾಡಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ</translation>
<translation id="6119846243427417423">ಸಕ್ರಿಯಗೊಳಿಸು</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ಫೈಲ್‌ಗಳು</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> ನ ಪ್ಲಗ್-ಇನ್ ಅನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ</translation>
-<translation id="6765711848403622008">ಈ ವಿಷಯವನ್ನು ಪ್ರದರ್ಶಿಸಲು ಯಾವುದೇ ಪ್ಲಗ್-ಇನ್ ಲಭ್ಯವಿಲ್ಲ</translation>
+<translation id="3934680773876859118">PDF ಡಾಕ್ಯುಮೆಂಟ್ ಅನ್ನು ಲೋಡ್ ಮಾಡಲು ವಿಫಲವಾಗಿದೆ</translation>
<translation id="8597182159515967513">ಶೀರ್ಷಿಕೆ</translation>
<translation id="2653659639078652383">ಸಲ್ಲಿಸು</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> ಪ್ಲಗ್-ಇನ್ ಅಗತ್ಯವಿದೆ</translation>
diff --git a/webkit/glue/resources/webkit_strings_ko.xtb b/webkit/glue/resources/webkit_strings_ko.xtb
index f3e829e..5c147e3 100644
--- a/webkit/glue/resources/webkit_strings_ko.xtb
+++ b/webkit/glue/resources/webkit_strings_ko.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/>의 플러그인 설치 실패</translation>
<translation id="9186171386827445984">문서 로드 중: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/>페이지</translation>
<translation id="1235745349614807883">최근 검색 삭제</translation>
+<translation id="1171774979989969504">이메일 주소를 입력하세요.</translation>
+<translation id="709897737746224366">요청한 형식과 일치시키세요.</translation>
<translation id="5048533449481078685">목록 표시기</translation>
<translation id="372362261556059955">추가 플러그인 필요</translation>
<translation id="4202807286478387388">건너뛰기</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">로드 중...</translation>
<translation id="6845533974506654842">누르기</translation>
<translation id="8244226242650769279">이미지 지도</translation>
+<translation id="310520048233152454">URL을 입력하세요.</translation>
<translation id="2548326553472216322">최근 수행된 검색 없음</translation>
+<translation id="7263440858009898357">목록에서 항목을 선택하세요.</translation>
+<translation id="5164977714490026579">값은 <ph name="MINIMUM"/> 이상이어야 합니다.</translation>
<translation id="5944544982112848342">2048(높은 등급)</translation>
<translation id="3040011195152428237">링크</translation>
<translation id="2745343197843472802">플러그인 가져오기</translation>
+<translation id="8451268428117625855">파일을 선택하세요.</translation>
<translation id="5776402066334188252">플러그인을 설치할지 여부를 확인하시기 바랍니다. 신뢰할 수 있는 플러그인만 설치해야 합니다.</translation>
-<translation id="4003986561708175844">필수 플러그인이 설치되지 않음</translation>
<translation id="3018094406922859308"> 플러그인 다운로드 중...</translation>
<translation id="7364796246159120393">파일 선택</translation>
+<translation id="2761667185364618470">계속하려면 이 확인란을 선택하세요.</translation>
<translation id="8964020114565522021">여기로 파일 드래그</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> 플러그인이 설치되지 않았습니다.</translation>
<translation id="838869780401515933">선택</translation>
<translation id="2846343701378493991">1024(중간 등급)</translation>
<translation id="5476505524087279545">선택취소</translation>
<translation id="3789841737615482174">설치</translation>
+<translation id="2507943997699731163">이 입력란을 작성하세요.</translation>
<translation id="5253117816378681419"><ph name="PLUGIN"/> 플러그인을 설치할지 여부를 확인하시기 바랍니다. 신뢰할 수 있는 플러그인만 설치해야 합니다.</translation>
<translation id="6663448176199120256">최근 수행된 검색</translation>
+<translation id="7335060848622232389">플러그인 설치가 중단되었습니다.</translation>
<translation id="2597378329261239068">문서가 비밀번호로 보호되고 있습니다. 비밀번호를 입력하세요.</translation>
+<translation id="5466621249238537318">파일을 한 개 이상 선택하세요.</translation>
+<translation id="8750798805984357768">다음 옵션 중 하나를 선택하세요.</translation>
<translation id="7740050170769002709">HTML 콘텐츠</translation>
+<translation id="2226276347425096477">이 텍스트를 <ph name="MAX_CHARACTERS"/>자 이하로 줄이세요(현재 <ph name="CURRENT_LENGTH"/>자 사용 중).</translation>
+<translation id="1639239467298939599">로드 중</translation>
+<translation id="2908441821576996758">이메일 주소를 쉼표로 구분하여 입력하세요.</translation>
<translation id="5939518447894949180">재설정</translation>
+<translation id="835897206747267392">값이 잘못되었습니다.</translation>
+<translation id="3851140433852960970">이 콘텐츠를 표시하는 데 사용할 플러그인이 없습니다.</translation>
<translation id="1842960171412779397">선택</translation>
+<translation id="3450233048674729344">값은 <ph name="MAXIMUM"/> 이하여야 합니다.</translation>
+<translation id="9198010615634362518">필수 플러그인이 설치되지 않았습니다.</translation>
<translation id="7638452146404718955">여기를 클릭하여 플러그인 다운로드</translation>
<translation id="6119846243427417423">활성화</translation>
<translation id="8444882422881193423">파일 <ph name="NUMBER_OF_FILES"/>개</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> 플러그인이 설치되지 않음</translation>
-<translation id="6765711848403622008">이 콘텐츠를 표시하는 데 사용할 플러그인 없음</translation>
+<translation id="3934680773876859118">PDF 문서를 로드하지 못했습니다.</translation>
<translation id="8597182159515967513">항목</translation>
<translation id="2653659639078652383">제출</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> 플러그인 필요</translation>
diff --git a/webkit/glue/resources/webkit_strings_lt.xtb b/webkit/glue/resources/webkit_strings_lt.xtb
index 7138796..3f2ec75 100644
--- a/webkit/glue/resources/webkit_strings_lt.xtb
+++ b/webkit/glue/resources/webkit_strings_lt.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Nepavyko įdiegti papildinio iš <ph name="URL"/></translation>
<translation id="9186171386827445984">Įkeliamas dokumentas: <ph name="PAGE_NUMBER"/> / <ph name="NUMBER_OF_PAGES"/> psl...</translation>
<translation id="1235745349614807883">Išvalyti pastarąsias paieškas</translation>
+<translation id="1171774979989969504">Įveskite el. pašto adresą.</translation>
+<translation id="709897737746224366">Priderinkite reikalaujamą formatą.</translation>
<translation id="5048533449481078685">sąrašo žymeklis</translation>
<translation id="372362261556059955">Reikia papildomo papildinio</translation>
<translation id="4202807286478387388">peršokti</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Įkeliama...</translation>
<translation id="6845533974506654842">paspausti</translation>
<translation id="8244226242650769279">paveikslėlio žemėlapis</translation>
+<translation id="310520048233152454">Įveskite URL.</translation>
<translation id="2548326553472216322">Pastaruoju metu paieškų nevykdyta</translation>
+<translation id="7263440858009898357">Pasirinkite sąraše pateiktą elementą.</translation>
+<translation id="5164977714490026579">Vertė turi būti <ph name="MINIMUM"/> arba didesnė.</translation>
<translation id="5944544982112848342">2048 (Aukšto laipsnio)</translation>
<translation id="3040011195152428237">nuoroda</translation>
<translation id="2745343197843472802">Gauti papildinį</translation>
+<translation id="8451268428117625855">Pasirinkite failą.</translation>
<translation id="5776402066334188252">Patvirtinkite, kad norite įdiegti šį papildinį. Turėtumėte diegti tik tuos papildinius, kurie yra patikimi.</translation>
-<translation id="4003986561708175844">Neįdiegtas reikalingas papildinys</translation>
<translation id="3018094406922859308">Atsisiunčiamas papildinys...</translation>
<translation id="7364796246159120393">Pasirinkti failą</translation>
+<translation id="2761667185364618470">Jei norite tęsti, pažymėkite šį laukelį.</translation>
<translation id="8964020114565522021">Vilkite failą čia</translation>
+<translation id="5129723458012748440">„<ph name="PLUGIN"/>“ papildinys neįdiegtas.</translation>
<translation id="838869780401515933">tikrinti</translation>
<translation id="2846343701378493991">1024 (vidutinio lygio)</translation>
<translation id="5476505524087279545">Nuimti žymėjimą</translation>
<translation id="3789841737615482174">Diegti</translation>
+<translation id="2507943997699731163">Užpildykite šį lauką.</translation>
<translation id="5253117816378681419">Patvirtinkite, kad norite įdiegti šį „<ph name="PLUGIN"/>“ papildinį. Turėtumėte diegti tik tuos papildinius, kurie patikimi.</translation>
<translation id="6663448176199120256">Naujausios paieškos</translation>
+<translation id="7335060848622232389">Papildinių įdiegimas neleidžiamas.</translation>
<translation id="2597378329261239068">Šis dokumentas apsaugotas slaptažodžiu. Įveskite slaptažodį.</translation>
+<translation id="5466621249238537318">Pasirinkite bent vieną failą.</translation>
+<translation id="8750798805984357768">Pasirinkite vieną iš šių parinkčių.</translation>
<translation id="7740050170769002709">HTML turinys</translation>
+<translation id="2226276347425096477">Sutrumpinkite šį tekstą iki <ph name="MAX_CHARACTERS"/> simb. ar mažiau (šiuo metu naudojate <ph name="CURRENT_LENGTH"/> simb.).</translation>
+<translation id="1639239467298939599">Įkeliama</translation>
+<translation id="2908441821576996758">Įveskite kableliais atskirtą el. pašto adresų sąrašą.</translation>
<translation id="5939518447894949180">Nustatyti iš naujo</translation>
+<translation id="835897206747267392">Neteisinga vertė.</translation>
+<translation id="3851140433852960970">Nėra papildinio, kad būtų galima pateikti šį turinį.</translation>
<translation id="1842960171412779397">pasirinkti</translation>
+<translation id="3450233048674729344">Vertė turi būti <ph name="MAXIMUM"/> arba mažesnė.</translation>
+<translation id="9198010615634362518">Neįdiegtas reikalingas papildinys.</translation>
<translation id="7638452146404718955">Spustelėkite čia, kad atsisiųstumėte papildinį</translation>
<translation id="6119846243427417423">aktyvinti</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> failai (-ų)</translation>
-<translation id="4470547978413275879">„<ph name="PLUGIN"/>“ papildinys neįdiegtas</translation>
-<translation id="6765711848403622008">Nėra papildinio, kad būtų galima pateikti šį turinį</translation>
+<translation id="3934680773876859118">Nepavyko įkelti PDF dokumento</translation>
<translation id="8597182159515967513">antraštė</translation>
<translation id="2653659639078652383">Pateikti</translation>
<translation id="8475551193147984329">Reikia „<ph name="PLUGIN"/>“ papildinio</translation>
diff --git a/webkit/glue/resources/webkit_strings_lv.xtb b/webkit/glue/resources/webkit_strings_lv.xtb
index f070834..ebfb0ad 100644
--- a/webkit/glue/resources/webkit_strings_lv.xtb
+++ b/webkit/glue/resources/webkit_strings_lv.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Neizdevās instalēt spraudni no <ph name="URL"/></translation>
<translation id="9186171386827445984">Notiek dokumenta ielāde: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> lappuses...</translation>
<translation id="1235745349614807883">Dzēst nesenos meklējumus</translation>
+<translation id="1171774979989969504">Ievadiet e-pasta adresi.</translation>
+<translation id="709897737746224366">Pieskaņojiet vērtību prasītajam formātam.</translation>
<translation id="5048533449481078685">sarakstu marķieris</translation>
<translation id="372362261556059955">Nepieciešams papildu spraudnis</translation>
<translation id="4202807286478387388">lekt</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Notiek ielāde...</translation>
<translation id="6845533974506654842">nospiest</translation>
<translation id="8244226242650769279">attēlu karte</translation>
+<translation id="310520048233152454">Ievadiet URL.</translation>
<translation id="2548326553472216322">Nav nesenu meklējumu</translation>
+<translation id="7263440858009898357">Atlasiet vienumu sarakstā.</translation>
+<translation id="5164977714490026579">Vērtībai ir jābūt lielākai vai vienādai ar <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Augsta Atzīme)</translation>
<translation id="3040011195152428237">saite</translation>
<translation id="2745343197843472802">Lejupielādēt spraudni</translation>
+<translation id="8451268428117625855">Lūdzu, atlasiet failu.</translation>
<translation id="5776402066334188252">Lūdzu, apstipriniet, ka vēlaties instalēt šo spraudni. Ieteicams instalēt tikai tos spraudņus, kuriem uzticaties.</translation>
-<translation id="4003986561708175844">Nepieciešamais spraudnis nav instalēts</translation>
<translation id="3018094406922859308">Notiek spraudņa lejupielāde...</translation>
<translation id="7364796246159120393">Izvēlieties failu</translation>
+<translation id="2761667185364618470">Lai turpinātu, atzīmējiet šo izvēles rūtiņu.</translation>
<translation id="8964020114565522021">Ievelciet failu šeit</translation>
+<translation id="5129723458012748440">Spraudnis <ph name="PLUGIN"/> nav instalēts.</translation>
<translation id="838869780401515933">prbaudt</translation>
<translation id="2846343701378493991">1024 (Vidēja Atzīme)</translation>
<translation id="5476505524087279545">neprbaudt</translation>
<translation id="3789841737615482174">Iestatīt</translation>
+<translation id="2507943997699731163">Aizpildiet šo lauku.</translation>
<translation id="5253117816378681419">Lūdzu, apstipriniet, ka vēlaties instalēt <ph name="PLUGIN"/> spraudni. Jums ir jāinstalē tikai tie spraudņi, kuriem uzticaties.</translation>
<translation id="6663448176199120256">Neseni meklējumi</translation>
+<translation id="7335060848622232389">Spraudņu instalēšana ir atspējota.</translation>
<translation id="2597378329261239068">Šis dokuments ir aizsargāts ar paroli. Lūdzu, ievadiet paroli.</translation>
+<translation id="5466621249238537318">Lūdzu, atlasiet vienu vai vairākus failus.</translation>
+<translation id="8750798805984357768">Lūdzu, atlasiet vienu no šīm opcijām.</translation>
<translation id="7740050170769002709">HTML saturs</translation>
+<translation id="2226276347425096477">Lūdzu, saīsiniet šo tekstu līdz <ph name="MAX_CHARACTERS"/> vai mazāk zīmēm (pašreiz tas ietver <ph name="CURRENT_LENGTH"/> rakstzīmes).</translation>
+<translation id="1639239467298939599">Notiek ielāde</translation>
+<translation id="2908441821576996758">Lūdzu, ievadiet ar komatu atdalītu e-pasta adrešu sarakstu.</translation>
<translation id="5939518447894949180">Atiestatīt</translation>
+<translation id="835897206747267392">Nederīga vērtība.</translation>
+<translation id="3851140433852960970">Nav pieejams neviens spraudnis, kas var attēlot šo saturu.</translation>
<translation id="1842960171412779397">Atlasiet</translation>
+<translation id="3450233048674729344">Vērtībai ir jābūt mazākai vai vienādai ar <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Nepieciešamais spraudnis nav instalēts.</translation>
<translation id="7638452146404718955">Noklikšķiniet šeit, lai lejupielādētu spraudni</translation>
<translation id="6119846243427417423">aktivizt</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> faili</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> spraudnis nav instalēts</translation>
-<translation id="6765711848403622008">Nav pieejams neviens spraudnis, kas var attēlot šo saturu</translation>
+<translation id="3934680773876859118">Neizdevās ielādēt PDF dokumentu</translation>
<translation id="8597182159515967513">Virsraksts</translation>
<translation id="2653659639078652383">Iesniegt</translation>
<translation id="8475551193147984329">Nepieciešams <ph name="PLUGIN"/> spraudnis</translation>
diff --git a/webkit/glue/resources/webkit_strings_ml.xtb b/webkit/glue/resources/webkit_strings_ml.xtb
index fdf0843..6bfaacc 100644
--- a/webkit/glue/resources/webkit_strings_ml.xtb
+++ b/webkit/glue/resources/webkit_strings_ml.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> എന്നതില്‍‌ നിന്നുള്ള പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്യുന്നതിന് പരാജയപ്പെട്ടു</translation>
<translation id="9186171386827445984">പ്രമാണങ്ങള്‍ ലോഡുചെയ്യുന്നു: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> പേജുകള്‍...</translation>
<translation id="1235745349614807883">അടുത്തിടെയുള്ള തിരയലുകള്‍ മായ്ക്കുക</translation>
+<translation id="1171774979989969504">ദയവായി ഒരു ഇമെയില്‍ വിലാസം നല്‍കുക.</translation>
+<translation id="709897737746224366">അഭ്യര്‍ത്ഥി ച്ചഫോര്‍മാറ്റ് ദയവായി പൊരുത്തപ്പെടുത്തുക.</translation>
<translation id="5048533449481078685">പട്ടിക മാര്‍ക്കര്‍</translation>
<translation id="372362261556059955">കൂടുതല്‍‌ പ്ലഗ്-ഇന്‍‌ ആവശ്യമുണ്ട്‌‌</translation>
<translation id="4202807286478387388">jump</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">ലോഡ്ചെയ്യുന്നു...</translation>
<translation id="6845533974506654842">അമര്‍ത്തുക</translation>
<translation id="8244226242650769279">ഇമേജ് മാപ്പ്</translation>
+<translation id="310520048233152454">ദയവായി ഒരു URL നല്‍കുക.</translation>
<translation id="2548326553472216322">സമീപകാല തിരയലുകള്‍ ഇല്ല</translation>
+<translation id="7263440858009898357">പട്ടികയിലെ ഒരു ഇനം ദയവായി തിരഞ്ഞെടുക്കുക</translation>
+<translation id="5164977714490026579">മൂല്യം <ph name="MINIMUM"/> എന്നതില്‍ കൂടുതലോ സമമോ ആയിരിക്കണം.</translation>
<translation id="5944544982112848342">2048 (High Grade)</translation>
<translation id="3040011195152428237">ലിങ്ക്</translation>
<translation id="2745343197843472802">പ്ലഗ്-ഇന്‍‌ നേടുക</translation>
+<translation id="8451268428117625855">ദയവായി ഒരു ഫയല്‍ തരം തിരഞ്ഞെടുക്കുക.</translation>
<translation id="5776402066334188252">നിങ്ങള്‍‌ ഈ പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്യാന്‍‌ താല്‍‌പ്പര്യപ്പെടുന്നുവെന്നത് ദയവായി സ്ഥിരീകരിക്കുക. നിങ്ങള്‍‌ വിശ്വസിക്കുന്ന പ്ലഗ്-ഇനുകള്‍‌ മാത്രമേ ഇന്‍‌സ്റ്റാള്‍‌ ചെയ്യാവൂ.</translation>
-<translation id="4003986561708175844">ആവശ്യമായ പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്തില്ല</translation>
<translation id="3018094406922859308">പ്ലഗ്-ഇന്‍‌ ഡൌണ്‍‌ലോഡുചെയ്യുന്നു...</translation>
<translation id="7364796246159120393">ഫയല്‍ തിരഞ്ഞെടുക്കൂ</translation>
+<translation id="2761667185364618470">നിങ്ങള്‍ തുടരാന്‍ താല്‍പ്പര്യപ്പെടുന്നെങ്കില്‍ ഈ ബോക്സ് ദയവായി പരിശോധിക്കുക.</translation>
<translation id="8964020114565522021">ഇവിടെ ഫയല്‍ ഇഴയ്ക്കുക</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> പ്ലഗ്-ഇന്‍ ഇന്‍സ്റ്റാളുചെയ്തില്ല.</translation>
<translation id="838869780401515933">പരിശോധിക്കൂ</translation>
<translation id="2846343701378493991">1024 (മീഡിയം ഗ്രേഡ്)</translation>
<translation id="5476505524087279545">അണ്‍ചെക്ക് ചെയ്യുക</translation>
<translation id="3789841737615482174">ഇന്‍സ്റ്റോള്‍ ചെയ്യുക</translation>
+<translation id="2507943997699731163">ദയവായി ഈ ഫീല്‍ഡ് പൂരിപ്പിക്കുക.</translation>
<translation id="5253117816378681419">നിങ്ങള്‍‌ ഈ <ph name="PLUGIN"/> പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്യാന്‍‌ താല്‍‌പ്പര്യപ്പെടുന്നുവെന്നത് ദയവായി സ്ഥിരീകരിക്കുക. നിങ്ങള്‍‌ വിശ്വസിക്കുന്ന പ്ലഗ്-ഇനുകള്‍‌ മാത്രമേ ഇന്‍‌സ്റ്റാള്‍‌ ചെയ്യാവൂ.</translation>
<translation id="6663448176199120256">സമീപകാല തിരയലുകള്‍</translation>
+<translation id="7335060848622232389">പ്ലഗ്-ഇന്നുകള്‍ ഇന്‍സ്റ്റാള്‍ ചെയ്യുന്നത് അപ്രാപ്തമാക്കി.</translation>
<translation id="2597378329261239068">ഈ പ്രമാണം പാസ്‌വേഡ് പരിരക്ഷിതമാണ്. ദയവായി ഒരു പാസ്‌വേഡ് നല്‍‌കുക.</translation>
+<translation id="5466621249238537318">ഒന്നോ അതില്‍ക്കൂടുതലോ ഫയലുകള്‍ ദയവായി തിരഞ്ഞെടുക്കുക.</translation>
+<translation id="8750798805984357768">ഈ ഓപ്ഷനുകളിലൊന്ന് ദയവായി തിരഞ്ഞെടുക്കുക.</translation>
<translation id="7740050170769002709">HTML ഉള്ളടക്കം</translation>
+<translation id="2226276347425096477">ഈ വാചകത്തെ <ph name="MAX_CHARACTERS"/> അല്ലെങ്കില്‍ അതില്‍‌ക്കുറവ് പ്രതീകങ്ങളായി ദയവായി കുറയ്ക്കുക (നിങ്ങള്‍ നിലവില്‍ <ph name="CURRENT_LENGTH"/> പ്രതീകങ്ങള്‍ ഉപയോഗിക്കുകയാണ്).</translation>
+<translation id="1639239467298939599">ലോഡുചെയ്യുന്നു</translation>
+<translation id="2908441821576996758">ഇമെയില്‍ വിലാസങ്ങളുടെ കോമയാല്‍ വേര്‍തിരിച്ച ഒരു പട്ടിക ദയവായി നല്‍കുക.</translation>
<translation id="5939518447894949180">വീണ്ടും സജ്ജീകരിക്കുക</translation>
+<translation id="835897206747267392">അസാധുവായ മൂല്യം.</translation>
+<translation id="3851140433852960970">ഈ ഉള്ളടക്കം പ്രദര്‍ശിപ്പിക്കുന്നതിന് പ്ലഗ്-ഇന്നൊന്നും ലഭ്യമല്ല.</translation>
<translation id="1842960171412779397">തിരഞ്ഞെടുക്കൂ</translation>
+<translation id="3450233048674729344">മൂല്യം <ph name="MAXIMUM"/> എന്നതില്‍ കുറവോ സമമോ ആയിരിക്കണം.</translation>
+<translation id="9198010615634362518">ആവശ്യമായ പ്ലഗ്-ഇന്‍ ഇന്‍സ്റ്റാളുചെയ്തില്ല.</translation>
<translation id="7638452146404718955">പ്ലഗ്-ഇന്‍‌ ഡൌണ്‍‌ലോഡുചെയ്യുന്നതിന് ഇവിടെ ക്ലിക്കുചെയ്യുക</translation>
<translation id="6119846243427417423">ആക്റ്റിവേറ്റ് ചെയ്യുക</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ഫയലുകള്‍</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> പ്ലഗ്-ഇന്‍‌ ഇന്‍‌സ്റ്റാളുചെയ്തില്ല</translation>
-<translation id="6765711848403622008">ഈ ഉള്ളടക്കം പ്രദര്‍‌ശിപ്പിക്കുന്നതിന് പ്ലഗ്-ഇന്നൊന്നും ലഭ്യമല്ല</translation>
+<translation id="3934680773876859118">PDF പ്രമാണം ലോഡുചെയ്യുന്നത് പരാജയപ്പെട്ടു</translation>
<translation id="8597182159515967513">തലക്കെട്ട്</translation>
<translation id="2653659639078652383">സമര്‍പ്പിക്കൂ</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> പ്ലഗ്-ഇന്‍‌ ആവശ്യമുണ്ട്</translation>
diff --git a/webkit/glue/resources/webkit_strings_mr.xtb b/webkit/glue/resources/webkit_strings_mr.xtb
index da03fe1..f902478 100644
--- a/webkit/glue/resources/webkit_strings_mr.xtb
+++ b/webkit/glue/resources/webkit_strings_mr.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> वरून प्लग-इन स्थापित करणे अयशस्वी</translation>
<translation id="9186171386827445984">दस्तऐवज लोड करत आहे: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> पृष्ठे...</translation>
<translation id="1235745349614807883">अलीकडील शोध साफ करा</translation>
+<translation id="1171774979989969504">कृपया एक ईमेल पत्ता प्रविष्ट करा.</translation>
+<translation id="709897737746224366">कृपया विनंती केलेले स्वरूपन जुळवा.</translation>
<translation id="5048533449481078685">सूची चिन्हक</translation>
<translation id="372362261556059955">अतिरिक्त प्लग-इन आवश्यक</translation>
<translation id="4202807286478387388">जंप करा</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">लोड करीत आहे...</translation>
<translation id="6845533974506654842">दाबा</translation>
<translation id="8244226242650769279">प्रतिमा नकाशा</translation>
+<translation id="310520048233152454">कृपया एखादी URL प्रविष्ट करा.</translation>
<translation id="2548326553472216322">अलीकडील शोध नाहीत</translation>
+<translation id="7263440858009898357">कृपया सूचीमधील आयटम निवडा.</translation>
+<translation id="5164977714490026579">मूल्य <ph name="MINIMUM"/> पेक्षा मोठे किंवा समान असावे.</translation>
<translation id="5944544982112848342">2048 (उच्च ग्रेड)</translation>
<translation id="3040011195152428237">दुवा</translation>
<translation id="2745343197843472802">प्लग-इन मिळवा</translation>
+<translation id="8451268428117625855">कृपया एखादी फाइल निवडा.</translation>
<translation id="5776402066334188252">कृपया आपण हे प्लग-इन स्थापित करण्यास इच्छुक असल्याची पुष्टी करा. आपण केवळ विश्वासार्ह असलेली प्लग-इन्स फक्त स्थापित करावीत.</translation>
-<translation id="4003986561708175844">आवश्यक असलेले प्लग-इन स्थापित नाही</translation>
<translation id="3018094406922859308">प्लग-इन डाउनलोड करीत आहे...</translation>
<translation id="7364796246159120393">फाइल निवडा</translation>
+<translation id="2761667185364618470">कृपया आपण पुढे चालू ठेवू इच्छित असल्यास हा बॉक्स पहा.</translation>
<translation id="8964020114565522021">फाइल येथे ड्रॅग करा</translation>
+<translation id="5129723458012748440">प्लग-इन <ph name="PLUGIN"/> स्थापित केले नाही.</translation>
<translation id="838869780401515933">तपासा</translation>
<translation id="2846343701378493991">1024 (मध्यम प्रत)</translation>
<translation id="5476505524087279545">अनचेक</translation>
<translation id="3789841737615482174">स्थापना करा</translation>
+<translation id="2507943997699731163">कृपया हे फील्ड भरा.</translation>
<translation id="5253117816378681419">कृपया आपल्याला प्लग-इन <ph name="PLUGIN"/> स्थापित करणे आवडत असल्याची पुष्टी करा. आपण आपला विश्वास असलेले प्लग-इन्स फक्त स्थापित करावे. </translation>
<translation id="6663448176199120256">अलीकडील शोध</translation>
+<translation id="7335060848622232389">प्लग-इन स्थापित करणे अक्षम केले गेले आहे.</translation>
<translation id="2597378329261239068">हा दस्तऐवज संकेतशब्द संरक्षित आहे. कृपया संकेतशब्द प्रविष्ट करा.</translation>
+<translation id="5466621249238537318">कृपया एक किंवा अधिक फायली निवडा.</translation>
+<translation id="8750798805984357768">कृपया या पर्यायांपैकी एक निवडा.</translation>
<translation id="7740050170769002709">HTML सामुग्री</translation>
+<translation id="2226276347425096477">कृपया हा मजकूर <ph name="MAX_CHARACTERS"/> वर्ण लहान किंवा कमी करा (आपण सध्या <ph name="CURRENT_LENGTH"/> वर्ण वापरत आहात).</translation>
+<translation id="1639239467298939599">लोड करीत आहे</translation>
+<translation id="2908441821576996758">कृपया ईमेल पत्त्यांची स्वल्पविरामाद्वारे विभक्त सूची प्रविष्ट करा.</translation>
<translation id="5939518447894949180">रीसेट करा</translation>
+<translation id="835897206747267392">अवैध मूल्य.</translation>
+<translation id="3851140433852960970">ही सामग्री प्रदर्शित करण्यासाठी कोणतेही प्लग-इन उपलब्ध नाही.</translation>
<translation id="1842960171412779397">निवडा</translation>
+<translation id="3450233048674729344">मूल्य <ph name="MAXIMUM"/> पेक्षा कमी किंवा समान असावे.</translation>
+<translation id="9198010615634362518">आवश्यक असलेले प्लग-इन स्थापित नाही.</translation>
<translation id="7638452146404718955">प्लग-इन डाउनलोड करण्यासाठी येथे क्लिक करा</translation>
<translation id="6119846243427417423">सक्रिय करा</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> फायली</translation>
-<translation id="4470547978413275879">प्लग-इन <ph name="PLUGIN"/> स्थापित केले नाही</translation>
-<translation id="6765711848403622008">ही सामग्री प्रदर्शित करण्यासाठी कोणतेही प्लग-इन उपलब्ध नाही</translation>
+<translation id="3934680773876859118">PDF दस्तऐवज लोड करणे अयशस्वी</translation>
<translation id="8597182159515967513">शीर्षलेख</translation>
<translation id="2653659639078652383">सबमिट करा</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> प्लग-इन आवश्यक ,,,</translation>
diff --git a/webkit/glue/resources/webkit_strings_nl.xtb b/webkit/glue/resources/webkit_strings_nl.xtb
index d3b90a2..f8c8b24 100644
--- a/webkit/glue/resources/webkit_strings_nl.xtb
+++ b/webkit/glue/resources/webkit_strings_nl.xtb
@@ -1,46 +1,63 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="nl">
-<translation id="4519964825805946997">Het installeren van de invoegtoepassing van <ph name="URL"/> is mislukt</translation>
+<translation id="4519964825805946997">Het installeren van de plugin van <ph name="URL"/> is mislukt</translation>
<translation id="9186171386827445984">Document wordt geladen: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> pagina's...</translation>
<translation id="1235745349614807883">Recente zoekopdrachten wissen</translation>
+<translation id="1171774979989969504">Geef een e-mailadres op.</translation>
+<translation id="709897737746224366">Zorg dat de indeling voldoet aan de gevraagde indeling.</translation>
<translation id="5048533449481078685">lijstmarkering</translation>
-<translation id="372362261556059955">Aanvullende invoegtoepassing vereist</translation>
+<translation id="372362261556059955">Aanvullende plugin vereist</translation>
<translation id="4202807286478387388">Gaan naar</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Annuleren</translation>
<translation id="795667975304826397">Geen bestand gekozen</translation>
-<translation id="1416462845279468967">De installatie van de invoegtoepassing is mislukt</translation>
+<translation id="1416462845279468967">De installatie van de plugin is mislukt</translation>
<translation id="8141602879876242471">Dit is een doorzoekbare index. Geef zoekwoorden op:</translation>
-<translation id="5650795167354946011">Klik hier na het installeren van de invoegtoepassing om te vernieuwen</translation>
+<translation id="5650795167354946011">Klik hier na het installeren van de plugin om te vernieuwen</translation>
<translation id="370665806235115550">Laden...</translation>
<translation id="6845533974506654842">Indrukken</translation>
<translation id="8244226242650769279">image map</translation>
+<translation id="310520048233152454">Geef een URL op.</translation>
<translation id="2548326553472216322">Geen recente zoekopdrachten</translation>
+<translation id="7263440858009898357">Selecteer een item in de lijst.</translation>
+<translation id="5164977714490026579">Waarde moet groter dan of gelijk zijn aan <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (hoog niveau)</translation>
<translation id="3040011195152428237">link</translation>
-<translation id="2745343197843472802">Invoegtoepassing downloaden</translation>
-<translation id="5776402066334188252">Bevestig dat u deze invoegtoepassing wilt installeren. U moet alleen invoegtoepassingen installeren die u vertrouwt.</translation>
-<translation id="4003986561708175844">De vereiste invoegtoepassing is niet geïnstalleerd</translation>
-<translation id="3018094406922859308">Invoegtoepassing downloaden...</translation>
+<translation id="2745343197843472802">Plugin downloaden</translation>
+<translation id="8451268428117625855">Selecteer een bestand.</translation>
+<translation id="5776402066334188252">Bevestig dat u deze plugins wilt installeren. U moet alleen plugins installeren die u vertrouwt.</translation>
+<translation id="3018094406922859308">Plugin downloaden...</translation>
<translation id="7364796246159120393">Bestand kiezen</translation>
+<translation id="2761667185364618470">Vink dit selectievakje aan als u wilt doorgaan.</translation>
<translation id="8964020114565522021">Sleep bestand hier naartoe</translation>
+<translation id="5129723458012748440">De plugin <ph name="PLUGIN"/> is niet geïnstalleerd.</translation>
<translation id="838869780401515933">Selecteren</translation>
<translation id="2846343701378493991">1024 (gemiddeld niveau)</translation>
<translation id="5476505524087279545">Deselecteren</translation>
<translation id="3789841737615482174">Installeren</translation>
-<translation id="5253117816378681419">Bevestig dat u de invoegtoepassing van <ph name="PLUGIN"/> wilt installeren. U moet alleen invoegtoepassingen installeren die u vertrouwt.</translation>
+<translation id="2507943997699731163">Vul dit veld in.</translation>
+<translation id="5253117816378681419">Bevestig dat u de plugins van <ph name="PLUGIN"/> wilt installeren. U moet alleen plugins installeren die u vertrouwt.</translation>
<translation id="6663448176199120256">Recente zoekopdrachten</translation>
+<translation id="7335060848622232389">Het installeren van plugins is uitgeschakeld.</translation>
<translation id="2597378329261239068">Dit document is beveiligd met een wachtwoord. Geef een wachtwoord op.</translation>
+<translation id="5466621249238537318">Selecteer een of meer bestanden.</translation>
+<translation id="8750798805984357768">Selecteer een van deze opties.</translation>
<translation id="7740050170769002709">HTML-inhoud</translation>
+<translation id="2226276347425096477">Kort deze tekst in tot <ph name="MAX_CHARACTERS"/> tekens of minder (u gebruikt momenteel <ph name="CURRENT_LENGTH"/> tekens).</translation>
+<translation id="1639239467298939599">Laden</translation>
+<translation id="2908441821576996758">Voer een door komma's gescheiden lijst met e-mailadressen in.</translation>
<translation id="5939518447894949180">Herstellen</translation>
+<translation id="835897206747267392">Ongeldige waarde.</translation>
+<translation id="3851140433852960970">Er is geen plugin beschikbaar om deze inhoud weer te geven.</translation>
<translation id="1842960171412779397">Selecteren</translation>
-<translation id="7638452146404718955">Klik hier om de invoegtoepassing te downloaden</translation>
+<translation id="3450233048674729344">Waarde moet kleiner dan of gelijk zijn aan <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">De vereiste plugin is niet geïnstalleerd.</translation>
+<translation id="7638452146404718955">Klik hier om de plugin te downloaden</translation>
<translation id="6119846243427417423">Activeren</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> bestanden</translation>
-<translation id="4470547978413275879">De invoegtoepassing <ph name="PLUGIN"/> is niet geïnstalleerd</translation>
-<translation id="6765711848403622008">Er is geen invoegtoepassing beschikbaar om deze inhoud weer te geven</translation>
+<translation id="3934680773876859118">PDF-document kan niet worden geladen</translation>
<translation id="8597182159515967513">kop</translation>
<translation id="2653659639078652383">Verzenden</translation>
-<translation id="8475551193147984329"><ph name="PLUGIN"/>-invoegtoepassing vereist</translation>
+<translation id="8475551193147984329"><ph name="PLUGIN"/>-plugin vereist</translation>
</translationbundle> \ No newline at end of file
diff --git a/webkit/glue/resources/webkit_strings_no.xtb b/webkit/glue/resources/webkit_strings_no.xtb
index 6346872..c3ed131 100644
--- a/webkit/glue/resources/webkit_strings_no.xtb
+++ b/webkit/glue/resources/webkit_strings_no.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Kunne ikke installere programtillegget fra <ph name="URL"/></translation>
<translation id="9186171386827445984">Laster inn dokument: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sider</translation>
<translation id="1235745349614807883">Fjern nylige søk</translation>
+<translation id="1171774979989969504">Skriv inn en e-postadresse.</translation>
+<translation id="709897737746224366">Sørg for samsvar med det forespurte formatet.</translation>
<translation id="5048533449481078685">listemarkør</translation>
<translation id="372362261556059955">Ekstra programtillegg kreves</translation>
<translation id="4202807286478387388">hopp</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Laster inn...</translation>
<translation id="6845533974506654842">trykk</translation>
<translation id="8244226242650769279">bildekart</translation>
+<translation id="310520048233152454">Skriv inn en nettadresse.</translation>
<translation id="2548326553472216322">Ingen nylige søk</translation>
+<translation id="7263440858009898357">Velg en artikkel i listen.</translation>
+<translation id="5164977714490026579">Verdien må være større enn eller lik <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (sterk)</translation>
<translation id="3040011195152428237">kobling</translation>
<translation id="2745343197843472802">Finn programtillegg</translation>
+<translation id="8451268428117625855">Velg en fil.</translation>
<translation id="5776402066334188252">Bekreft at du ønsker å installere programtillegget. Du bør kun installere programtillegg du stoler på.</translation>
-<translation id="4003986561708175844">Det nødvendige programmet er ikke installert</translation>
<translation id="3018094406922859308">Laster ned programtillegg</translation>
<translation id="7364796246159120393">Velg fil</translation>
+<translation id="2761667185364618470">Kryss av denne boksen hvis du vil fortsette.</translation>
<translation id="8964020114565522021">Dra filen hit</translation>
+<translation id="5129723458012748440">Programtillegget <ph name="PLUGIN"/> er ikke installert.</translation>
<translation id="838869780401515933">merk av</translation>
<translation id="2846343701378493991">1024 (middels)</translation>
<translation id="5476505524087279545">fjern merke</translation>
<translation id="3789841737615482174">Installer</translation>
+<translation id="2507943997699731163">Vennligst fyll ut dette feltet.</translation>
<translation id="5253117816378681419">Bekreft at du ønsker å installere programtillegget <ph name="PLUGIN"/>. Du bør kun installere programtillegg du stoler på.</translation>
<translation id="6663448176199120256">Nylige søk</translation>
+<translation id="7335060848622232389">Installering av programtillegg er deaktivert.</translation>
<translation id="2597378329261239068">Dette dokumentet er passordbeskyttet. Skriv inn et passord.</translation>
+<translation id="5466621249238537318">Velg én eller flere filer.</translation>
+<translation id="8750798805984357768">Velg ett av følgende alternativer.</translation>
<translation id="7740050170769002709">HTML-innhold</translation>
+<translation id="2226276347425096477">Forkort denne teksten til <ph name="MAX_CHARACTERS"/> tegn eller færre (for øyeblikket bruker du <ph name="CURRENT_LENGTH"/> tegn).</translation>
+<translation id="1639239467298939599">Laster inn</translation>
+<translation id="2908441821576996758">Skriv inn en liste over e-postadresser atskilt med komma.</translation>
<translation id="5939518447894949180">Tilbakestill</translation>
+<translation id="835897206747267392">Ugyldig verdi</translation>
+<translation id="3851140433852960970">Ingen programtillegg er tilgjengelige for å vise dette innholdet.</translation>
<translation id="1842960171412779397">velg</translation>
+<translation id="3450233048674729344">Verdien må være mindre enn eller lik <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Det nødvendige programtillegget er ikke installert.</translation>
<translation id="7638452146404718955">Klikk her for å laste ned programtillegget</translation>
<translation id="6119846243427417423">aktiver</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> filer</translation>
-<translation id="4470547978413275879">Programtillegget <ph name="PLUGIN"/> er ikke installert</translation>
-<translation id="6765711848403622008">Ingen programtillegg tilgjengelig for å vise dette innholdet</translation>
+<translation id="3934680773876859118">Kan ikke laste inn PDF-dokument</translation>
<translation id="8597182159515967513">overskrift</translation>
<translation id="2653659639078652383">Send</translation>
<translation id="8475551193147984329">Programtillegg <ph name="PLUGIN"/> påkrevd</translation>
diff --git a/webkit/glue/resources/webkit_strings_pl.xtb b/webkit/glue/resources/webkit_strings_pl.xtb
index b37ec7e..67b1fd3 100644
--- a/webkit/glue/resources/webkit_strings_pl.xtb
+++ b/webkit/glue/resources/webkit_strings_pl.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Nie można zainstalować wtyczki dostępnej pod adresem <ph name="URL"/></translation>
<translation id="9186171386827445984">Wczytywanie dokumentu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stron...</translation>
<translation id="1235745349614807883">Wyczyść ostatnie wyszukiwania</translation>
+<translation id="1171774979989969504">Wprowadź adres e-mail.</translation>
+<translation id="709897737746224366">Podaj wartość w wymaganym formacie.</translation>
<translation id="5048533449481078685">znacznik listy</translation>
<translation id="372362261556059955">Potrzebna jest dodatkowa wtyczka</translation>
<translation id="4202807286478387388">przejdź</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Ładowanie...</translation>
<translation id="6845533974506654842">naciśnij</translation>
<translation id="8244226242650769279">mapa grafiki</translation>
+<translation id="310520048233152454">Wprowadź adres URL.</translation>
<translation id="2548326553472216322">Brak ostatnich wyszukiwań</translation>
+<translation id="7263440858009898357">Wybierz element z listy.</translation>
+<translation id="5164977714490026579">Wartość nie może być mniejsza niż <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (wysoki poziom)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Pobierz wtyczkę</translation>
+<translation id="8451268428117625855">Wybierz plik.</translation>
<translation id="5776402066334188252">Potwierdź zamiar zainstalowania tej wtyczki. Należy instalować wyłącznie zaufane wtyczki.</translation>
-<translation id="4003986561708175844">Wymagana wtyczka nie jest zainstalowana</translation>
<translation id="3018094406922859308">Trwa pobieranie wtyczki...</translation>
<translation id="7364796246159120393">Wybierz plik</translation>
+<translation id="2761667185364618470">Zaznacz to pole, jeśli chcesz kontynuować.</translation>
<translation id="8964020114565522021">Przeciągnij plik tutaj</translation>
+<translation id="5129723458012748440">Wtyczka <ph name="PLUGIN"/> nie jest zainstalowana.</translation>
<translation id="838869780401515933">zaznacz</translation>
<translation id="2846343701378493991">1024 (średni poziom)</translation>
<translation id="5476505524087279545">odznacz</translation>
<translation id="3789841737615482174">Zainstaluj</translation>
+<translation id="2507943997699731163">Wypełnij to pole.</translation>
<translation id="5253117816378681419">Potwierdź zamiar zainstalowania wtyczki <ph name="PLUGIN"/>. Należy instalować wyłącznie zaufane wtyczki.</translation>
<translation id="6663448176199120256">Ostatnie wyszukiwania</translation>
+<translation id="7335060848622232389">Funkcja instalowania wtyczek została wyłączona.</translation>
<translation id="2597378329261239068">Ten dokument jest chroniony hasłem. Wprowadź hasło.</translation>
+<translation id="5466621249238537318">Wybierz jeden lub kilka plików.</translation>
+<translation id="8750798805984357768">Wybierz jedną z opcji.</translation>
<translation id="7740050170769002709">Treść HTML</translation>
+<translation id="2226276347425096477">Skróć ten tekst do maksymalnie <ph name="MAX_CHARACTERS"/> znaków (w tej chwili korzystasz z <ph name="CURRENT_LENGTH"/> znaków).</translation>
+<translation id="1639239467298939599">Wczytywanie</translation>
+<translation id="2908441821576996758">Podaj listę adresów e-mail rozdzielonych przecinkami.</translation>
<translation id="5939518447894949180">Resetuj</translation>
+<translation id="835897206747267392">Nieprawidłowa wartość.</translation>
+<translation id="3851140433852960970">Brak dostępnej wtyczki umożliwiającej wyświetlenie tej treści.</translation>
<translation id="1842960171412779397">wybierz</translation>
+<translation id="3450233048674729344">Wartość nie może być większa niż <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Wymagana wtyczka nie jest zainstalowana.</translation>
<translation id="7638452146404718955">Kliknij tutaj, aby pobrać wtyczkę</translation>
<translation id="6119846243427417423">aktywuj</translation>
<translation id="8444882422881193423">Liczba plików: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Wtyczka <ph name="PLUGIN"/> nie jest zainstalowana</translation>
-<translation id="6765711848403622008">Brak dostępnej wtyczki umożliwiającej wyświetlenie tej treści</translation>
+<translation id="3934680773876859118">Nie można wczytać dokumentu PDF</translation>
<translation id="8597182159515967513">nagłówek</translation>
<translation id="2653659639078652383">Prześlij</translation>
<translation id="8475551193147984329">Potrzebna jest wtyczka <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_pt-BR.xtb b/webkit/glue/resources/webkit_strings_pt-BR.xtb
index 5233854..7de59fb 100644
--- a/webkit/glue/resources/webkit_strings_pt-BR.xtb
+++ b/webkit/glue/resources/webkit_strings_pt-BR.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Falha ao instalar o plug-in de <ph name="URL"/></translation>
<translation id="9186171386827445984">Carregando documento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> páginas...</translation>
<translation id="1235745349614807883">Limpar pesquisas recentes</translation>
+<translation id="1171774979989969504">Insira um endereço de e-mail.</translation>
+<translation id="709897737746224366">É preciso que o formato corresponda ao exigido.</translation>
<translation id="5048533449481078685">marcador de lista</translation>
<translation id="372362261556059955">Plug-in adicional necessário</translation>
<translation id="4202807286478387388">pular</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Carregando...</translation>
<translation id="6845533974506654842">pressione</translation>
<translation id="8244226242650769279">mapa de imagens</translation>
+<translation id="310520048233152454">Insira um URL.</translation>
<translation id="2548326553472216322">Nenhuma pesquisa recente</translation>
+<translation id="7263440858009898357">Selecione um item da lista.</translation>
+<translation id="5164977714490026579">O valor deve ser maior ou igual a <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Nível alto)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Obter plug-in</translation>
+<translation id="8451268428117625855">Selecione um arquivo.</translation>
<translation id="5776402066334188252">Confirme se você deseja instalar este plug-in. Você deve instalar apenas plug-ins em que confia.</translation>
-<translation id="4003986561708175844">O plug-in necessário não está instalado</translation>
<translation id="3018094406922859308">Fazendo download do plug-in...</translation>
<translation id="7364796246159120393">Escolher arquivo</translation>
+<translation id="2761667185364618470">Marque esta caixa se deseja continuar.</translation>
<translation id="8964020114565522021">Arraste o arquivo até aquil</translation>
+<translation id="5129723458012748440">O plug-in <ph name="PLUGIN"/> não está instalado.</translation>
<translation id="838869780401515933">marcar</translation>
<translation id="2846343701378493991">1024 (Nível médio)</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="3789841737615482174">Instalar</translation>
+<translation id="2507943997699731163">Preencha este campo.</translation>
<translation id="5253117816378681419">Confirme se você deseja instalar o plug-in do <ph name="PLUGIN"/>. Você deve instalar apenas plug-ins em que você confia.</translation>
<translation id="6663448176199120256">Pesquisas recentes</translation>
+<translation id="7335060848622232389">A instalação de plug-ins foi desativada.</translation>
<translation id="2597378329261239068">Este documento está protegido por senha. Digite a senha.</translation>
+<translation id="5466621249238537318">Selecione um ou mais arquivos.</translation>
+<translation id="8750798805984357768">Selecione uma das opções.</translation>
<translation id="7740050170769002709">Conteúdo HTML</translation>
+<translation id="2226276347425096477">Reduza este texto para <ph name="MAX_CHARACTERS"/> caracteres ou menos (você está usando <ph name="CURRENT_LENGTH"/> caracteres).</translation>
+<translation id="1639239467298939599">Carregando</translation>
+<translation id="2908441821576996758">Insira uma lista de endereços de e-mail separados por vírgula.</translation>
<translation id="5939518447894949180">Redefinir</translation>
+<translation id="835897206747267392">Valor inválido.</translation>
+<translation id="3851140433852960970">Não há plug-ins disponíveis para exibir este conteúdo.</translation>
<translation id="1842960171412779397">selecione</translation>
+<translation id="3450233048674729344">O valor deve ser menor ou igual a <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">O plug-in exigido não está instalado.</translation>
<translation id="7638452146404718955">Clique aqui para fazer download do plug-in</translation>
<translation id="6119846243427417423">ativar</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> arquivos</translation>
-<translation id="4470547978413275879">O plug-in do <ph name="PLUGIN"/> não está instalado</translation>
-<translation id="6765711848403622008">Nenhum plug-in disponível para exibir este conteúdo</translation>
+<translation id="3934680773876859118">Falha ao carregar o documento PDF</translation>
<translation id="8597182159515967513">cabeçalho</translation>
<translation id="2653659639078652383">Enviar</translation>
<translation id="8475551193147984329">Plug-in do <ph name="PLUGIN"/> necessário</translation>
diff --git a/webkit/glue/resources/webkit_strings_pt-PT.xtb b/webkit/glue/resources/webkit_strings_pt-PT.xtb
index a93bd4f..e5da548 100644
--- a/webkit/glue/resources/webkit_strings_pt-PT.xtb
+++ b/webkit/glue/resources/webkit_strings_pt-PT.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Falha ao instalar o plug-in de <ph name="URL"/></translation>
<translation id="9186171386827445984">A carregar o documento: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> páginas...</translation>
<translation id="1235745349614807883">Limpar pesquisas recentes</translation>
+<translation id="1171774979989969504">Introduza um endereço de e-mail.</translation>
+<translation id="709897737746224366">Faça corresponder o formato pedido.</translation>
<translation id="5048533449481078685">marcador de lista</translation>
<translation id="372362261556059955">Plug-in adicional requerido</translation>
<translation id="4202807286478387388">ir para</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">A carregar...</translation>
<translation id="6845533974506654842">premir</translation>
<translation id="8244226242650769279">mapa de imagem</translation>
+<translation id="310520048233152454">Introduza um URL.</translation>
<translation id="2548326553472216322">Nenhuma pesquisa recente</translation>
+<translation id="7263440858009898357">Seleccione um item na lista.</translation>
+<translation id="5164977714490026579">O valor tem de ser superior ou igual a <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Tamanho grande)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Obter plug-in</translation>
+<translation id="8451268428117625855">Seleccione um ficheiro.</translation>
<translation id="5776402066334188252">Confirme se pretende instalar este plug-in. Deve instalar apenas plug-ins fidedignos.</translation>
-<translation id="4003986561708175844">O plug-in necessário não está instalado</translation>
<translation id="3018094406922859308">A transferir plug-in...</translation>
<translation id="7364796246159120393">Escolher ficheiro</translation>
+<translation id="2761667185364618470">Seleccione esta caixa se pretender continuar.</translation>
<translation id="8964020114565522021">Arraste o ficheiro para aqui</translation>
+<translation id="5129723458012748440">O plug-in <ph name="PLUGIN"/> não está instalado.</translation>
<translation id="838869780401515933">verificar</translation>
<translation id="2846343701378493991">1024 (Tamanho médio)</translation>
<translation id="5476505524087279545">desmarcar</translation>
<translation id="3789841737615482174">Instalar</translation>
+<translation id="2507943997699731163">Preencha este campo.</translation>
<translation id="5253117816378681419">Confirme se pretende instalar o plug-in do <ph name="PLUGIN"/>. Deve instalar apenas plug-ins fidedignos.</translation>
<translation id="6663448176199120256">Pesquisas recentes</translation>
+<translation id="7335060848622232389">A instalação de plug-ins foi desativada.</translation>
<translation id="2597378329261239068">Este documento está protegido por palavra-passe. Introduza uma palavra-passe.</translation>
+<translation id="5466621249238537318">Seleccione um ou mais ficheiros.</translation>
+<translation id="8750798805984357768">Seleccione uma destas opções.</translation>
<translation id="7740050170769002709">Conteúdo HTML</translation>
+<translation id="2226276347425096477">Encurte este texto para <ph name="MAX_CHARACTERS"/> caracteres ou menos (está actualmente a utilizar <ph name="CURRENT_LENGTH"/> caracteres).</translation>
+<translation id="1639239467298939599">A carregar</translation>
+<translation id="2908441821576996758">Introduza uma lista de endereços de e-mail separados por vírgula.</translation>
<translation id="5939518447894949180">Repor</translation>
+<translation id="835897206747267392">Valor inválido.</translation>
+<translation id="3851140433852960970">Não está disponível nenhum plug-in para apresentar este conteúdo.</translation>
<translation id="1842960171412779397">seleccionar</translation>
+<translation id="3450233048674729344">O valor tem de ser inferior ou igual a <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">O plug-in necessário não está instalado.</translation>
<translation id="7638452146404718955">Clique aqui para transferir o plug-in</translation>
<translation id="6119846243427417423">activar</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ficheiros</translation>
-<translation id="4470547978413275879">O plug-in do <ph name="PLUGIN"/> não está instalado</translation>
-<translation id="6765711848403622008">Nenhum plug-in disponível para apresentar este conteúdo</translation>
+<translation id="3934680773876859118">Falha ao carregar o documento em PDF</translation>
<translation id="8597182159515967513">cabeçalho</translation>
<translation id="2653659639078652383">Submeter</translation>
<translation id="8475551193147984329">Plug-in do <ph name="PLUGIN"/> necessário</translation>
diff --git a/webkit/glue/resources/webkit_strings_ro.xtb b/webkit/glue/resources/webkit_strings_ro.xtb
index eeebfc3..5c630d9 100644
--- a/webkit/glue/resources/webkit_strings_ro.xtb
+++ b/webkit/glue/resources/webkit_strings_ro.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Instalarea pluginului de la <ph name="URL"/> a eșuat</translation>
<translation id="9186171386827445984">Se încarcă documentul: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> (de) pagini...</translation>
<translation id="1235745349614807883">Ștergeți căutările recente</translation>
+<translation id="1171774979989969504">Introduceţi o adresă de e-mail.</translation>
+<translation id="709897737746224366">Potriviţi cu formatul solicitat.</translation>
<translation id="5048533449481078685">marcator listă</translation>
<translation id="372362261556059955">Este necesar un plugin suplimentar</translation>
<translation id="4202807286478387388">Salt</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Se încarcă...</translation>
<translation id="6845533974506654842">Apăsați</translation>
<translation id="8244226242650769279">hartă cu imagini</translation>
+<translation id="310520048233152454">Introduceţi o adresă URL.</translation>
<translation id="2548326553472216322">Nicio căutare recentă</translation>
+<translation id="7263440858009898357">Selectaţi un articol din listă.</translation>
+<translation id="5164977714490026579">Valoarea trebuie să fie mai mare sau egală cu <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Grad înalt)</translation>
<translation id="3040011195152428237">link</translation>
<translation id="2745343197843472802">Descărcați pluginul</translation>
+<translation id="8451268428117625855">Selectaţi un fişier.</translation>
<translation id="5776402066334188252">Confirmați că doriți să instalați acest plugin. Vă recomandăm să instalați numai pluginuri în care aveți încredere.</translation>
-<translation id="4003986561708175844">Pluginul necesar nu este instalat</translation>
<translation id="3018094406922859308">Se descarcă pluginul...</translation>
<translation id="7364796246159120393">Alegeți fișierul</translation>
+<translation id="2761667185364618470">Bifaţi caseta dacă doriţi să continuaţi.</translation>
<translation id="8964020114565522021">Trageți fișierul aici</translation>
+<translation id="5129723458012748440">Pluginul <ph name="PLUGIN"/> nu este instalat.</translation>
<translation id="838869780401515933">Bifați</translation>
<translation id="2846343701378493991">1024 (Grad mediu)</translation>
<translation id="5476505524087279545">Debifați</translation>
<translation id="3789841737615482174">Instalați</translation>
+<translation id="2507943997699731163">Completaţi acest câmp.</translation>
<translation id="5253117816378681419">Confirmați că doriți să instalați pluginul <ph name="PLUGIN"/>. Vă recomandăm să instalați numai pluginuri în care aveți încredere.</translation>
<translation id="6663448176199120256">Căutări recente</translation>
+<translation id="7335060848622232389">Instalarea pluginurilor a fost dezactivată.</translation>
<translation id="2597378329261239068">Acest document este protejat cu parolă. Introduceți o parolă.</translation>
+<translation id="5466621249238537318">Selectaţi unul sau mai multe fişiere.</translation>
+<translation id="8750798805984357768">Selectaţi una dintre aceste opţiuni.</translation>
<translation id="7740050170769002709">Conținut HTML</translation>
+<translation id="2226276347425096477">Micşoraţi acest text la cel mult <ph name="MAX_CHARACTERS"/> (de) caractere (în prezent utilizaţi <ph name="CURRENT_LENGTH"/> (de) caractere).</translation>
+<translation id="1639239467298939599">Se încarcă</translation>
+<translation id="2908441821576996758">Introduceţi o listă de adrese de e-mail separate prin virgulă.</translation>
<translation id="5939518447894949180">Resetați</translation>
+<translation id="835897206747267392">Valoare nevalidă.</translation>
+<translation id="3851140433852960970">Niciun plugin disponibil pentru a afişa acest conținut.</translation>
<translation id="1842960171412779397">Selectați</translation>
+<translation id="3450233048674729344">Valoarea trebuie să fie mai mică sau egală cu <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Pluginul necesar nu este instalat.</translation>
<translation id="7638452146404718955">Faceți clic aici pentru a descărca pluginul</translation>
<translation id="6119846243427417423">Activați</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> fișiere</translation>
-<translation id="4470547978413275879">Pluginul <ph name="PLUGIN"/> nu este instalat</translation>
-<translation id="6765711848403622008">Niciun plugin disponibil pentru a afișa acest conținut</translation>
+<translation id="3934680773876859118">Încărcarea documentului PDF nu a reuşit</translation>
<translation id="8597182159515967513">titlu</translation>
<translation id="2653659639078652383">Trimiteți</translation>
<translation id="8475551193147984329">Este necesar pluginul <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_ru.xtb b/webkit/glue/resources/webkit_strings_ru.xtb
index 5ea9049..f057f4d 100644
--- a/webkit/glue/resources/webkit_strings_ru.xtb
+++ b/webkit/glue/resources/webkit_strings_ru.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Не удалось установить подключаемый модуль с адреса <ph name="URL"/></translation>
<translation id="9186171386827445984">Загрузка документа: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> стр.</translation>
<translation id="1235745349614807883">Очистить недавние поиски</translation>
+<translation id="1171774979989969504">Введите адрес электронной почты.</translation>
+<translation id="709897737746224366">Введите данные в указанном формате.</translation>
<translation id="5048533449481078685">маркер списка</translation>
<translation id="372362261556059955">Необходим дополнительный подключаемый модуль</translation>
<translation id="4202807286478387388">перейти</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Загрузка...</translation>
<translation id="6845533974506654842">нажать</translation>
<translation id="8244226242650769279">графическая карта</translation>
+<translation id="310520048233152454">Введите URL.</translation>
<translation id="2548326553472216322">Нет недавних поисков</translation>
+<translation id="7263440858009898357">Выберите один из пунктов списка.</translation>
+<translation id="5164977714490026579">Значение должно быть больше или равно <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Крупный размер)</translation>
<translation id="3040011195152428237">ссылка</translation>
<translation id="2745343197843472802">Загрузить подключаемый модуль</translation>
+<translation id="8451268428117625855">Выберите файл.</translation>
<translation id="5776402066334188252">Подтвердите, что вы хотите установить этот подключаемый модуль. Вы доверяете ему?</translation>
-<translation id="4003986561708175844">Не установлен необходимый подключаемый модуль</translation>
<translation id="3018094406922859308">Загрузка подключаемого модуля...</translation>
<translation id="7364796246159120393">Выберите файл</translation>
+<translation id="2761667185364618470">Чтобы продолжить, установите этот флажок.</translation>
<translation id="8964020114565522021">Перетащите файл сюда</translation>
+<translation id="5129723458012748440">Подключаемый модуль <ph name="PLUGIN"/> не установлен.</translation>
<translation id="838869780401515933">поставить галочку</translation>
<translation id="2846343701378493991">1024 (Средний размер)</translation>
<translation id="5476505524087279545">снять галочку</translation>
<translation id="3789841737615482174">Установить</translation>
+<translation id="2507943997699731163">Заполните это поле.</translation>
<translation id="5253117816378681419">Подтвердите, что вы хотите установить подключаемый модуль <ph name="PLUGIN"/>. Вы доверяете ему?</translation>
<translation id="6663448176199120256">Недавние поиски</translation>
+<translation id="7335060848622232389">Установка подключаемых модулей запрещена.</translation>
<translation id="2597378329261239068">Документ защищен паролем. Введите пароль.</translation>
+<translation id="5466621249238537318">Выберите один или несколько файлов.</translation>
+<translation id="8750798805984357768">Выберите один из вариантов.</translation>
<translation id="7740050170769002709">HTML-содержание</translation>
+<translation id="2226276347425096477">Длина текста не должна превышать <ph name="MAX_CHARACTERS"/> симв. (сейчас <ph name="CURRENT_LENGTH"/> симв.).</translation>
+<translation id="1639239467298939599">Загрузка</translation>
+<translation id="2908441821576996758">Введите адреса электронной почты через запятую.</translation>
<translation id="5939518447894949180">Изменить</translation>
+<translation id="835897206747267392">Недопустимые данные.</translation>
+<translation id="3851140433852960970">Недоступен подключаемый модуль для отображения этого содержания.</translation>
<translation id="1842960171412779397">выбрать</translation>
+<translation id="3450233048674729344">Значение должно быть меньше или равно <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Не установлен необходимый подключаемый модуль.</translation>
<translation id="7638452146404718955">Нажмите здесь, чтобы загрузить подключаемый модуль</translation>
<translation id="6119846243427417423">активировать</translation>
<translation id="8444882422881193423">Число файлов: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Подключаемый модуль <ph name="PLUGIN"/> не установлен</translation>
-<translation id="6765711848403622008">Недоступен подключаемый модуль для отображения этого содержания</translation>
+<translation id="3934680773876859118">Не удалось загрузить документ PDF</translation>
<translation id="8597182159515967513">заголовок</translation>
<translation id="2653659639078652383">Отправить</translation>
<translation id="8475551193147984329">Необходим подключаемый модуль <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_sk.xtb b/webkit/glue/resources/webkit_strings_sk.xtb
index a9b37ba..807a6e6 100644
--- a/webkit/glue/resources/webkit_strings_sk.xtb
+++ b/webkit/glue/resources/webkit_strings_sk.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Inštalácia doplnku z adresy <ph name="URL"/> zlyhala</translation>
<translation id="9186171386827445984">Prebieha načítavanie dokumentu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> stránok...</translation>
<translation id="1235745349614807883">Vyčistiť posledné vyhľadávania</translation>
+<translation id="1171774979989969504">Zadajte e-mailovú adresu.</translation>
+<translation id="709897737746224366">Zadajte hodnotu zodpovedajúcu požadovanému formátu.</translation>
<translation id="5048533449481078685">ukazovateľ v zozname</translation>
<translation id="372362261556059955">Vyžaduje sa ďalší doplnok</translation>
<translation id="4202807286478387388">skok</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Načítava sa...</translation>
<translation id="6845533974506654842">stlačiť</translation>
<translation id="8244226242650769279">mapa obrázka</translation>
+<translation id="310520048233152454">Zadajte adresu URL.</translation>
<translation id="2548326553472216322">Žiadne posledné vyhľadávania</translation>
+<translation id="7263440858009898357">Vyberte položku zo zoznamu.</translation>
+<translation id="5164977714490026579">Hodnota musí byť väčšia alebo rovná hodnote <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (vysoký stupeň)</translation>
<translation id="3040011195152428237">odkaz</translation>
<translation id="2745343197843472802">Získať doplnok</translation>
+<translation id="8451268428117625855">Vyberte súbor.</translation>
<translation id="5776402066334188252">Potvrďte, že chcete nainštalovať tento doplnok. Mali by ste inštalovať len doplnky, ktorým dôverujete.</translation>
-<translation id="4003986561708175844">Vyžadovaný doplnok nie je nainštalovaný</translation>
<translation id="3018094406922859308">Prebieha preberanie doplnku...</translation>
<translation id="7364796246159120393">Vybrať súbor</translation>
+<translation id="2761667185364618470">Ak chcete pokračovať, začiarknite toto políčko.</translation>
<translation id="8964020114565522021">Súbor presunúť sem</translation>
+<translation id="5129723458012748440">Nie je nainštalovaný doplnok <ph name="PLUGIN"/>.</translation>
<translation id="838869780401515933">označiť</translation>
<translation id="2846343701378493991">1024 (stredný stupeň)</translation>
<translation id="5476505524087279545">zrušiť označenie</translation>
<translation id="3789841737615482174">Inštalovať</translation>
+<translation id="2507943997699731163">Vyplňte toto pole.</translation>
<translation id="5253117816378681419">Potvrďte, že chcete nainštalovať doplnok <ph name="PLUGIN"/>. Mali by ste inštalovať len doplnky, ktorým dôverujete.</translation>
<translation id="6663448176199120256">Posledné vyhľadávania</translation>
+<translation id="7335060848622232389">Inštalovanie doplnkov bolo zakázané.</translation>
<translation id="2597378329261239068">Tento dokument je chránený heslom. Zadajte heslo.</translation>
+<translation id="5466621249238537318">Vyberte jeden alebo viac súborov.</translation>
+<translation id="8750798805984357768">Vyberte jednu z týchto možností.</translation>
<translation id="7740050170769002709">Obsah HTML</translation>
+<translation id="2226276347425096477">Tento text musíte skrátiť na <ph name="MAX_CHARACTERS"/> znakov alebo menej (súčasný počet znakov: <ph name="CURRENT_LENGTH"/>).</translation>
+<translation id="1639239467298939599">Prebieha načítavanie</translation>
+<translation id="2908441821576996758">Zadajte zoznam e-mailových adries oddelených čiarkou.</translation>
<translation id="5939518447894949180">Vynulovať</translation>
+<translation id="835897206747267392">Neplatná hodnota.</translation>
+<translation id="3851140433852960970">Na zobrazenie tohto obsahu nie je k dispozícii žiadny doplnok.</translation>
<translation id="1842960171412779397">vybrať</translation>
+<translation id="3450233048674729344">Hodnota musí byť menšia alebo rovná hodnote <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Požadovaný doplnok nie je nainštalovaný.</translation>
<translation id="7638452146404718955">Kliknutím sem prevezmete doplnok</translation>
<translation id="6119846243427417423">aktivovať</translation>
<translation id="8444882422881193423">Počet súborov: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Nie je nainštalovaný doplnok <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">Na zobrazenie tohto obsahu nie je k dispozícii žiadny doplnok</translation>
+<translation id="3934680773876859118">Načítanie dokumentu PDF zlyhalo</translation>
<translation id="8597182159515967513">nadpis</translation>
<translation id="2653659639078652383">Odoslať</translation>
<translation id="8475551193147984329">Vyžaduje sa doplnok <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_sl.xtb b/webkit/glue/resources/webkit_strings_sl.xtb
index e3b1061..d982de5 100644
--- a/webkit/glue/resources/webkit_strings_sl.xtb
+++ b/webkit/glue/resources/webkit_strings_sl.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Namestitev vtičnika z naslova <ph name="URL"/> ni bila uspešna</translation>
<translation id="9186171386827445984">Nalaganje dokumenta: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> strani ...</translation>
<translation id="1235745349614807883">Počisti zadnja iskanja</translation>
+<translation id="1171774979989969504">Vnesite e-poštni naslov</translation>
+<translation id="709897737746224366">Poskrbite za ujemanje z zahtevano obliko.</translation>
<translation id="5048533449481078685">označevalnik seznama</translation>
<translation id="372362261556059955">Potreben je dodaten vtičnik</translation>
<translation id="4202807286478387388">skoči</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Nalagam ...</translation>
<translation id="6845533974506654842">pritisni</translation>
<translation id="8244226242650769279">slikovni zemljevid</translation>
+<translation id="310520048233152454">Vnesite URL.</translation>
<translation id="2548326553472216322">Ni zadnjih iskanj</translation>
+<translation id="7263440858009898357">Izberite element s seznama.</translation>
+<translation id="5164977714490026579">Vrednost mora biti večja od <ph name="MINIMUM"/> ali enaka.</translation>
<translation id="5944544982112848342">2048 (visoka stopnja)</translation>
<translation id="3040011195152428237">povezava</translation>
<translation id="2745343197843472802">Prenesite vtičnik</translation>
+<translation id="8451268428117625855">Izberite datoteko.</translation>
<translation id="5776402066334188252">Potrdite, da želite namestiti ta vtičnik. Nameščajte le vtičnike, ki jim zaupate.</translation>
-<translation id="4003986561708175844">Zahtevani vtičnik ni nameščen</translation>
<translation id="3018094406922859308">Prenašanje vtičnika ...</translation>
<translation id="7364796246159120393">Izberi datoteko</translation>
+<translation id="2761667185364618470">Potrdite to polje, če želite nadaljevati.</translation>
<translation id="8964020114565522021">Datoteko povleci sem</translation>
+<translation id="5129723458012748440">Vtičnik <ph name="PLUGIN"/> ni nameščen.</translation>
<translation id="838869780401515933">potrdi</translation>
<translation id="2846343701378493991">1024 (srednja stopnja)</translation>
<translation id="5476505524087279545">počisti izbor</translation>
<translation id="3789841737615482174">Namesti</translation>
+<translation id="2507943997699731163">Izpolnite to polje</translation>
<translation id="5253117816378681419">Potrdite, da želite namestiti ta <ph name="PLUGIN"/> vtičnik. Nameščajte le vtičnike, ki jim zaupate.</translation>
<translation id="6663448176199120256">Zadnja iskanja</translation>
+<translation id="7335060848622232389">Namestitev vtičnikov je bila onemogočena.</translation>
<translation id="2597378329261239068">Dokument je zaščiten z geslom. Vnesite geslo.</translation>
+<translation id="5466621249238537318">Izberite eno ali več datotek.</translation>
+<translation id="8750798805984357768">Izberite eno od teh možnosti.</translation>
<translation id="7740050170769002709">Vsebina HTML</translation>
+<translation id="2226276347425096477">Skrajšajte to besedilo na <ph name="MAX_CHARACTERS"/> znakov ali manj (trenutno uporabljate <ph name="CURRENT_LENGTH"/> znakov).</translation>
+<translation id="1639239467298939599">Nalaganje</translation>
+<translation id="2908441821576996758">Vnesite seznam e-poštnih naslovov, ločenih z vejicami</translation>
<translation id="5939518447894949180">Ponastavi</translation>
+<translation id="835897206747267392">Neveljavna vrednost.</translation>
+<translation id="3851140433852960970">Vtičnika za prikaz te vsebine ni na voljo.</translation>
<translation id="1842960171412779397">izberi</translation>
+<translation id="3450233048674729344">Vrednost mora biti manjša od <ph name="MAXIMUM"/> ali enaka.</translation>
+<translation id="9198010615634362518">Vtičnik, ki je potreben, ni nameščen.</translation>
<translation id="7638452146404718955">Če želite prenesti vtičnik, kliknite tukaj</translation>
<translation id="6119846243427417423">aktiviraj</translation>
<translation id="8444882422881193423">Število datotek: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Vtičnik <ph name="PLUGIN"/> ni nameščen</translation>
-<translation id="6765711848403622008">Za prikaz te vsebine ni na voljo noben vtičnik</translation>
+<translation id="3934680773876859118">Dokumenta PDF ni bilo mogoče naložiti</translation>
<translation id="8597182159515967513">naslov</translation>
<translation id="2653659639078652383">Pošlji</translation>
<translation id="8475551193147984329">Potreben je vtičnik <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_sr.xtb b/webkit/glue/resources/webkit_strings_sr.xtb
index 3b32e4d..994d4e0 100644
--- a/webkit/glue/resources/webkit_strings_sr.xtb
+++ b/webkit/glue/resources/webkit_strings_sr.xtb
@@ -1,46 +1,63 @@
<?xml version="1.0" ?>
<!DOCTYPE translationbundle>
<translationbundle lang="sr">
-<translation id="4519964825805946997">Инсталирање додатка са адресе <ph name="URL"/> није успело</translation>
+<translation id="4519964825805946997">Инсталирање додатне компоненте са <ph name="URL"/> није успело</translation>
<translation id="9186171386827445984">Учитавање документа: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> странице(а)...</translation>
<translation id="1235745349614807883">Обриши недавне претраге</translation>
+<translation id="1171774979989969504">Унесите адресу е-поште.</translation>
+<translation id="709897737746224366">Изаберите захтевани формат.</translation>
<translation id="5048533449481078685">означивач листе</translation>
-<translation id="372362261556059955">Потребан је још један додатак</translation>
+<translation id="372362261556059955">Потребна је још једна додатна компонента</translation>
<translation id="4202807286478387388">прескочи</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
<translation id="7658239707568436148">Откажи</translation>
<translation id="795667975304826397">Није одабрано</translation>
-<translation id="1416462845279468967">Инсталација додатка није успела</translation>
+<translation id="1416462845279468967">Инсталација додатне компоненте није успела</translation>
<translation id="8141602879876242471">Ово је индекс који може да се претражује. Унесите кључне речи за претрагу:</translation>
-<translation id="5650795167354946011">Након инсталирања додатка, кликните овде да бисте освежили</translation>
+<translation id="5650795167354946011">Након инсталирања додатне компоненте, кликните овде да бисте освежили</translation>
<translation id="370665806235115550">Учитавање...</translation>
<translation id="6845533974506654842">притисни</translation>
<translation id="8244226242650769279">мапа слике</translation>
+<translation id="310520048233152454">Унесите URL адресу.</translation>
<translation id="2548326553472216322">Нема недавних претрага</translation>
+<translation id="7263440858009898357">Изаберите ставку са листе.</translation>
+<translation id="5164977714490026579">Вредност сме да буде најмање <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (високи степен)</translation>
<translation id="3040011195152428237">веза</translation>
-<translation id="2745343197843472802">Преузми додатак</translation>
-<translation id="5776402066334188252">Потврдите да желите да инсталирате овај додатак. Инсталирајте само додатке у које имате поверења.</translation>
-<translation id="4003986561708175844">Потребан додатак није инсталиран</translation>
-<translation id="3018094406922859308">Преузимање додатка...</translation>
+<translation id="2745343197843472802">Преузми додатну компоненту</translation>
+<translation id="8451268428117625855">Изаберите датотеку.</translation>
+<translation id="5776402066334188252">Потврдите да желите да инсталирате ову додатну компоненту. Инсталирајте само додатне компоненте у које имате поверења.</translation>
+<translation id="3018094406922859308">Преузимање додатних компоненти...</translation>
<translation id="7364796246159120393">Одабери датотеку</translation>
+<translation id="2761667185364618470">Потврдите избор у овом пољу за потврду уколико желите да наставите.</translation>
<translation id="8964020114565522021">Превуците датотеку овде</translation>
+<translation id="5129723458012748440">Додатак <ph name="PLUGIN"/> није инсталиран.</translation>
<translation id="838869780401515933">изабери</translation>
<translation id="2846343701378493991">1024 (средњи степен)</translation>
<translation id="5476505524087279545">опозови избор</translation>
<translation id="3789841737615482174">Инсталирај</translation>
-<translation id="5253117816378681419">Потврдите да желите да инсталирате <ph name="PLUGIN"/> додатак. Инсталирајте само додатке у које имате поверења.</translation>
+<translation id="2507943997699731163">Попуните ово поље.</translation>
+<translation id="5253117816378681419">Потврдите да желите да инсталирате <ph name="PLUGIN"/> додатну компоненту. Инсталирајте само додатне компоненте у које имате поверења.</translation>
<translation id="6663448176199120256">Недавне претраге</translation>
+<translation id="7335060848622232389">Инсталација додатних компоненти је онемогућена.</translation>
<translation id="2597378329261239068">Овај документ је заштићен лозинком. Унесите лозинку.</translation>
+<translation id="5466621249238537318">Изаберите једну или више датотека.</translation>
+<translation id="8750798805984357768">Изаберите неку од ових опција.</translation>
<translation id="7740050170769002709">HTML садржај</translation>
+<translation id="2226276347425096477">Скратите овај текст на <ph name="MAX_CHARACTERS"/> знак(ов)а или мање (тренутно користите <ph name="CURRENT_LENGTH"/> знак(ов)а).</translation>
+<translation id="1639239467298939599">Учитавање</translation>
+<translation id="2908441821576996758">Унесите листу адреса е-поште раздвојених зарезима.</translation>
<translation id="5939518447894949180">Ресетуј</translation>
+<translation id="835897206747267392">Неважећа вредност.</translation>
+<translation id="3851140433852960970">Нема доступног додатка за приказивање овог садржаја.</translation>
<translation id="1842960171412779397">изабери</translation>
-<translation id="7638452146404718955">Кликните овде да бисте преузели додатак</translation>
+<translation id="3450233048674729344">Вредност сме да буде највише <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Потребнa додатна компонента није инсталирана.</translation>
+<translation id="7638452146404718955">Кликните овде да бисте преузели додатну компоненту</translation>
<translation id="6119846243427417423">активирај</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> датотеке(а)</translation>
-<translation id="4470547978413275879">Додатак <ph name="PLUGIN"/> није инсталиран</translation>
-<translation id="6765711848403622008">Ниједан додатак није доступан за приказивање овог садржаја</translation>
+<translation id="3934680773876859118">Учитавање PDF документа није успело</translation>
<translation id="8597182159515967513">наслов</translation>
<translation id="2653659639078652383">Пошаљи</translation>
-<translation id="8475551193147984329">Потребан је <ph name="PLUGIN"/> додатак</translation>
+<translation id="8475551193147984329">Потребна је <ph name="PLUGIN"/> додатна компонента</translation>
</translationbundle> \ No newline at end of file
diff --git a/webkit/glue/resources/webkit_strings_sv.xtb b/webkit/glue/resources/webkit_strings_sv.xtb
index 7cbe67d..d2959bc 100644
--- a/webkit/glue/resources/webkit_strings_sv.xtb
+++ b/webkit/glue/resources/webkit_strings_sv.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Det gick inte att installera plugin-program från <ph name="URL"/></translation>
<translation id="9186171386827445984">Läser in dokument: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sidor...</translation>
<translation id="1235745349614807883">Rensa senaste sökningar</translation>
+<translation id="1171774979989969504">Ange en e-postadress.</translation>
+<translation id="709897737746224366">Matcha det format som anges.</translation>
<translation id="5048533449481078685">listmarkör</translation>
<translation id="372362261556059955">Ett ytterligare plugin-program krävs</translation>
<translation id="4202807286478387388">fortsätta</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Laddar...</translation>
<translation id="6845533974506654842">tryck</translation>
<translation id="8244226242650769279">bildkarta</translation>
+<translation id="310520048233152454">Ange en webbadress.</translation>
<translation id="2548326553472216322">Inga nya sökningar</translation>
+<translation id="7263440858009898357">Välj ett alternativ i listan.</translation>
+<translation id="5164977714490026579">Värdet måste vara större än eller lika med <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (hög)</translation>
<translation id="3040011195152428237">länk</translation>
<translation id="2745343197843472802">Hämta plugin-program</translation>
+<translation id="8451268428117625855">Välj en fil.</translation>
<translation id="5776402066334188252">Bekräfta att du vill installera detta plugin-program. Installera bara plugin-program från tillförlitliga källor.</translation>
-<translation id="4003986561708175844">Det begärda plugin-programmet har inte installerats</translation>
<translation id="3018094406922859308">Hämtar plugin-programmet...</translation>
<translation id="7364796246159120393">Välj fil</translation>
+<translation id="2761667185364618470">Markera den här kryssrutan om du vill fortsätta.</translation>
<translation id="8964020114565522021">Dra filen hit</translation>
+<translation id="5129723458012748440">Plugin-programmet <ph name="PLUGIN"/> är inte installerat.</translation>
<translation id="838869780401515933">kryssa för</translation>
<translation id="2846343701378493991">1024 (medel)</translation>
<translation id="5476505524087279545">kryssa av</translation>
<translation id="3789841737615482174">Installera</translation>
+<translation id="2507943997699731163">Fyll i det här fältet.</translation>
<translation id="5253117816378681419">Bekräfta att du vill installera plugin-programmet <ph name="PLUGIN"/>. Installera bara plugin-program från tillförlitliga källor.</translation>
<translation id="6663448176199120256">Senaste sökningar</translation>
+<translation id="7335060848622232389">Installationen av plugin-program har inaktiverats.</translation>
<translation id="2597378329261239068">Dokumentet är lösenordsskyddat. Ange ett lösenord.</translation>
+<translation id="5466621249238537318">Välj en eller flera filer.</translation>
+<translation id="8750798805984357768">Välj ett av följande alternativ.</translation>
<translation id="7740050170769002709">HTML-innehåll</translation>
+<translation id="2226276347425096477">Förkorta texten till <ph name="MAX_CHARACTERS"/> tecken eller mindre (nu är texten <ph name="CURRENT_LENGTH"/> tecken).</translation>
+<translation id="1639239467298939599">Läser in</translation>
+<translation id="2908441821576996758">Ange en kommaavgränsad lista med e-postadresser.</translation>
<translation id="5939518447894949180">Återställ</translation>
+<translation id="835897206747267392">Ogiltigt värde.</translation>
+<translation id="3851140433852960970">Det finns inget plugin-program för att visa det här innehållet</translation>
<translation id="1842960171412779397">välj</translation>
+<translation id="3450233048674729344">Värdet måste vara mindre än eller lika med <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Det plugin-program som krävs är inte installerat.</translation>
<translation id="7638452146404718955">Klicka här för att hämta plugin-programmet</translation>
<translation id="6119846243427417423">aktivera</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> filer</translation>
-<translation id="4470547978413275879">Plugin-programmet <ph name="PLUGIN"/> har inte installerats</translation>
-<translation id="6765711848403622008">Det finns inget plugin-program för att visa det här innehållet</translation>
+<translation id="3934680773876859118">Det gick inte att läsa in PDF-dokumentet</translation>
<translation id="8597182159515967513">rubrik</translation>
<translation id="2653659639078652383">Skicka</translation>
<translation id="8475551193147984329">Plugin-programmet <ph name="PLUGIN"/> krävs</translation>
diff --git a/webkit/glue/resources/webkit_strings_ta.xtb b/webkit/glue/resources/webkit_strings_ta.xtb
index f8dbf00..476045d 100644
--- a/webkit/glue/resources/webkit_strings_ta.xtb
+++ b/webkit/glue/resources/webkit_strings_ta.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> இலிருந்து செருகுநிரலை நிறுவுதல் தோல்வியடைந்தது</translation>
<translation id="9186171386827445984">ஆவணத்தை ஏற்றுகிறது: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> பக்கங்கள்...</translation>
<translation id="1235745349614807883">சமீபத்திய தேடல்களை சுத்தமாக்கு</translation>
+<translation id="1171774979989969504">ஒரு மின்னஞ்சல் முகவரியை உள்ளிடவும்.</translation>
+<translation id="709897737746224366">கோரிய வடிவமைப்பில் தருக.</translation>
<translation id="5048533449481078685">பட்டியல் குறிப்பான்</translation>
<translation id="372362261556059955">கூடுதல் செருகுநிரல் தேவைப்படுகிறது</translation>
<translation id="4202807286478387388">தாவு</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">நினைவேறுகிறது...</translation>
<translation id="6845533974506654842">அழுத்துக</translation>
<translation id="8244226242650769279">பட மேப்</translation>
+<translation id="310520048233152454">URL ஐ உள்ளிடுக.</translation>
<translation id="2548326553472216322">சமீபத்திய தேடல்கள் எதுவுமில்லை</translation>
+<translation id="7263440858009898357">பட்டியலிலிருந்து ஒரு உருப்படியைத் தேர்ந்தெடுங்கள்.</translation>
+<translation id="5164977714490026579">மதிப்பானது, கண்டிப்பாக <ph name="MINIMUM"/> ஐ விட அதிகமாக அல்லது அதற்குச் சமமாக இருக்க வேண்டும்.</translation>
<translation id="5944544982112848342">2048 (உயர் தரம்)</translation>
<translation id="3040011195152428237">இணைப்பு</translation>
<translation id="2745343197843472802">செருகுநிரலைப் பெறு</translation>
+<translation id="8451268428117625855">ஒரு கோப்பை தேர்ந்தெடுக்கவும்.</translation>
<translation id="5776402066334188252">இந்த செருகுநிரலை நீங்கள் நிறுவ விரும்புகிறீர்கள் என்பதை தயவுசெய்து உறுதிசெய்க. நீங்கள் நம்பும் செருகுநிரல்களை மட்டும் நீங்கள் நிறுவ வேண்டும்.</translation>
-<translation id="4003986561708175844">தேவையான செருகுநிரல் நிறுவப்படவில்லை</translation>
<translation id="3018094406922859308">செருகுநிரலைப் பதிவிறக்குகிறது...</translation>
<translation id="7364796246159120393">கோப்பைத் தேர்வு செய்க</translation>
+<translation id="2761667185364618470">தொடர விரும்பினால், இந்தப் பெட்டியைத் தேர்ந்தெடுங்கள்.</translation>
<translation id="8964020114565522021">கோப்பை இங்கே இழுத்து வருக</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> செருகுநிரல் நிறுவப்படவில்லை.</translation>
<translation id="838869780401515933">சரிபார்</translation>
<translation id="2846343701378493991">1024 (இடைநிலைத் தரம்)</translation>
<translation id="5476505524087279545">தேர்வு நீக்கு</translation>
<translation id="3789841737615482174">நிறுவு</translation>
+<translation id="2507943997699731163">இந்தப் புலத்தை நிரப்புக.</translation>
<translation id="5253117816378681419"><ph name="PLUGIN"/> செருகுநிரலை நிறுவ நீங்கள் விரும்புகிறீர்கள் என்பதை தயவுசெய்து உறுதிசெய்க. நீங்கள் நம்பும் செருகுநிரல்களை மட்டும் நிறுவ வேண்டும்.</translation>
<translation id="6663448176199120256">சமீபத்திய தேடல்கள்</translation>
+<translation id="7335060848622232389">செருகுநிரல்களை நிறுவுதல் முடக்கப்பட்டது.</translation>
<translation id="2597378329261239068">இந்த ஆவணம் கடவுச்சொல் பாதுகாக்கப்பட்ட ஒன்று. தயவுசெய்து ஒரு கடவுச்சொல்லை உள்ளிடுக.</translation>
+<translation id="5466621249238537318">ஒன்று அல்லது அதற்குமேற்பட்ட கோப்புகளைத் தேர்ந்தெடுங்கள்.</translation>
+<translation id="8750798805984357768">தயவுசெய்து இந்த விருப்பங்களில் ஒன்றைத் தேர்ந்தெடுங்கள்.</translation>
<translation id="7740050170769002709">HTML உள்ளடக்கம்</translation>
+<translation id="2226276347425096477">இந்த உரையை <ph name="MAX_CHARACTERS"/> எழுத்துக்குறிகள் அல்லது அதற்கும் குறைவாக சுருக்கிடுங்கள் (நீங்கள் தற்போது <ph name="CURRENT_LENGTH"/> எழுத்துக்குறிகளைப் பயன்படுத்துகிறீர்கள்).</translation>
+<translation id="1639239467298939599">ஏற்றுகிறது</translation>
+<translation id="2908441821576996758">காற்புள்ளியால் பிரிக்கப்பட்ட மின்னஞ்சல் முகவரிகளின் பட்டியலை உள்ளிடுக.</translation>
<translation id="5939518447894949180">மீட்டமை</translation>
+<translation id="835897206747267392">செல்லாத மதிப்பு.</translation>
+<translation id="3851140433852960970">இந்த உள்ளடக்கத்தைக் காண்பிப்பதற்கான செருகுநிரல் கிடைக்கவில்லை.</translation>
<translation id="1842960171412779397">தேர்ந்தெடு</translation>
+<translation id="3450233048674729344">மதிப்பானது கண்டிப்பாக <ph name="MAXIMUM"/> ஐ விடக்குறைவாக அல்லது அதற்குச் சமமாக இருக்க வேண்டும்.</translation>
+<translation id="9198010615634362518">தேவையான செருகுநிரல் நிறுவப்படவில்லை.</translation>
<translation id="7638452146404718955">செருகுநிரலைப் பதிவிறக்க இங்கே கிளிக் செய்க</translation>
<translation id="6119846243427417423">செயல்படுத்து</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> கோப்புகள்</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> செருகுநிரல் நிறுவப்படவில்லை</translation>
-<translation id="6765711848403622008">இந்த உள்ளடக்கத்தைக் காண்பிப்பதற்கான செருகுநிரல் கிடைக்கவில்லை</translation>
+<translation id="3934680773876859118">PDF ஆவணத்தை ஏற்றுவது தோல்வியடைந்தது</translation>
<translation id="8597182159515967513">தலைப்பு</translation>
<translation id="2653659639078652383">சமர்ப்பி</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> செருகுநிரல் தேவை</translation>
diff --git a/webkit/glue/resources/webkit_strings_te.xtb b/webkit/glue/resources/webkit_strings_te.xtb
index a1f9fd6..31f6733 100644
--- a/webkit/glue/resources/webkit_strings_te.xtb
+++ b/webkit/glue/resources/webkit_strings_te.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997"><ph name="URL"/> నుండి ప్లగ్-ఇన్‌ను వ్యవస్థాపించడానికి విఫలమైంది</translation>
<translation id="9186171386827445984">పత్రాన్ని లోడ్ చేస్తోంది: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> పేజీలు...</translation>
<translation id="1235745349614807883">ఇటీవల శోధనలను క్లియర్ చెయ్యి</translation>
+<translation id="1171774979989969504">దయచేసి ఇమెయిల్ చిరునామాను ఎంటర్ చెయ్యండి.</translation>
+<translation id="709897737746224366">దయచేసి అభ్యర్థించిన ఆకృతీకరణను సరిపోల్చండి.</translation>
<translation id="5048533449481078685">జాబితా మార్కర్</translation>
<translation id="372362261556059955">అదనపు ప్లగ్-ఇన్ అవసరం</translation>
<translation id="4202807286478387388">వెళ్ళు</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">లోడ్ అవుతోంది...</translation>
<translation id="6845533974506654842">నొక్కండి</translation>
<translation id="8244226242650769279">చిత్రం మాప్</translation>
+<translation id="310520048233152454">దయచేసి ఒక URLని ఎంటర్ చెయ్యండి.</translation>
<translation id="2548326553472216322">ఇటీవల శోధనలు లేవు</translation>
+<translation id="7263440858009898357">దయచేసి జాబితాలోని ఒక అంశాన్ని ఎంచుకోండి.</translation>
+<translation id="5164977714490026579">విలువ ఖచ్చితంగా <ph name="MINIMUM"/> కంటే ఎక్కువగా లేదా సమానంగా ఉండాలి.</translation>
<translation id="5944544982112848342">2048 (ఉత్తమ గ్రేడ్)</translation>
<translation id="3040011195152428237">లింక్</translation>
<translation id="2745343197843472802">ప్లగ్-ఇన్‌ను పొందండి</translation>
+<translation id="8451268428117625855">దయచేసి ఒక ఫైల్‌ని ఎంచుకోండి.</translation>
<translation id="5776402066334188252">దయచేసి మీరు ఈ ప్లగ్-ఇన్‌ను వ్యవస్థాపించాలని అనుకుంటున్నట్లు నిర్ధారించండి. మీరు నమ్మేటటువంటి ప్లగ్-ఇన్‌లను మాత్రమే మీరు వ్యవస్థాపించాలి.</translation>
-<translation id="4003986561708175844">అవసరమైన ప్లగ్-ఇన్ వ్యవస్థాపించబడలేదు</translation>
<translation id="3018094406922859308">ప్లగ్-ఇన్‌ను డౌన్‌లోడ్ చేస్తోంది...</translation>
<translation id="7364796246159120393">ఫైల్‌ను ఎంచుకోండి</translation>
+<translation id="2761667185364618470">దయచేసి మీరు కొనసాగాలనుకుంటే ఈ బాక్స్‌కి టిక్కు పెట్టండి.</translation>
<translation id="8964020114565522021">ఫైల్‌ను ఇక్కడకు లాగండి</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> ప్లగ్-ఇన్ వ్యవస్థాపించబడలేదు.</translation>
<translation id="838869780401515933">తనిఖీ చెయ్యి</translation>
<translation id="2846343701378493991">1024 (మధ్యస్థ గ్రేడ్)</translation>
<translation id="5476505524087279545">ఎంపిక చెయ్యబడలేదు</translation>
<translation id="3789841737615482174">ఇన్‌స్టాల్ చెయ్యి</translation>
+<translation id="2507943997699731163">దయచేసి ఈ ఫీల్డ్‌ని పూర్తి చెయ్యండి.</translation>
<translation id="5253117816378681419">దయచేసి మీరు <ph name="PLUGIN"/> ప్లగ్-ఇన్‌ను వ్యవస్థాపించాలనుకుంటున్నారని నిర్థారించండి. మీరు విశ్వసించే ప్లగ్-ఇన్‌లను మాత్రమే వ్యవస్థాపించాలి.</translation>
<translation id="6663448176199120256">ఇటీవల శోధనలు</translation>
+<translation id="7335060848622232389">వ్యవస్థాపించబడిన ప్లగ్-ఇన్‌లు నిలిపివెయ్యబడ్డాయి.</translation>
<translation id="2597378329261239068">ఈ పత్రం అనుమతి పదంచే రక్షించబడింది. దయచేసి అనుమతి పదాన్ని నమోదు చేయండి.</translation>
+<translation id="5466621249238537318">దయచేసి ఒకటి లేదా మరిన్ని ఫైళ్ళను ఎంచుకోండి.</translation>
+<translation id="8750798805984357768">దయచేసి ఈ ఎంపికలలో ఒకదాన్ని ఎంచుకోండి.</translation>
<translation id="7740050170769002709">HTML కంటెంట్</translation>
+<translation id="2226276347425096477">దయచేసి ఈ వచనాన్ని <ph name="MAX_CHARACTERS"/> అక్షరాలకు లేదా అంతకంటే తక్కువ (మీరు ప్రస్తుతం <ph name="CURRENT_LENGTH"/> అక్షరాలను ఉపయోగిస్తున్నారు)కు తగ్గించండి.</translation>
+<translation id="1639239467298939599">లోడ్ అవుతోంది</translation>
+<translation id="2908441821576996758">దయచేసి కామాతో వేరు చేసిన ఇమెయిల్ చిరునామాల జాబితాను ఎంటర్ చెయ్యండి.</translation>
<translation id="5939518447894949180">తిరిగి అమర్చండి</translation>
+<translation id="835897206747267392">చెల్లని విలువ.</translation>
+<translation id="3851140433852960970">ఈ కంటెంట్‌ను ప్రదర్శించడానికి ఏ ప్లగ్-ఇన్ అందుబాటులో లేదు.</translation>
<translation id="1842960171412779397">ఎంచుకోండి</translation>
+<translation id="3450233048674729344">విలువ ఖచ్చితంగా <ph name="MAXIMUM"/> కంటే తగ్గువగా లేదా సమానంగా ఉండాలి.</translation>
+<translation id="9198010615634362518">అవసరమైన ప్లగ్-ఇన్ వ్యవస్థాపించబడలేదు.</translation>
<translation id="7638452146404718955">ప్లగ్-ఇన్‌ను డౌన్‌లోడ్ చేయడానికి ఇక్కడ క్లిక్ చేయండి</translation>
<translation id="6119846243427417423">ఆక్టివేట్ చెయ్యి</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ఫైళ్ళు</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> ప్లగ్-ఇన్ వ్యవస్థాపించబడలేదు</translation>
-<translation id="6765711848403622008">ఈ కంటెంట్‌ను ప్రదర్శించడానికి ఏ ప్లగ్-ఇన్ అందుబాటులో లేదు</translation>
+<translation id="3934680773876859118">PDF పత్రాన్ని లోడ్ చెయ్యడానికి విఫలమైంది</translation>
<translation id="8597182159515967513">శీర్షిక</translation>
<translation id="2653659639078652383">సమర్పించు</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> ప్లగ్-ఇన్ అవసరం</translation>
diff --git a/webkit/glue/resources/webkit_strings_th.xtb b/webkit/glue/resources/webkit_strings_th.xtb
index a6ffcc6..4fda865 100644
--- a/webkit/glue/resources/webkit_strings_th.xtb
+++ b/webkit/glue/resources/webkit_strings_th.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">การติดตั้งปลั๊กอินจาก <ph name="URL"/> ล้มเหลว</translation>
<translation id="9186171386827445984">กำลังโหลดเอกสาร: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> หน้า...</translation>
<translation id="1235745349614807883">ลบการค้นหาล่าสุด</translation>
+<translation id="1171774979989969504">โปรดป้อนที่อยู่อีเมล</translation>
+<translation id="709897737746224366">โปรดจับคู่รูปแบบที่ร้องขอ</translation>
<translation id="5048533449481078685">ผู้สร้างรายการ</translation>
<translation id="372362261556059955">ต้องการปลั๊กอินเพิ่มเติม</translation>
<translation id="4202807286478387388">ข้าม</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">กำลังโหลด...</translation>
<translation id="6845533974506654842">กด</translation>
<translation id="8244226242650769279">แผนที่รูปภาพ</translation>
+<translation id="310520048233152454">โปรดป้อน URL</translation>
<translation id="2548326553472216322">ไม่พบการค้นหาล่าสุด</translation>
+<translation id="7263440858009898357">โปรดเลือกรายการจากหน้ารายการ</translation>
+<translation id="5164977714490026579">ค่าต้องมากกว่าหรือเท่ากับ <ph name="MINIMUM"/></translation>
<translation id="5944544982112848342">2048 (เกรดสูง)</translation>
<translation id="3040011195152428237">ลิงก์</translation>
<translation id="2745343197843472802">รับปลั๊กอิน</translation>
+<translation id="8451268428117625855">โปรดเลือกไฟล์</translation>
<translation id="5776402066334188252">โปรดยืนยันว่าคุณต้องการติดตั้งปลั๊กอินนี้ คุณควรติดตั้งเฉพาะปลั๊กอินที่คุณไว้ใจเท่านั้น </translation>
-<translation id="4003986561708175844">ไม่ได้ติดตั้งปลั๊กอินที่จำเป็น</translation>
<translation id="3018094406922859308">กำลังดาวน์โหลดปลั๊กอิน...</translation>
<translation id="7364796246159120393">เลือกไฟล์</translation>
+<translation id="2761667185364618470">โปรดเลือกช่องนี้หากคุณต้องการดำเนินการต่อ</translation>
<translation id="8964020114565522021">ลากไฟล์มาที่นี่</translation>
+<translation id="5129723458012748440">ไม่ได้ติดตั้งปลั๊กอิน <ph name="PLUGIN"/></translation>
<translation id="838869780401515933">ทำเครื่องหมาย</translation>
<translation id="2846343701378493991">1024 (เกรดปานกลาง)</translation>
<translation id="5476505524087279545">ยกเลิกการทำเครื่องหมาย</translation>
<translation id="3789841737615482174">ติดตั้ง</translation>
+<translation id="2507943997699731163">โปรดกรอกฟิลด์นี้</translation>
<translation id="5253117816378681419">โปรดยืนยันว่าคุณต้องการติดตั้งปลั๊กอิน <ph name="PLUGIN"/> คุณควรติดตั้งเฉพาะปลั๊กอินที่คุณไว้ใจเท่านั้น</translation>
<translation id="6663448176199120256">การค้นหาล่าสุด</translation>
+<translation id="7335060848622232389">การติดตั้งปลั๊กอินถูกปิดใช้งาน</translation>
<translation id="2597378329261239068">เอกสารนี้ได้รับการป้องกันด้วยรหัสผ่าน โปรดป้อนรหัสผ่าน</translation>
+<translation id="5466621249238537318">โปรดเลือกอย่างน้อยหนึ่งไฟล์</translation>
+<translation id="8750798805984357768">โปรดเลือกตัวเลือกอย่างหนึ่งอย่างใดเหล่านี้</translation>
<translation id="7740050170769002709">เนื้อหา HTML</translation>
+<translation id="2226276347425096477">โปรดย่อข้อความนี้ให้เหลือไม่เกิน <ph name="MAX_CHARACTERS"/> อักขระ (ขณะนี้ข้อความของคุณมี <ph name="CURRENT_LENGTH"/> อักขระ)</translation>
+<translation id="1639239467298939599">กำลังโหลด</translation>
+<translation id="2908441821576996758">โปรดป้อนรายการที่อยู่อีเมลโดยคั่นด้วยเครื่องหมายจุลภาค</translation>
<translation id="5939518447894949180">ตั้งค่าใหม่</translation>
+<translation id="835897206747267392">ค่าไม่ถูกต้อง</translation>
+<translation id="3851140433852960970">ไม่มีปลั๊กอินที่จะแสดงเนื้อหานี้</translation>
<translation id="1842960171412779397">เลือก</translation>
+<translation id="3450233048674729344">ค่าต้องน้อยกว่าหรือเท่ากับ <ph name="MAXIMUM"/></translation>
+<translation id="9198010615634362518">ไม่ได้ติดตั้งปลั๊กอินที่จำเป็น</translation>
<translation id="7638452146404718955">คลิกที่นี่เพื่อดาวน์โหลดปลั๊กอิน</translation>
<translation id="6119846243427417423">เปิดใช้งาน</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> ไฟล์</translation>
-<translation id="4470547978413275879">ไม่ได้ติดตั้งปลั๊กอิน <ph name="PLUGIN"/></translation>
-<translation id="6765711848403622008">ไม่มีปลั๊กอินที่จะแสดงเนื้อหานี้</translation>
+<translation id="3934680773876859118">โหลดเอกสาร PDF ล้มเหลว</translation>
<translation id="8597182159515967513">ส่วนหัว</translation>
<translation id="2653659639078652383">ส่ง</translation>
<translation id="8475551193147984329">ต้องการปลั๊กอิน <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_tr.xtb b/webkit/glue/resources/webkit_strings_tr.xtb
index 5a24891..8b0a400 100644
--- a/webkit/glue/resources/webkit_strings_tr.xtb
+++ b/webkit/glue/resources/webkit_strings_tr.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Eklenti, <ph name="URL"/> kaynağından yüklenemedi</translation>
<translation id="9186171386827445984">Belge yükleniyor: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> sayfa...</translation>
<translation id="1235745349614807883">Son Aramaları Temizle</translation>
+<translation id="1171774979989969504">Lütfen e-posta adresi girin.</translation>
+<translation id="709897737746224366">Lütfen istenen biçimi eşleştirin.</translation>
<translation id="5048533449481078685">liste işaretçisi</translation>
<translation id="372362261556059955">Başka eklenti gerekiyor</translation>
<translation id="4202807286478387388">git</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Yükleniyor...</translation>
<translation id="6845533974506654842">bas</translation>
<translation id="8244226242650769279">resim haritası</translation>
+<translation id="310520048233152454">Lütfen bir URL girin.</translation>
<translation id="2548326553472216322">Yeni arama yok</translation>
+<translation id="7263440858009898357">Lütfen listeden bir öğe seçin.</translation>
+<translation id="5164977714490026579">Değer <ph name="MINIMUM"/> veya daha büyük olmalıdır.</translation>
<translation id="5944544982112848342">2048 (Yüksek Düzey)</translation>
<translation id="3040011195152428237">bağlantı</translation>
<translation id="2745343197843472802">Eklentiyi edinin</translation>
+<translation id="8451268428117625855">Lütfen bir dosya seçin.</translation>
<translation id="5776402066334188252">Lütfen bu eklentiyi yüklemek istediğinizi onaylayın. Yalnızca güvendiğiniz eklentileri yüklemelisiniz.</translation>
-<translation id="4003986561708175844">Gereken eklenti yüklü değil</translation>
<translation id="3018094406922859308">Eklenti indiriliyor...</translation>
<translation id="7364796246159120393">Dosya Seç</translation>
+<translation id="2761667185364618470">İlerlemek istiyorsanız lütfen bu kutuyu işaretleyin.</translation>
<translation id="8964020114565522021">Dosyayı buraya sürükleyin</translation>
+<translation id="5129723458012748440"><ph name="PLUGIN"/> eklentisi yüklü değil.</translation>
<translation id="838869780401515933">işaretle</translation>
<translation id="2846343701378493991">1024 (Orta Düzey)</translation>
<translation id="5476505524087279545">işareti kaldır</translation>
<translation id="3789841737615482174">Yükle</translation>
+<translation id="2507943997699731163">Lütfen bu alanı doldurun.</translation>
<translation id="5253117816378681419">Lütfen <ph name="PLUGIN"/> eklentisini yüklemek istediğinizi onaylayın. Yalnızca güvendiğiniz eklentileri yüklemelisiniz.</translation>
<translation id="6663448176199120256">Son Aramalar</translation>
+<translation id="7335060848622232389">Eklenti yükleme devre dışı bırakıldı.</translation>
<translation id="2597378329261239068">Doküman şifre korumalı. Lütfen şifreyi girin.</translation>
+<translation id="5466621249238537318">Lütfen bir veya daha fazla dosya seçin.</translation>
+<translation id="8750798805984357768">Lütfen bu seçeneklerden birini belirleyin.</translation>
<translation id="7740050170769002709">HTML içeriği</translation>
+<translation id="2226276347425096477">Lütfen bu metni <ph name="MAX_CHARACTERS"/> veya daha az karakter olacak şekilde kısaltın (şu anda <ph name="CURRENT_LENGTH"/> karakter kullanıyorsunuz).</translation>
+<translation id="1639239467298939599">Yükleniyor</translation>
+<translation id="2908441821576996758">Lütfen e-posta adreslerinin virgülle ayrılmış listesini girin.</translation>
<translation id="5939518447894949180">Sıfırla</translation>
+<translation id="835897206747267392">Geçersiz değer.</translation>
+<translation id="3851140433852960970">Bu içeriği görüntüleyecek hiçbir eklenti yok.</translation>
<translation id="1842960171412779397">seç</translation>
+<translation id="3450233048674729344">Değer <ph name="MAXIMUM"/> veya daha küçük olmalıdır.</translation>
+<translation id="9198010615634362518">Gereken eklenti yüklü değil.</translation>
<translation id="7638452146404718955">Eklentiyi indirmek için burayı tıklayın</translation>
<translation id="6119846243427417423">etkinleştir</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> dosya</translation>
-<translation id="4470547978413275879"><ph name="PLUGIN"/> eklentisi yüklü değil</translation>
-<translation id="6765711848403622008">Bu içeriği görüntüleyecek hiçbir eklenti yok</translation>
+<translation id="3934680773876859118">PDF dokümanı yüklenemedi</translation>
<translation id="8597182159515967513">başlık</translation>
<translation id="2653659639078652383">Gönder</translation>
<translation id="8475551193147984329"><ph name="PLUGIN"/> eklentisi gerekiyor</translation>
diff --git a/webkit/glue/resources/webkit_strings_uk.xtb b/webkit/glue/resources/webkit_strings_uk.xtb
index 360c85f..b9453c4 100644
--- a/webkit/glue/resources/webkit_strings_uk.xtb
+++ b/webkit/glue/resources/webkit_strings_uk.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">Не вдалося встановити плагін із <ph name="URL"/></translation>
<translation id="9186171386827445984">Завантаження документа – сторінки: <ph name="PAGE_NUMBER"/> із <ph name="NUMBER_OF_PAGES"/>...</translation>
<translation id="1235745349614807883">Очистити останні пошуки</translation>
+<translation id="1171774979989969504">Введіть електронну адресу.</translation>
+<translation id="709897737746224366">Виберіть потрібний формат.</translation>
<translation id="5048533449481078685">маркер списку</translation>
<translation id="372362261556059955">Потрібен додатковий плагін.</translation>
<translation id="4202807286478387388">перейти</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Завантаження...</translation>
<translation id="6845533974506654842">натиснути</translation>
<translation id="8244226242650769279">мапа зображення</translation>
+<translation id="310520048233152454">Введіть URL-адресу.</translation>
<translation id="2548326553472216322">Немає останніх пошуків</translation>
+<translation id="7263440858009898357">Виберіть елемент зі списку.</translation>
+<translation id="5164977714490026579">Значення має бути більшим або дорівнювати <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Високий рівень)</translation>
<translation id="3040011195152428237">посилання</translation>
<translation id="2745343197843472802">Отримати плагін</translation>
+<translation id="8451268428117625855">Виберіть файл.</translation>
<translation id="5776402066334188252">Підтвердьте встановлення цього плагіна. Слід установлювати лише плагіни, яким ви довіряєте.</translation>
-<translation id="4003986561708175844">Потрібний плагін не встановлено</translation>
<translation id="3018094406922859308">Завантаження плагіна...</translation>
<translation id="7364796246159120393">Вибрати файл</translation>
+<translation id="2761667185364618470">Поставте тут прапорець, якщо хочете продовжити.</translation>
<translation id="8964020114565522021">Перетягніть файл сюди</translation>
+<translation id="5129723458012748440">Плагін <ph name="PLUGIN"/> не встановлено.</translation>
<translation id="838869780401515933">установити прапорець</translation>
<translation id="2846343701378493991">1024 (Середній рівень)</translation>
<translation id="5476505524087279545">зняти прапорець</translation>
<translation id="3789841737615482174">Інсталювати</translation>
+<translation id="2507943997699731163">Заповніть це поле.</translation>
<translation id="5253117816378681419">Підтвердьте встановлення плагіна <ph name="PLUGIN"/>. Слід установлювати лише плагіни, яким ви довіряєте.</translation>
<translation id="6663448176199120256">Останні пошуки</translation>
+<translation id="7335060848622232389">Встановлення плагінів вимкнено.</translation>
<translation id="2597378329261239068">Цей документ захищено паролем. Введіть пароль.</translation>
+<translation id="5466621249238537318">Виберіть один або декілька файлів.</translation>
+<translation id="8750798805984357768">Виберіть один із запропонованих варіантів.</translation>
<translation id="7740050170769002709">Вміст HTML</translation>
+<translation id="2226276347425096477">Скоротіть текст до такої кількості символів або менше: <ph name="MAX_CHARACTERS"/> (наразі використано символів: <ph name="CURRENT_LENGTH"/>).</translation>
+<translation id="1639239467298939599">Завантаження</translation>
+<translation id="2908441821576996758">Введіть список електронних адрес, розділених комою.</translation>
<translation id="5939518447894949180">Скинути</translation>
+<translation id="835897206747267392">Недійсне значення</translation>
+<translation id="3851140433852960970">Немає плагінів для відображення цього вмісту.</translation>
<translation id="1842960171412779397">вибрати</translation>
+<translation id="3450233048674729344">Значення має бути меншим або дорівнювати <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Потрібний плагін не встановлено.</translation>
<translation id="7638452146404718955">Натисніть тут, щоб завантажити плагін</translation>
<translation id="6119846243427417423">активувати</translation>
<translation id="8444882422881193423">файлів: <ph name="NUMBER_OF_FILES"/></translation>
-<translation id="4470547978413275879">Плагін <ph name="PLUGIN"/> не встановлено</translation>
-<translation id="6765711848403622008">Немає доступного плагіна для відображення цього вмісту</translation>
+<translation id="3934680773876859118">Не вдалося завантажити документ PDF</translation>
<translation id="8597182159515967513">заголовок</translation>
<translation id="2653659639078652383">Надіслати</translation>
<translation id="8475551193147984329">Потрібен плагін <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_vi.xtb b/webkit/glue/resources/webkit_strings_vi.xtb
index 0ee2d09..0c963ca 100644
--- a/webkit/glue/resources/webkit_strings_vi.xtb
+++ b/webkit/glue/resources/webkit_strings_vi.xtb
@@ -4,11 +4,13 @@
<translation id="4519964825805946997">Cài đặt trình cắm từ <ph name="URL"/> không thành công</translation>
<translation id="9186171386827445984">Đang tải tài liệu: <ph name="PAGE_NUMBER"/>/<ph name="NUMBER_OF_PAGES"/> trang...</translation>
<translation id="1235745349614807883">Xoá Tìm kiếm Gần đây</translation>
+<translation id="1171774979989969504">Vui lòng nhập địa chỉ email.</translation>
+<translation id="709897737746224366">Vui lòng khớp với định dạng được yêu cầu.</translation>
<translation id="5048533449481078685">đánh dấu danh sách</translation>
<translation id="372362261556059955">Cần trình cắm bổ sung</translation>
<translation id="4202807286478387388">chuyển</translation>
<translation id="4611115858363067980"><ph name="FILENAME"/><ph name="WIDTH"/>×<ph name="HEIGHT"/></translation>
-<translation id="7658239707568436148">Huỷ</translation>
+<translation id="7658239707568436148">Hủy</translation>
<translation id="795667975304826397">Không có tệp nào được chọn</translation>
<translation id="1416462845279468967">Cài đặt trình cắm không thành công</translation>
<translation id="8141602879876242471">Đây là chỉ mục có thể tìm kiếm. Nhập từ khoá tìm kiếm vào:</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">Đang tải...</translation>
<translation id="6845533974506654842">nhấn</translation>
<translation id="8244226242650769279">bản đồ hình ảnh</translation>
+<translation id="310520048233152454">Vui lòng nhập URL.</translation>
<translation id="2548326553472216322">Không có tìm kiếm nào gần đây</translation>
+<translation id="7263440858009898357">Vui lòng chọn một mục trong danh sách.</translation>
+<translation id="5164977714490026579">Giá trị phải lớn hơn hoặc bằng <ph name="MINIMUM"/>.</translation>
<translation id="5944544982112848342">2048 (Cấp độ cao)</translation>
<translation id="3040011195152428237">liên kết</translation>
<translation id="2745343197843472802">Tải Trình cắm</translation>
+<translation id="8451268428117625855">Vui lòng chọn một tệp.</translation>
<translation id="5776402066334188252">Vui lòng xác nhận rằng bạn muốn cài đặt trình cắm này. Bạn chỉ nên cài đặt trình cắm mà bạn tin tưởng.</translation>
-<translation id="4003986561708175844">Trình cắm được yêu cầu chưa được cài đặt</translation>
<translation id="3018094406922859308">Đang tải xuống trình cắm...</translation>
<translation id="7364796246159120393">Chọn Tệp tin</translation>
+<translation id="2761667185364618470">Vui lòng chọn hộp kiểm này nếu bạn muốn tiếp tục.</translation>
<translation id="8964020114565522021">Kéo tệp tại đây</translation>
+<translation id="5129723458012748440">Plugin <ph name="PLUGIN"/> chưa được cài đặt.</translation>
<translation id="838869780401515933">chọn</translation>
<translation id="2846343701378493991">1024 (Loại Trung bình)</translation>
<translation id="5476505524087279545">bỏ chọn</translation>
<translation id="3789841737615482174">Cài đặt</translation>
+<translation id="2507943997699731163">Vui lòng điền vào trường này.</translation>
<translation id="5253117816378681419">Vui lòng xác nhận rằng bạn muốn cài đặt trình cắm <ph name="PLUGIN"/>. Bạn chỉ nên cài đặt những trình cắm mà bạn tin tưởng.</translation>
<translation id="6663448176199120256">Tìm kiếm Gần đây</translation>
+<translation id="7335060848622232389">Cài đặt plug-in đã bị tắt.</translation>
<translation id="2597378329261239068">Tài liệu này được bảo vệ bằng mật khẩu. Vui lòng nhập mật khẩu.</translation>
+<translation id="5466621249238537318">Vui lòng chọn một hoặc nhiều tệp.</translation>
+<translation id="8750798805984357768">Vui lòng chọn một trong các tùy chọn sau.</translation>
<translation id="7740050170769002709">Nội dung HTML</translation>
+<translation id="2226276347425096477">Hãy cắt ngắn văn bản này thành <ph name="MAX_CHARACTERS"/> ký tự hoặc ít hơn (bạn hiện đang sử dụng <ph name="CURRENT_LENGTH"/> ký tự).</translation>
+<translation id="1639239467298939599">Đang tải</translation>
+<translation id="2908441821576996758">Vui lòng nhập danh sách địa chỉ email được phân cách bằng dấu phẩy.</translation>
<translation id="5939518447894949180">Đặt lại</translation>
+<translation id="835897206747267392">Giá trị không hợp lệ.</translation>
+<translation id="3851140433852960970">Không có plugin nào để hiển thị nội dung này.</translation>
<translation id="1842960171412779397">chọn</translation>
+<translation id="3450233048674729344">Giá trị phải nhỏ hơn hoặc bằng <ph name="MAXIMUM"/>.</translation>
+<translation id="9198010615634362518">Plugin được yêu cầu chưa được cài đặt.</translation>
<translation id="7638452146404718955">Nhấp vào đây để tải xuống trình cắm</translation>
<translation id="6119846243427417423">kích hoạt</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> tệp</translation>
-<translation id="4470547978413275879">Trình cắm <ph name="PLUGIN"/> chưa được cài đặt</translation>
-<translation id="6765711848403622008">Không có trình cắm nào để hiển thị nội dung này</translation>
+<translation id="3934680773876859118">Không thể tải tài liệu PDF</translation>
<translation id="8597182159515967513">đầu đề</translation>
<translation id="2653659639078652383">Gửi</translation>
<translation id="8475551193147984329">Cần trình cắm <ph name="PLUGIN"/></translation>
diff --git a/webkit/glue/resources/webkit_strings_zh-CN.xtb b/webkit/glue/resources/webkit_strings_zh-CN.xtb
index f931c5c..c02178b 100644
--- a/webkit/glue/resources/webkit_strings_zh-CN.xtb
+++ b/webkit/glue/resources/webkit_strings_zh-CN.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">无法从 <ph name="URL"/> 安装插件</translation>
<translation id="9186171386827445984">正在载入文档:已载入 <ph name="PAGE_NUMBER"/> 页,共 <ph name="NUMBER_OF_PAGES"/> 页...</translation>
<translation id="1235745349614807883">清除最近的搜索</translation>
+<translation id="1171774979989969504">请输入电子邮件地址。</translation>
+<translation id="709897737746224366">请与所请求的格式保持一致。</translation>
<translation id="5048533449481078685">列表标记</translation>
<translation id="372362261556059955">需要其他插件</translation>
<translation id="4202807286478387388">略过</translation>
@@ -16,30 +18,45 @@
<translation id="370665806235115550">正在载入...</translation>
<translation id="6845533974506654842">按</translation>
<translation id="8244226242650769279">图片映射</translation>
+<translation id="310520048233152454">请输入网址。</translation>
<translation id="2548326553472216322">最近未执行搜索</translation>
+<translation id="7263440858009898357">请在列表中选择一项。</translation>
+<translation id="5164977714490026579">值必须大于或等于 <ph name="MINIMUM"/>。</translation>
<translation id="5944544982112848342">2048(高强度)</translation>
<translation id="3040011195152428237">链接</translation>
<translation id="2745343197843472802">获取插件</translation>
+<translation id="8451268428117625855">请选择一个文件。</translation>
<translation id="5776402066334188252">请确认您要安装此插件。您应该只安装自己信任的插件。</translation>
-<translation id="4003986561708175844">未安装所需插件</translation>
<translation id="3018094406922859308">正在下载插件...</translation>
<translation id="7364796246159120393">选择文件</translation>
+<translation id="2761667185364618470">如果要继续,请选中此框。</translation>
<translation id="8964020114565522021">将文件拖到此处</translation>
+<translation id="5129723458012748440">未安装 <ph name="PLUGIN"/> 插件。</translation>
<translation id="838869780401515933">选中</translation>
<translation id="2846343701378493991">1024(中等强度)</translation>
<translation id="5476505524087279545">取消选中</translation>
<translation id="3789841737615482174">安装</translation>
+<translation id="2507943997699731163">请填写此字段。</translation>
<translation id="5253117816378681419">请确认您要安装 <ph name="PLUGIN"/> 插件。您应该只安装自己信任的插件。</translation>
<translation id="6663448176199120256">近期搜索</translation>
+<translation id="7335060848622232389">已停用插件安装。</translation>
<translation id="2597378329261239068">本文档设置了密码保护,请输入密码。</translation>
+<translation id="5466621249238537318">请选择一个或多个文件。</translation>
+<translation id="8750798805984357768">请从这些选项中选择一个。</translation>
<translation id="7740050170769002709">HTML 内容</translation>
+<translation id="2226276347425096477">请将该文本减少为 <ph name="MAX_CHARACTERS"/> 个字符或更少(您当前使用了 <ph name="CURRENT_LENGTH"/> 个字符)。</translation>
+<translation id="1639239467298939599">正在载入</translation>
+<translation id="2908441821576996758">请输入用逗号分隔的电子邮件地址的列表。</translation>
<translation id="5939518447894949180">重置</translation>
+<translation id="835897206747267392">值无效。</translation>
+<translation id="3851140433852960970">没有用于显示此内容的插件。</translation>
<translation id="1842960171412779397">选中</translation>
+<translation id="3450233048674729344">值必须小于或等于 <ph name="MAXIMUM"/>。</translation>
+<translation id="9198010615634362518">未安装所需插件。</translation>
<translation id="7638452146404718955">点击此处可下载插件</translation>
<translation id="6119846243427417423">激活</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> 个文件</translation>
-<translation id="4470547978413275879">未安装 <ph name="PLUGIN"/> 插件</translation>
-<translation id="6765711848403622008">没有用于显示此内容的插件</translation>
+<translation id="3934680773876859118">无法载入 PDF 文档</translation>
<translation id="8597182159515967513">标题</translation>
<translation id="2653659639078652383">提交</translation>
<translation id="8475551193147984329">需要 <ph name="PLUGIN"/> 插件</translation>
diff --git a/webkit/glue/resources/webkit_strings_zh-TW.xtb b/webkit/glue/resources/webkit_strings_zh-TW.xtb
index 368a365..7c9d083 100644
--- a/webkit/glue/resources/webkit_strings_zh-TW.xtb
+++ b/webkit/glue/resources/webkit_strings_zh-TW.xtb
@@ -4,6 +4,8 @@
<translation id="4519964825805946997">無法從 <ph name="URL"/> 安裝外掛程式</translation>
<translation id="9186171386827445984">正在載入文件:第 <ph name="PAGE_NUMBER"/> 頁,共 <ph name="NUMBER_OF_PAGES"/> 頁...</translation>
<translation id="1235745349614807883">清除最近的搜尋記錄</translation>
+<translation id="1171774979989969504">請輸入電子郵件地址。</translation>
+<translation id="709897737746224366">請符合要求的格式。</translation>
<translation id="5048533449481078685">清單標記</translation>
<translation id="372362261556059955">需要其他外掛程式</translation>
<translation id="4202807286478387388">跳至另一頁</translation>
@@ -15,31 +17,46 @@
<translation id="5650795167354946011">安裝外掛程式後,請按一下這裡重新整理</translation>
<translation id="370665806235115550">載入中...</translation>
<translation id="6845533974506654842">按下</translation>
-<translation id="8244226242650769279">影像地圖</translation>
+<translation id="8244226242650769279">圖片點擊區</translation>
+<translation id="310520048233152454">請輸入網址。</translation>
<translation id="2548326553472216322">沒有近期的搜尋</translation>
+<translation id="7263440858009898357">請選取一個清單中的項目。</translation>
+<translation id="5164977714490026579">值必須大於或等於 <ph name="MINIMUM"/>。</translation>
<translation id="5944544982112848342">2048 (高級)</translation>
<translation id="3040011195152428237">連結</translation>
<translation id="2745343197843472802">取得外掛程式</translation>
+<translation id="8451268428117625855">請選取檔案。</translation>
<translation id="5776402066334188252">請確認您要安裝此外掛程式,建議您僅安裝您所信任的外掛程式。</translation>
-<translation id="4003986561708175844">未安裝必要的外掛程式</translation>
<translation id="3018094406922859308">正在下載外掛程式...</translation>
<translation id="7364796246159120393">選擇檔案</translation>
+<translation id="2761667185364618470">如果您要繼續執行,請勾選這個核取方塊。</translation>
<translation id="8964020114565522021">拖曳檔案至此</translation>
+<translation id="5129723458012748440">未安裝 <ph name="PLUGIN"/> 外掛程式。</translation>
<translation id="838869780401515933">選取</translation>
<translation id="2846343701378493991">1024 (中等)</translation>
<translation id="5476505524087279545">取消選取</translation>
<translation id="3789841737615482174">安裝</translation>
+<translation id="2507943997699731163">請填寫這個欄位。</translation>
<translation id="5253117816378681419">請確認您要安裝 <ph name="PLUGIN"/> 外掛程式,建議您僅安裝您所信任的外掛程式。</translation>
<translation id="6663448176199120256">最近的搜尋</translation>
+<translation id="7335060848622232389">外掛程式安裝功能已停用。</translation>
<translation id="2597378329261239068">此文件受到密碼保護,請輸入密碼。</translation>
+<translation id="5466621249238537318">請選取一或多個檔案。</translation>
+<translation id="8750798805984357768">請選取其中一個選項。</translation>
<translation id="7740050170769002709">HTML 內容</translation>
+<translation id="2226276347425096477">請將這段文字刪減至 <ph name="MAX_CHARACTERS"/> 個字元以下 (目前的字元數為 <ph name="CURRENT_LENGTH"/> 個)。</translation>
+<translation id="1639239467298939599">載入中</translation>
+<translation id="2908441821576996758">請輸入以逗號分隔的電子郵件地址清單。</translation>
<translation id="5939518447894949180">重設</translation>
+<translation id="835897206747267392">無效的值。</translation>
+<translation id="3851140433852960970">沒有可以顯示這個內容的外掛程式</translation>
<translation id="1842960171412779397">選取</translation>
+<translation id="3450233048674729344">值必須小於或等於 <ph name="MAXIMUM"/>。</translation>
+<translation id="9198010615634362518">未安裝必要的外掛程式</translation>
<translation id="7638452146404718955">按一下這裡下載外掛程式</translation>
<translation id="6119846243427417423">啟動</translation>
<translation id="8444882422881193423"><ph name="NUMBER_OF_FILES"/> 個檔案</translation>
-<translation id="4470547978413275879">未安裝 <ph name="PLUGIN"/> 外掛程式</translation>
-<translation id="6765711848403622008">沒有可以顯示此內容的外掛程式</translation>
+<translation id="3934680773876859118">無法載入 PDF 文件</translation>
<translation id="8597182159515967513">標題</translation>
<translation id="2653659639078652383">提交</translation>
<translation id="8475551193147984329">需要 <ph name="PLUGIN"/> 外掛程式</translation>
diff --git a/webkit/glue/user_agent.cc b/webkit/glue/user_agent.cc
index 04fab21..f92bc9a 100644
--- a/webkit/glue/user_agent.cc
+++ b/webkit/glue/user_agent.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -64,14 +64,15 @@ std::string BuildOSCpuInfo() {
#if defined(OS_WIN)
std::string architecture_token;
- if (base::win::GetWOW64Status() == base::win::WOW64_ENABLED) {
+ base::win::OSInfo* os_info = base::win::OSInfo::GetInstance();
+ if (os_info->wow64_status() == base::win::OSInfo::WOW64_ENABLED) {
architecture_token = "; WOW64";
} else {
- base::win::WindowsArchitecture windows_architecture =
- base::win::GetWindowsArchitecture();
- if (windows_architecture == base::win::X64_ARCHITECTURE)
+ base::win::OSInfo::WindowsArchitecture windows_architecture =
+ os_info->architecture();
+ if (windows_architecture == base::win::OSInfo::X64_ARCHITECTURE)
architecture_token = "; Win64; x64";
- else if (windows_architecture == base::win::IA64_ARCHITECTURE)
+ else if (windows_architecture == base::win::OSInfo::IA64_ARCHITECTURE)
architecture_token = "; Win64; IA64";
}
#endif
@@ -89,7 +90,11 @@ std::string BuildOSCpuInfo() {
os_minor_version,
os_bugfix_version
#elif defined(OS_CHROMEOS)
- "CrOS %s %d.%d.%d",
+ "CrOS "
+#if defined(TOUCH_UI)
+ "Touch "
+#endif
+ "%s %d.%d.%d",
cputype.c_str(), // e.g. i686
os_major_version,
os_minor_version,
diff --git a/webkit/glue/webaccessibility.cc b/webkit/glue/webaccessibility.cc
index f6df3b2..615aeda 100644
--- a/webkit/glue/webaccessibility.cc
+++ b/webkit/glue/webaccessibility.cc
@@ -1,9 +1,11 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "webkit/glue/webaccessibility.h"
+#include <set>
+
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/utf_string_conversions.h"
@@ -19,6 +21,7 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebNamedNodeMap.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebNode.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
@@ -328,9 +331,12 @@ void WebAccessibility::Init(const WebKit::WebAccessibilityObject& src,
attributes[ATTR_URL] = src.url().spec().utf16();
WebKit::WebNode node = src.node();
+ bool is_iframe = false;
if (!node.isNull() && node.isElementNode()) {
WebKit::WebElement element = node.to<WebKit::WebElement>();
+ is_iframe = (element.tagName() == ASCIIToUTF16("IFRAME"));
+
// TODO(ctguil): The tagName in WebKit is lower cased but
// HTMLElement::nodeName calls localNameUpper. Consider adding
// a WebElement method that returns the original lower cased tagName.
@@ -380,26 +386,52 @@ void WebAccessibility::Init(const WebKit::WebAccessibilityObject& src,
// Add the source object to the cache and store its id.
id = cache->addOrGetId(src);
- if (role == WebAccessibility::ROLE_EDITABLE_TEXT ||
- role == WebAccessibility::ROLE_TEXTAREA ||
- role == WebAccessibility::ROLE_TEXT_FIELD) {
- include_children = false;
- }
-
if (include_children) {
// Recursively create children.
int child_count = src.childCount();
+ std::set<int32> child_ids;
for (int i = 0; i < child_count; i++) {
WebAccessibilityObject child = src.childAt(i);
+ int32 child_id = cache->addOrGetId(child);
// The child may be invalid due to issues in webkit accessibility code.
- // Don't add children are invalid thus preventing a crash.
+ // Don't add children that are invalid thus preventing a crash.
// https://bugs.webkit.org/show_bug.cgi?id=44149
// TODO(ctguil): We may want to remove this check as webkit stabilizes.
- if (child.isValid())
+ if (!child.isValid())
+ continue;
+
+ // Children may duplicated in the webkit accessibility tree. Only add a
+ // child once for the web accessibility tree.
+ // https://bugs.webkit.org/show_bug.cgi?id=58930
+ if (child_ids.find(child_id) != child_ids.end())
+ continue;
+ child_ids.insert(child_id);
+
+ // Some nodes appear in the tree in more than one place: for example,
+ // a cell in a table appears as a child of both a row and a column.
+ // Only recursively add child nodes that have this node as its
+ // unignored parent. For child nodes that are actually parented to
+ // somethinng else, store only the ID.
+ //
+ // As an exception, also add children of an iframe element.
+ // https://bugs.webkit.org/show_bug.cgi?id=57066
+ if (is_iframe || IsParentUnignoredOf(src, child)) {
children.push_back(WebAccessibility(child, cache, include_children));
+ } else {
+ indirect_child_ids.push_back(child_id);
+ }
}
}
}
+bool WebAccessibility::IsParentUnignoredOf(
+ const WebKit::WebAccessibilityObject& ancestor,
+ const WebKit::WebAccessibilityObject& child) {
+ WebKit::WebAccessibilityObject parent = child.parentObject();
+ while (!parent.isNull() && parent.accessibilityIsIgnored())
+ parent = parent.parentObject();
+ return parent.equals(ancestor);
+}
+
} // namespace webkit_glue
diff --git a/webkit/glue/webaccessibility.h b/webkit/glue/webaccessibility.h
index 081d156..ea4edce 100644
--- a/webkit/glue/webaccessibility.h
+++ b/webkit/glue/webaccessibility.h
@@ -9,7 +9,7 @@
#include <vector>
#include "base/string16.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
+#include "ui/gfx/rect.h"
namespace WebKit {
class WebAccessibilityCache;
@@ -193,11 +193,18 @@ struct WebAccessibility {
~WebAccessibility();
private:
- // Initialize an already-created struct, same as the constructor a
+ // Initialize an already-created struct, same as the constructor above.
void Init(const WebKit::WebAccessibilityObject& src,
WebKit::WebAccessibilityCache* cache,
bool include_children);
+ // Returns true if |ancestor| is the first unignored parent of |child|,
+ // which means that when walking up the parent chain from |child|,
+ // |ancestor| is the *first* ancestor that isn't marked as
+ // accessibilityIsIgnored().
+ bool IsParentUnignoredOf(const WebKit::WebAccessibilityObject& ancestor,
+ const WebKit::WebAccessibilityObject& child);
+
public:
// This is a simple serializable struct. All member variables should be
// copyable.
@@ -206,9 +213,10 @@ struct WebAccessibility {
string16 value;
Role role;
uint32 state;
- WebKit::WebRect location;
+ gfx::Rect location;
std::map<int32, string16> attributes;
std::vector<WebAccessibility> children;
+ std::vector<int32> indirect_child_ids;
std::vector<std::pair<string16, string16> > html_attributes;
};
diff --git a/webkit/glue/webclipboard_impl.cc b/webkit/glue/webclipboard_impl.cc
index b917677..10dddab 100644
--- a/webkit/glue/webclipboard_impl.cc
+++ b/webkit/glue/webclipboard_impl.cc
@@ -10,6 +10,7 @@
#include "googleurl/src/gurl.h"
#include "net/base/escape.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/WebKit/Source/WebKit/chromium/public/WebData.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebImage.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebString.h"
@@ -24,6 +25,7 @@
#endif
using WebKit::WebClipboard;
+using WebKit::WebData;
using WebKit::WebImage;
using WebKit::WebString;
using WebKit::WebURL;
@@ -65,7 +67,15 @@ bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) {
ui::Clipboard::FormatType format_type;
ui::Clipboard::Buffer buffer_type;
+ if (!ConvertBufferType(buffer, &buffer_type))
+ return false;
+
switch (format) {
+ case FormatPlainText:
+ return ClipboardIsFormatAvailable(ui::Clipboard::GetPlainTextFormatType(),
+ buffer_type) ||
+ ClipboardIsFormatAvailable(ui::Clipboard::GetPlainTextWFormatType(),
+ buffer_type);
case FormatHTML:
format_type = ui::Clipboard::GetHtmlFormatType();
break;
@@ -82,9 +92,6 @@ bool WebClipboardImpl::isFormatAvailable(Format format, Buffer buffer) {
return false;
}
- if (!ConvertBufferType(buffer, &buffer_type))
- return false;
-
return ClipboardIsFormatAvailable(format_type, buffer_type);
}
@@ -124,6 +131,16 @@ WebString WebClipboardImpl::readHTML(Buffer buffer, WebURL* source_url) {
return html_stdstr;
}
+WebData WebClipboardImpl::readImage(Buffer buffer) {
+ ui::Clipboard::Buffer buffer_type;
+ if (!ConvertBufferType(buffer, &buffer_type))
+ return WebData();
+
+ std::string png_data;
+ ClipboardReadImage(buffer_type, &png_data);
+ return WebData(png_data);
+}
+
void WebClipboardImpl::writeHTML(
const WebString& html_text, const WebURL& source_url,
const WebString& plain_text, bool write_smart_paste) {
diff --git a/webkit/glue/webclipboard_impl.h b/webkit/glue/webclipboard_impl.h
index ba3e747..c50f38d 100644
--- a/webkit/glue/webclipboard_impl.h
+++ b/webkit/glue/webclipboard_impl.h
@@ -25,6 +25,7 @@ class WebClipboardImpl : public WebKit::WebClipboard {
virtual bool isFormatAvailable(Format, Buffer);
virtual WebKit::WebString readPlainText(Buffer);
virtual WebKit::WebString readHTML(Buffer, WebKit::WebURL* source_url);
+ virtual WebKit::WebData readImage(Buffer);
virtual void writeHTML(
const WebKit::WebString& html_text,
const WebKit::WebURL& source_url,
diff --git a/webkit/glue/webdropdata.cc b/webkit/glue/webdropdata.cc
index 02c1a4c..0a06ac3 100644
--- a/webkit/glue/webdropdata.cc
+++ b/webkit/glue/webdropdata.cc
@@ -15,13 +15,8 @@ using WebKit::WebDragData;
using WebKit::WebString;
using WebKit::WebVector;
-WebDropData::WebDropData(int32 drag_identity)
- : identity(drag_identity) {
-}
-
WebDropData::WebDropData(const WebDragData& drag_data)
- : identity(0),
- url(drag_data.url()),
+ : url(drag_data.url()),
url_title(drag_data.urlTitle()),
download_metadata(drag_data.downloadMetadata()),
file_extension(drag_data.fileExtension()),
@@ -40,8 +35,7 @@ WebDropData::WebDropData(const WebDragData& drag_data)
file_contents.assign(contents.data(), contents.size());
}
-WebDropData::WebDropData()
- : identity(0) {
+WebDropData::WebDropData() {
}
WebDropData::~WebDropData() {
diff --git a/webkit/glue/webdropdata.h b/webkit/glue/webdropdata.h
index d129b06..a9a4ae7 100644
--- a/webkit/glue/webdropdata.h
+++ b/webkit/glue/webdropdata.h
@@ -22,20 +22,13 @@ class WebDragData;
}
struct WebDropData {
- // Construct with a given drag identity. Note: identity is an int32 because
- // it is passed over the renderer NPAPI interface to gears.
- explicit WebDropData(int32 drag_identity);
-
// Construct from a WebDragData object.
explicit WebDropData(const WebKit::WebDragData&);
- // For default constructions, use drag |identity| 0.
WebDropData();
~WebDropData();
- int32 identity;
-
// User is dragging a link into the webview.
GURL url;
string16 url_title; // The title associated with |url|.
diff --git a/webkit/glue/webkit_glue.cc b/webkit/glue/webkit_glue.cc
index 227bfe7..5ba216a 100644
--- a/webkit/glue/webkit_glue.cc
+++ b/webkit/glue/webkit_glue.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -13,7 +13,7 @@
#include "base/lazy_instance.h"
#include "base/logging.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/scoped_ptr.h"
#include "base/string_piece.h"
#include "base/string_tokenizer.h"
#include "base/string_util.h"
diff --git a/webkit/glue/webkit_glue.gypi b/webkit/glue/webkit_glue.gypi
index e742b8f..1b5be84 100644
--- a/webkit/glue/webkit_glue.gypi
+++ b/webkit/glue/webkit_glue.gypi
@@ -11,10 +11,6 @@
'webkit_src_dir': '../../third_party/WebKit',
}],
],
-
- 'grit_info_cmd': ['python', '<(DEPTH)/tools/grit/grit_info.py',
- '<@(grit_defines)'],
- 'grit_cmd': ['python', '<(DEPTH)/tools/grit/grit.py'],
},
'targets': [
{
@@ -28,48 +24,19 @@
{
'action_name': 'webkit_resources',
'variables': {
- 'input_path': './webkit_resources.grd',
+ 'grit_grd_file': 'webkit_resources.grd',
},
- 'inputs': [
- '<!@(<(grit_info_cmd) --inputs <(input_path))',
- ],
- 'outputs': [
- '<!@(<(grit_info_cmd) --outputs \'<(grit_out_dir)\' <(input_path))',
- ],
- 'action': ['<@(grit_cmd)',
- '-i', '<(input_path)', 'build',
- '-o', '<(grit_out_dir)',
- '<@(grit_defines)'],
- 'message': 'Generating resources from <(input_path)',
+ 'includes': [ '../../build/grit_action.gypi' ],
},
{
'action_name': 'webkit_chromium_resources',
'variables': {
- 'input_path': '<(webkit_src_dir)/Source/WebKit/chromium/WebKit.grd',
+ 'grit_grd_file': '<(webkit_src_dir)/Source/WebKit/chromium/WebKit.grd',
},
- 'inputs': [
- '<!@(<(grit_info_cmd) --inputs <(input_path))',
- ],
- 'outputs': [
- '<!@(<(grit_info_cmd) --outputs \'<(grit_out_dir)\' <(input_path))',
- ],
- 'action': ['<@(grit_cmd)',
- '-i', '<(input_path)', 'build',
- '-o', '<(grit_out_dir)',
- '<@(grit_defines)'],
- 'message': 'Generating resources from <(input_path)',
+ 'includes': [ '../../build/grit_action.gypi' ],
},
],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '<(SHARED_INTERMEDIATE_DIR)/webkit',
- ],
- },
- 'conditions': [
- ['OS=="win"', {
- 'dependencies': ['<(DEPTH)/build/win/system.gyp:cygwin'],
- }],
- ],
+ 'includes': [ '../../build/grit_target.gypi' ],
},
{
'target_name': 'webkit_strings',
@@ -82,31 +49,12 @@
{
'action_name': 'webkit_strings',
'variables': {
- 'input_path': './webkit_strings.grd',
+ 'grit_grd_file': 'webkit_strings.grd',
},
- 'inputs': [
- '<!@(<(grit_info_cmd) --inputs <(input_path))',
- ],
- 'outputs': [
- '<!@(<(grit_info_cmd) --outputs \'<(grit_out_dir)\' <(input_path))',
- ],
- 'action': ['<@(grit_cmd)',
- '-i', '<(input_path)', 'build',
- '-o', '<(grit_out_dir)',
- '<@(grit_defines)'],
- 'message': 'Generating resources from <(input_path)',
+ 'includes': [ '../../build/grit_action.gypi' ],
},
],
- 'direct_dependent_settings': {
- 'include_dirs': [
- '<(SHARED_INTERMEDIATE_DIR)/webkit',
- ],
- },
- 'conditions': [
- ['OS=="win"', {
- 'dependencies': ['<(DEPTH)/build/win/system.gyp:cygwin'],
- }],
- ],
+ 'includes': [ '../../build/grit_target.gypi' ],
},
{
'target_name': 'webkit_user_agent',
@@ -159,6 +107,7 @@
'dependencies': [
'<(DEPTH)/app/app.gyp:app_base',
'<(DEPTH)/base/base.gyp:base_i18n',
+ '<(DEPTH)/gpu/gpu.gyp:gpu_common',
'<(DEPTH)/gpu/gpu.gyp:gles2_implementation',
'<(DEPTH)/net/net.gyp:net',
'<(DEPTH)/ppapi/ppapi.gyp:ppapi_shared_impl',
@@ -166,8 +115,6 @@
'<(DEPTH)/skia/skia.gyp:skia',
'<(DEPTH)/third_party/icu/icu.gyp:icui18n',
'<(DEPTH)/third_party/icu/icu.gyp:icuuc',
- '<(DEPTH)/third_party/libjingle/libjingle.gyp:libjingle',
- '<(DEPTH)/third_party/libjingle/libjingle.gyp:libjingle_p2p',
'<(DEPTH)/third_party/npapi/npapi.gyp:npapi',
'<(DEPTH)/ppapi/ppapi.gyp:ppapi_c',
'webkit_resources',
@@ -266,6 +213,8 @@
'../plugins/ppapi/file_path.cc',
'../plugins/ppapi/file_path.h',
'../plugins/ppapi/fullscreen_container.h',
+ '../plugins/ppapi/message_channel.cc',
+ '../plugins/ppapi/message_channel.h',
'../plugins/ppapi/npapi_glue.cc',
'../plugins/ppapi/npapi_glue.h',
'../plugins/ppapi/plugin_delegate.h',
@@ -279,12 +228,18 @@
'../plugins/ppapi/ppapi_webplugin_impl.h',
'../plugins/ppapi/ppb_audio_impl.cc',
'../plugins/ppapi/ppb_audio_impl.h',
+ '../plugins/ppapi/ppb_broker_impl.cc',
+ '../plugins/ppapi/ppb_broker_impl.h',
'../plugins/ppapi/ppb_buffer_impl.cc',
'../plugins/ppapi/ppb_buffer_impl.h',
'../plugins/ppapi/ppb_char_set_impl.cc',
'../plugins/ppapi/ppb_char_set_impl.h',
+ '../plugins/ppapi/ppb_console_impl.cc',
+ '../plugins/ppapi/ppb_console_impl.h',
'../plugins/ppapi/ppb_context_3d_impl.cc',
'../plugins/ppapi/ppb_context_3d_impl.h',
+ '../plugins/ppapi/ppb_crypto_impl.cc',
+ '../plugins/ppapi/ppb_crypto_impl.h',
'../plugins/ppapi/ppb_cursor_control_impl.cc',
'../plugins/ppapi/ppb_cursor_control_impl.h',
'../plugins/ppapi/ppb_directory_reader_impl.cc',
@@ -350,10 +305,12 @@
'../plugins/ppapi/resource_tracker.h',
'../plugins/ppapi/string.cc',
'../plugins/ppapi/string.h',
+ '../plugins/ppapi/usb_code_for_event.cc',
+ '../plugins/ppapi/usb_code_for_event.h',
'../plugins/ppapi/var.cc',
'../plugins/ppapi/var.h',
- '../plugins/ppapi/var_object_class.cc',
- '../plugins/ppapi/var_object_class.h',
+ '../plugins/sad_plugin.cc',
+ '../plugins/sad_plugin.h',
'media/audio_decoder.cc',
'media/audio_decoder.h',
'media/buffered_data_source.cc',
@@ -366,6 +323,8 @@
'media/video_renderer_impl.h',
'media/web_data_source.cc',
'media/web_data_source.h',
+ 'media/web_data_source_factory.cc',
+ 'media/web_data_source_factory.h',
'media/web_video_renderer.h',
'alt_error_page_resource_fetcher.cc',
'alt_error_page_resource_fetcher.h',
@@ -385,6 +344,8 @@
'form_field.h',
'ftp_directory_listing_response_delegate.cc',
'ftp_directory_listing_response_delegate.h',
+ 'gl_bindings_skia_cmd_buffer.cc',
+ 'gl_bindings_skia_cmd_buffer.h',
'glue_serialize.cc',
'glue_serialize.h',
'idb_bindings.cc',
@@ -397,6 +358,7 @@
'multipart_response_delegate.h',
'npruntime_util.cc',
'npruntime_util.h',
+ 'p2p_transport.h',
'password_form.cc',
'password_form.h',
'password_form_dom_manager.cc',
@@ -441,8 +403,6 @@
'webmenuitem.h',
'webmenurunner_mac.h',
'webmenurunner_mac.mm',
- 'webpasswordautocompletelistener_impl.cc',
- 'webpasswordautocompletelistener_impl.h',
'webpreferences.cc',
'webpreferences.h',
'websocketstreamhandle_bridge.h',
@@ -465,8 +425,6 @@
'../extensions/v8/benchmarking_extension.h',
'../extensions/v8/gc_extension.cc',
'../extensions/v8/gc_extension.h',
- '../extensions/v8/gears_extension.cc',
- '../extensions/v8/gears_extension.h',
'../extensions/v8/heap_profiler_extension.cc',
'../extensions/v8/heap_profiler_extension.h',
'../extensions/v8/playback_extension.cc',
@@ -562,26 +520,12 @@
{
'action_name': 'inspector_strings',
'variables': {
- 'input_path': './inspector_strings.grd',
+ 'grit_grd_file': 'inspector_strings.grd',
},
- 'inputs': [
- '<!@(<(grit_info_cmd) --inputs <(input_path))',
- ],
- 'outputs': [
- '<!@(<(grit_info_cmd) --outputs \'<(grit_out_dir)\' <(input_path))',
- ],
- 'action': ['<@(grit_cmd)',
- '-i', '<(input_path)', 'build',
- '-o', '<(grit_out_dir)',
- '<@(grit_defines)'],
- 'message': 'Generating resources from <(input_path)',
+ 'includes': [ '../../build/grit_action.gypi' ],
},
],
- 'conditions': [
- ['OS=="win"', {
- 'dependencies': ['<(DEPTH)/build/win/system.gyp:cygwin'],
- }],
- ],
+ 'includes': [ '../../build/grit_target.gypi' ],
},
],
}],
diff --git a/webkit/glue/webkit_glue.h b/webkit/glue/webkit_glue.h
index c1f45e6..7a8bedb 100644
--- a/webkit/glue/webkit_glue.h
+++ b/webkit/glue/webkit_glue.h
@@ -156,11 +156,6 @@ int GetGlyphPageCount();
//---- BEGIN FUNCTIONS IMPLEMENTED BY EMBEDDER --------------------------------
-// This function is called to request a prefetch of the entire URL, loading it
-// into our cache for (expected) future needs. The given URL may NOT be in
-// canonical form and it will NOT be null-terminated; use the length instead.
-void PrecacheUrl(const char16* url, int url_length);
-
// This function is called to add a line to the application's log file.
void AppendToLog(const char* filename, int line, const char* message);
@@ -188,6 +183,11 @@ ui::Clipboard* ClipboardGetClipboard();
bool ClipboardIsFormatAvailable(const ui::Clipboard::FormatType& format,
ui::Clipboard::Buffer buffer);
+// Reads the available types from the clipboard, if available.
+void ClipboardReadAvailableTypes(ui::Clipboard::Buffer buffer,
+ std::vector<string16>* types,
+ bool* contains_filenames);
+
// Reads UNICODE text from the clipboard, if available.
void ClipboardReadText(ui::Clipboard::Buffer buffer, string16* result);
@@ -198,10 +198,7 @@ void ClipboardReadAsciiText(ui::Clipboard::Buffer buffer, std::string* result);
void ClipboardReadHTML(ui::Clipboard::Buffer buffer, string16* markup,
GURL* url);
-// Reads the available types from the clipboard, if available.
-bool ClipboardReadAvailableTypes(ui::Clipboard::Buffer buffer,
- std::vector<string16>* types,
- bool* contains_filenames);
+void ClipboardReadImage(ui::Clipboard::Buffer buffer, std::string* data);
// Reads one type of data from the clipboard, if available.
bool ClipboardReadData(ui::Clipboard::Buffer buffer, const string16& type,
@@ -265,6 +262,13 @@ void SetCacheMode(bool enabled);
// SSL information should be purged.
void ClearCache(bool preserve_ssl_host_info);
+// Clear the host resolver cache. Used for debugging.
+void ClearHostResolverCache();
+
+// Clear the predictor cache (for DNS prefetch and preconnect). Used for
+// debugging.
+void ClearPredictorCache();
+
// Returns the product version. E.g., Chrome/4.1.333.0
std::string GetProductVersion();
diff --git a/webkit/glue/webkit_resources.grd b/webkit/glue/webkit_resources.grd
index 20b684c..8d4f152 100644
--- a/webkit/glue/webkit_resources.grd
+++ b/webkit/glue/webkit_resources.grd
@@ -53,9 +53,9 @@
<include name="IDR_AUTOFILL_CC_MASTERCARD" file="resources\mastercard.png" type="BINDATA" />
<include name="IDR_AUTOFILL_CC_SOLO" file="resources\solo.png" type="BINDATA" />
<include name="IDR_AUTOFILL_CC_VISA" file="resources\visa.png" type="BINDATA" />
- <include name="IDR_PDF_BUTTON_FTH" file="resources\pdf_button_fth.png" type="BINDATA" />
- <include name="IDR_PDF_BUTTON_FTH_HOVER" file="resources\pdf_button_fth_hover.png" type="BINDATA" />
- <include name="IDR_PDF_BUTTON_FTH_PRESSED" file="resources\pdf_button_fth_pressed.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_FTP" file="resources\pdf_button_ftp.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_FTP_HOVER" file="resources\pdf_button_ftp_hover.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_FTP_PRESSED" file="resources\pdf_button_ftp_pressed.png" type="BINDATA" />
<include name="IDR_PDF_BUTTON_FTW" file="resources\pdf_button_ftw.png" type="BINDATA" />
<include name="IDR_PDF_BUTTON_FTW_HOVER" file="resources\pdf_button_ftw_hover.png" type="BINDATA" />
<include name="IDR_PDF_BUTTON_FTW_PRESSED" file="resources\pdf_button_ftw_pressed.png" type="BINDATA" />
@@ -65,6 +65,12 @@
<include name="IDR_PDF_BUTTON_ZOOMOUT" file="resources\pdf_button_zoomout.png" type="BINDATA" />
<include name="IDR_PDF_BUTTON_ZOOMOUT_HOVER" file="resources\pdf_button_zoomout_hover.png" type="BINDATA" />
<include name="IDR_PDF_BUTTON_ZOOMOUT_PRESSED" file="resources\pdf_button_zoomout_pressed.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_SAVE" file="resources\pdf_button_save.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_SAVE_HOVER" file="resources\pdf_button_save_hover.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_SAVE_PRESSED" file="resources\pdf_button_save_pressed.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_PRINT" file="resources\pdf_button_print.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_PRINT_HOVER" file="resources\pdf_button_print_hover.png" type="BINDATA" />
+ <include name="IDR_PDF_BUTTON_PRINT_PRESSED" file="resources\pdf_button_print_pressed.png" type="BINDATA" />
<include name="IDR_PDF_THUMBNAIL_0" file="resources\pdf_thumbnail_0.png" type="BINDATA" />
<include name="IDR_PDF_THUMBNAIL_1" file="resources\pdf_thumbnail_1.png" type="BINDATA" />
<include name="IDR_PDF_THUMBNAIL_2" file="resources\pdf_thumbnail_2.png" type="BINDATA" />
diff --git a/webkit/glue/webkitclient_impl.cc b/webkit/glue/webkitclient_impl.cc
index 3a47de4..4e2b10a 100644
--- a/webkit/glue/webkitclient_impl.cc
+++ b/webkit/glue/webkitclient_impl.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -13,18 +13,19 @@
#include <vector>
#include "base/debug/trace_event.h"
+#include "base/memory/singleton.h"
#include "base/message_loop.h"
#include "base/metrics/histogram.h"
#include "base/metrics/stats_counters.h"
#include "base/platform_file.h"
#include "base/process_util.h"
#include "base/rand_util.h"
-#include "base/singleton.h"
#include "base/string_number_conversions.h"
#include "base/string_util.h"
#include "base/synchronization/lock.h"
#include "base/time.h"
#include "base/utf_string_conversions.h"
+#include "gpu/common/gpu_trace_event.h"
#include "grit/webkit_chromium_resources.h"
#include "grit/webkit_resources.h"
#include "grit/webkit_strings.h"
@@ -263,34 +264,36 @@ void WebKitClientImpl::histogramCustomCounts(
const char* name, int sample, int min, int max, int bucket_count) {
// Copied from histogram macro, but without the static variable caching
// the histogram because name is dynamic.
- scoped_refptr<base::Histogram> counter =
+ base::Histogram* counter =
base::Histogram::FactoryGet(name, min, max, bucket_count,
base::Histogram::kUmaTargetedHistogramFlag);
DCHECK_EQ(name, counter->histogram_name());
- if (counter.get())
- counter->Add(sample);
+ counter->Add(sample);
}
void WebKitClientImpl::histogramEnumeration(
const char* name, int sample, int boundary_value) {
// Copied from histogram macro, but without the static variable caching
// the histogram because name is dynamic.
- scoped_refptr<base::Histogram> counter =
+ base::Histogram* counter =
base::LinearHistogram::FactoryGet(name, 1, boundary_value,
boundary_value + 1, base::Histogram::kUmaTargetedHistogramFlag);
DCHECK_EQ(name, counter->histogram_name());
- if (counter.get())
- counter->Add(sample);
+ counter->Add(sample);
}
void WebKitClientImpl::traceEventBegin(const char* name, void* id,
const char* extra) {
TRACE_EVENT_BEGIN(name, id, extra);
+ GPU_TRACE_EVENT_BEGIN2("webkit", name,
+ "id", StringPrintf("%p", id).c_str(),
+ "extra", extra ? extra : "");
}
void WebKitClientImpl::traceEventEnd(const char* name, void* id,
const char* extra) {
TRACE_EVENT_END(name, id, extra);
+ GPU_TRACE_EVENT_END0("webkit", name);
}
namespace {
diff --git a/webkit/glue/webmediaplayer_impl.cc b/webkit/glue/webmediaplayer_impl.cc
index eda79f5..e204be6 100644
--- a/webkit/glue/webmediaplayer_impl.cc
+++ b/webkit/glue/webmediaplayer_impl.cc
@@ -5,20 +5,23 @@
#include "webkit/glue/webmediaplayer_impl.h"
#include <limits>
+#include <string>
#include "base/callback.h"
#include "base/command_line.h"
+#include "media/base/composite_data_source_factory.h"
#include "media/base/filter_collection.h"
#include "media/base/limits.h"
#include "media/base/media_format.h"
#include "media/base/media_switches.h"
#include "media/base/pipeline_impl.h"
#include "media/base/video_frame.h"
+#include "media/filters/adaptive_demuxer.h"
#include "media/filters/ffmpeg_audio_decoder.h"
-#include "media/filters/ffmpeg_demuxer.h"
+#include "media/filters/ffmpeg_demuxer_factory.h"
#include "media/filters/ffmpeg_video_decoder.h"
+#include "media/filters/rtc_video_decoder.h"
#include "media/filters/null_audio_renderer.h"
-#include "skia/ext/platform_canvas.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h"
@@ -32,6 +35,7 @@
using WebKit::WebCanvas;
using WebKit::WebRect;
using WebKit::WebSize;
+using media::PipelineStatus;
namespace {
@@ -113,13 +117,13 @@ void WebMediaPlayerImpl::Proxy::SetVideoRenderer(
video_renderer_ = video_renderer;
}
-void WebMediaPlayerImpl::Proxy::AddDataSource(
- scoped_refptr<WebDataSource> data_source) {
- base::AutoLock auto_lock(data_sources_lock_);
- data_sources_.push_back(data_source);
+WebDataSourceBuildObserverHack* WebMediaPlayerImpl::Proxy::GetBuildObserver() {
+ if (!build_observer_.get())
+ build_observer_.reset(NewCallback(this, &Proxy::AddDataSource));
+ return build_observer_.get();
}
-void WebMediaPlayerImpl::Proxy::Paint(skia::PlatformCanvas* canvas,
+void WebMediaPlayerImpl::Proxy::Paint(SkCanvas* canvas,
const gfx::Rect& dest_rect) {
DCHECK(MessageLoop::current() == render_loop_);
if (video_renderer_) {
@@ -170,29 +174,36 @@ void WebMediaPlayerImpl::Proxy::Detach() {
}
}
-void WebMediaPlayerImpl::Proxy::PipelineInitializationCallback() {
- render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &WebMediaPlayerImpl::Proxy::PipelineInitializationTask));
+void WebMediaPlayerImpl::Proxy::PipelineInitializationCallback(
+ PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerImpl::Proxy::PipelineInitializationTask, status));
+}
+
+void WebMediaPlayerImpl::Proxy::PipelineSeekCallback(PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerImpl::Proxy::PipelineSeekTask, status));
}
-void WebMediaPlayerImpl::Proxy::PipelineSeekCallback() {
- render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &WebMediaPlayerImpl::Proxy::PipelineSeekTask));
+void WebMediaPlayerImpl::Proxy::PipelineEndedCallback(PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerImpl::Proxy::PipelineEndedTask, status));
}
-void WebMediaPlayerImpl::Proxy::PipelineEndedCallback() {
- render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &WebMediaPlayerImpl::Proxy::PipelineEndedTask));
+void WebMediaPlayerImpl::Proxy::PipelineErrorCallback(PipelineStatus error) {
+ DCHECK_NE(error, media::PIPELINE_OK);
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerImpl::Proxy::PipelineErrorTask, error));
}
-void WebMediaPlayerImpl::Proxy::PipelineErrorCallback() {
- render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &WebMediaPlayerImpl::Proxy::PipelineErrorTask));
+void WebMediaPlayerImpl::Proxy::NetworkEventCallback(PipelineStatus status) {
+ render_loop_->PostTask(FROM_HERE, NewRunnableMethod(
+ this, &WebMediaPlayerImpl::Proxy::NetworkEventTask, status));
}
-void WebMediaPlayerImpl::Proxy::NetworkEventCallback() {
- render_loop_->PostTask(FROM_HERE, NewRunnableMethod(this,
- &WebMediaPlayerImpl::Proxy::NetworkEventTask));
+void WebMediaPlayerImpl::Proxy::AddDataSource(WebDataSource* data_source) {
+ base::AutoLock auto_lock(data_sources_lock_);
+ data_sources_.push_back(make_scoped_refptr(data_source));
}
void WebMediaPlayerImpl::Proxy::RepaintTask() {
@@ -207,38 +218,39 @@ void WebMediaPlayerImpl::Proxy::RepaintTask() {
}
}
-void WebMediaPlayerImpl::Proxy::PipelineInitializationTask() {
+void WebMediaPlayerImpl::Proxy::PipelineInitializationTask(
+ PipelineStatus status) {
DCHECK(MessageLoop::current() == render_loop_);
if (webmediaplayer_) {
- webmediaplayer_->OnPipelineInitialize();
+ webmediaplayer_->OnPipelineInitialize(status);
}
}
-void WebMediaPlayerImpl::Proxy::PipelineSeekTask() {
+void WebMediaPlayerImpl::Proxy::PipelineSeekTask(PipelineStatus status) {
DCHECK(MessageLoop::current() == render_loop_);
if (webmediaplayer_) {
- webmediaplayer_->OnPipelineSeek();
+ webmediaplayer_->OnPipelineSeek(status);
}
}
-void WebMediaPlayerImpl::Proxy::PipelineEndedTask() {
+void WebMediaPlayerImpl::Proxy::PipelineEndedTask(PipelineStatus status) {
DCHECK(MessageLoop::current() == render_loop_);
if (webmediaplayer_) {
- webmediaplayer_->OnPipelineEnded();
+ webmediaplayer_->OnPipelineEnded(status);
}
}
-void WebMediaPlayerImpl::Proxy::PipelineErrorTask() {
+void WebMediaPlayerImpl::Proxy::PipelineErrorTask(PipelineStatus error) {
DCHECK(MessageLoop::current() == render_loop_);
if (webmediaplayer_) {
- webmediaplayer_->OnPipelineError();
+ webmediaplayer_->OnPipelineError(error);
}
}
-void WebMediaPlayerImpl::Proxy::NetworkEventTask() {
+void WebMediaPlayerImpl::Proxy::NetworkEventTask(PipelineStatus status) {
DCHECK(MessageLoop::current() == render_loop_);
if (webmediaplayer_) {
- webmediaplayer_->OnNetworkEvent();
+ webmediaplayer_->OnNetworkEvent(status);
}
}
@@ -271,8 +283,7 @@ WebMediaPlayerImpl::WebMediaPlayerImpl(
seeking_(false),
playback_rate_(0.0f),
client_(client),
- proxy_(NULL),
- pipeline_stopped_(false, false) {
+ proxy_(NULL) {
// Saves the current message loop.
DCHECK(!main_loop_);
main_loop_ = MessageLoop::current();
@@ -309,25 +320,36 @@ bool WebMediaPlayerImpl::Initialize(
&WebMediaPlayerImpl::Proxy::NetworkEventCallback));
// A simple data source that keeps all data in memory.
- scoped_refptr<SimpleDataSource> simple_data_source(
- new SimpleDataSource(MessageLoop::current(), frame));
+ scoped_ptr<media::DataSourceFactory> simple_data_source_factory(
+ SimpleDataSource::CreateFactory(MessageLoop::current(), frame,
+ proxy_->GetBuildObserver()));
// A sophisticated data source that does memory caching.
- scoped_refptr<BufferedDataSource> buffered_data_source(
- new BufferedDataSource(MessageLoop::current(), frame));
- proxy_->AddDataSource(buffered_data_source);
+ scoped_ptr<media::DataSourceFactory> buffered_data_source_factory(
+ BufferedDataSource::CreateFactory(MessageLoop::current(), frame,
+ proxy_->GetBuildObserver()));
+
+ scoped_ptr<media::CompositeDataSourceFactory> data_source_factory(
+ new media::CompositeDataSourceFactory());
if (use_simple_data_source) {
- filter_collection_->AddDataSource(simple_data_source);
- filter_collection_->AddDataSource(buffered_data_source);
+ data_source_factory->AddFactory(simple_data_source_factory.release());
+ data_source_factory->AddFactory(buffered_data_source_factory.release());
} else {
- filter_collection_->AddDataSource(buffered_data_source);
- filter_collection_->AddDataSource(simple_data_source);
+ data_source_factory->AddFactory(buffered_data_source_factory.release());
+ data_source_factory->AddFactory(simple_data_source_factory.release());
+ }
+
+ scoped_ptr<media::DemuxerFactory> demuxer_factory(
+ new media::FFmpegDemuxerFactory(data_source_factory.release(),
+ pipeline_message_loop));
+ if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kEnableAdaptive)) {
+ demuxer_factory.reset(new media::AdaptiveDemuxerFactory(
+ demuxer_factory.release()));
}
+ filter_collection_->SetDemuxerFactory(demuxer_factory.release());
// Add in the default filter factories.
- filter_collection_->AddDemuxer(new media::FFmpegDemuxer(
- message_loop_factory_->GetMessageLoop("DemuxThread")));
filter_collection_->AddAudioDecoder(new media::FFmpegAudioDecoder(
message_loop_factory_->GetMessageLoop("AudioDecoderThread")));
filter_collection_->AddVideoDecoder(new media::FFmpegVideoDecoder(
@@ -351,8 +373,21 @@ void WebMediaPlayerImpl::load(const WebKit::WebURL& url) {
DCHECK(MessageLoop::current() == main_loop_);
DCHECK(proxy_);
+ if (media::RTCVideoDecoder::IsUrlSupported(url.spec())) {
+ // Remove the default decoder
+ scoped_refptr<media::VideoDecoder> old_videodecoder;
+ filter_collection_->SelectVideoDecoder(&old_videodecoder);
+ media::RTCVideoDecoder* rtc_video_decoder =
+ new media::RTCVideoDecoder(
+ message_loop_factory_->GetMessageLoop("VideoDecoderThread"),
+ url.spec());
+ filter_collection_->AddVideoDecoder(rtc_video_decoder);
+ }
+
// Handle any volume changes that occured before load().
setVolume(GetClient()->volume());
+ // Get the preload value.
+ setPreload(GetClient()->preload());
// Initialize the pipeline.
SetNetworkState(WebKit::WebMediaPlayer::Loading);
@@ -466,10 +501,18 @@ void WebMediaPlayerImpl::setVisible(bool visible) {
return;
}
-bool WebMediaPlayerImpl::setAutoBuffer(bool autoBuffer) {
+#define COMPILE_ASSERT_MATCHING_ENUM(webkit_name, chromium_name) \
+ COMPILE_ASSERT(int(WebKit::WebMediaPlayer::webkit_name) == \
+ int(media::chromium_name), \
+ mismatching_enums)
+COMPILE_ASSERT_MATCHING_ENUM(None, NONE);
+COMPILE_ASSERT_MATCHING_ENUM(MetaData, METADATA);
+COMPILE_ASSERT_MATCHING_ENUM(Auto, AUTO);
+
+void WebMediaPlayerImpl::setPreload(WebKit::WebMediaPlayer::Preload preload) {
DCHECK(MessageLoop::current() == main_loop_);
- return false;
+ pipeline_->SetPreload(static_cast<media::Preload>(preload));
}
bool WebMediaPlayerImpl::totalBytesKnown() {
@@ -481,13 +524,13 @@ bool WebMediaPlayerImpl::totalBytesKnown() {
bool WebMediaPlayerImpl::hasVideo() const {
DCHECK(MessageLoop::current() == main_loop_);
- return pipeline_->IsRendered(media::mime_type::kMajorTypeVideo);
+ return pipeline_->HasVideo();
}
bool WebMediaPlayerImpl::hasAudio() const {
DCHECK(MessageLoop::current() == main_loop_);
- return pipeline_->IsRendered(media::mime_type::kMajorTypeAudio);
+ return pipeline_->HasAudio();
}
WebKit::WebSize WebMediaPlayerImpl::naturalSize() const {
@@ -671,32 +714,28 @@ WebKit::WebMediaPlayer::MovieLoadType
return WebKit::WebMediaPlayer::Unknown;
}
-unsigned WebMediaPlayerImpl::decodedFrameCount() const
-{
+unsigned WebMediaPlayerImpl::decodedFrameCount() const {
DCHECK(MessageLoop::current() == main_loop_);
media::PipelineStatistics stats = pipeline_->GetStatistics();
return stats.video_frames_decoded;
}
-unsigned WebMediaPlayerImpl::droppedFrameCount() const
-{
+unsigned WebMediaPlayerImpl::droppedFrameCount() const {
DCHECK(MessageLoop::current() == main_loop_);
media::PipelineStatistics stats = pipeline_->GetStatistics();
return stats.video_frames_dropped;
}
-unsigned WebMediaPlayerImpl::audioDecodedByteCount() const
-{
+unsigned WebMediaPlayerImpl::audioDecodedByteCount() const {
DCHECK(MessageLoop::current() == main_loop_);
media::PipelineStatistics stats = pipeline_->GetStatistics();
return stats.audio_bytes_decoded;
}
-unsigned WebMediaPlayerImpl::videoDecodedByteCount() const
-{
+unsigned WebMediaPlayerImpl::videoDecodedByteCount() const {
DCHECK(MessageLoop::current() == main_loop_);
media::PipelineStatistics stats = pipeline_->GetStatistics();
@@ -731,9 +770,9 @@ void WebMediaPlayerImpl::Repaint() {
GetClient()->repaint();
}
-void WebMediaPlayerImpl::OnPipelineInitialize() {
+void WebMediaPlayerImpl::OnPipelineInitialize(PipelineStatus status) {
DCHECK(MessageLoop::current() == main_loop_);
- if (pipeline_->GetError() == media::PIPELINE_OK) {
+ if (status == media::PIPELINE_OK) {
// Only keep one time range starting from 0.
WebKit::WebTimeRanges new_buffered(static_cast<size_t>(1));
new_buffered[0].start = 0.0f;
@@ -750,7 +789,7 @@ void WebMediaPlayerImpl::OnPipelineInitialize() {
SetNetworkState(WebKit::WebMediaPlayer::Loaded);
}
} else {
- // TODO(hclam): should use pipeline_->GetError() to determine the state
+ // TODO(hclam): should use |status| to determine the state
// properly and reports error using MediaError.
// WebKit uses FormatError to indicate an error for bogus URL or bad file.
// Since we are at the initialization stage we can safely treat every error
@@ -762,9 +801,9 @@ void WebMediaPlayerImpl::OnPipelineInitialize() {
Repaint();
}
-void WebMediaPlayerImpl::OnPipelineSeek() {
+void WebMediaPlayerImpl::OnPipelineSeek(PipelineStatus status) {
DCHECK(MessageLoop::current() == main_loop_);
- if (pipeline_->GetError() == media::PIPELINE_OK) {
+ if (status == media::PIPELINE_OK) {
// Update our paused time.
if (paused_) {
paused_time_ = pipeline_->GetCurrentTime();
@@ -776,17 +815,20 @@ void WebMediaPlayerImpl::OnPipelineSeek() {
}
}
-void WebMediaPlayerImpl::OnPipelineEnded() {
+void WebMediaPlayerImpl::OnPipelineEnded(PipelineStatus status) {
DCHECK(MessageLoop::current() == main_loop_);
- if (pipeline_->GetError() == media::PIPELINE_OK) {
+ if (status == media::PIPELINE_OK) {
GetClient()->timeChanged();
}
}
-void WebMediaPlayerImpl::OnPipelineError() {
+void WebMediaPlayerImpl::OnPipelineError(PipelineStatus error) {
DCHECK(MessageLoop::current() == main_loop_);
- switch (pipeline_->GetError()) {
+ switch (error) {
case media::PIPELINE_OK:
+ LOG(DFATAL) << "PIPELINE_OK isn't an error!";
+ break;
+
case media::PIPELINE_ERROR_INITIALIZATION_FAILED:
case media::PIPELINE_ERROR_REQUIRED_FILTER_MISSING:
case media::PIPELINE_ERROR_COULD_NOT_RENDER:
@@ -797,6 +839,7 @@ void WebMediaPlayerImpl::OnPipelineError() {
case media::DEMUXER_ERROR_COULD_NOT_PARSE:
case media::DEMUXER_ERROR_NO_SUPPORTED_STREAMS:
case media::DEMUXER_ERROR_COULD_NOT_CREATE_THREAD:
+ case media::DATASOURCE_ERROR_URL_NOT_SUPPORTED:
// Format error.
SetNetworkState(WebMediaPlayer::FormatError);
break;
@@ -816,9 +859,9 @@ void WebMediaPlayerImpl::OnPipelineError() {
Repaint();
}
-void WebMediaPlayerImpl::OnNetworkEvent() {
+void WebMediaPlayerImpl::OnNetworkEvent(PipelineStatus status) {
DCHECK(MessageLoop::current() == main_loop_);
- if (pipeline_->GetError() == media::PIPELINE_OK) {
+ if (status == media::PIPELINE_OK) {
if (pipeline_->IsNetworkActive()) {
SetNetworkState(WebKit::WebMediaPlayer::Loading);
} else {
@@ -863,9 +906,9 @@ void WebMediaPlayerImpl::Destroy() {
// Make sure to kill the pipeline so there's no more media threads running.
// Note: stopping the pipeline might block for a long time.
if (pipeline_) {
- pipeline_->Stop(NewCallback(this,
- &WebMediaPlayerImpl::PipelineStoppedCallback));
- pipeline_stopped_.Wait();
+ media::PipelineStatusNotification note;
+ pipeline_->Stop(note.Callback());
+ note.Wait();
}
message_loop_factory_.reset();
@@ -878,10 +921,6 @@ void WebMediaPlayerImpl::Destroy() {
}
}
-void WebMediaPlayerImpl::PipelineStoppedCallback() {
- pipeline_stopped_.Signal();
-}
-
WebKit::WebMediaPlayerClient* WebMediaPlayerImpl::GetClient() {
DCHECK(MessageLoop::current() == main_loop_);
DCHECK(client_);
diff --git a/webkit/glue/webmediaplayer_impl.h b/webkit/glue/webmediaplayer_impl.h
index cadf4d7..0a492db 100644
--- a/webkit/glue/webmediaplayer_impl.h
+++ b/webkit/glue/webmediaplayer_impl.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -53,9 +53,9 @@
#ifndef WEBKIT_GLUE_WEBMEDIAPLAYER_IMPL_H_
#define WEBKIT_GLUE_WEBMEDIAPLAYER_IMPL_H_
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
-#include "base/ref_counted.h"
-#include "base/scoped_ptr.h"
#include "base/threading/thread.h"
#include "base/synchronization/lock.h"
#include "base/synchronization/waitable_event.h"
@@ -67,6 +67,7 @@
#include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerClient.h"
#include "ui/gfx/rect.h"
#include "ui/gfx/size.h"
+#include "webkit/glue/media/web_data_source.h"
class GURL;
@@ -77,7 +78,6 @@ class WebFrame;
namespace webkit_glue {
class MediaResourceLoaderBridgeFactory;
-class WebDataSource;
class WebVideoRenderer;
class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
@@ -99,10 +99,10 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
// Methods for Filter -> WebMediaPlayerImpl communication.
void Repaint();
void SetVideoRenderer(scoped_refptr<WebVideoRenderer> video_renderer);
- void AddDataSource(scoped_refptr<WebDataSource> data_source);
+ WebDataSourceBuildObserverHack* GetBuildObserver();
// Methods for WebMediaPlayerImpl -> Filter communication.
- void Paint(skia::PlatformCanvas* canvas, const gfx::Rect& dest_rect);
+ void Paint(SkCanvas* canvas, const gfx::Rect& dest_rect);
void SetSize(const gfx::Rect& rect);
void Detach();
void GetCurrentFrame(scoped_refptr<media::VideoFrame>* frame_out);
@@ -111,11 +111,11 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
void AbortDataSources();
// Methods for PipelineImpl -> WebMediaPlayerImpl communication.
- void PipelineInitializationCallback();
- void PipelineSeekCallback();
- void PipelineEndedCallback();
- void PipelineErrorCallback();
- void NetworkEventCallback();
+ void PipelineInitializationCallback(media::PipelineStatus status);
+ void PipelineSeekCallback(media::PipelineStatus status);
+ void PipelineEndedCallback(media::PipelineStatus status);
+ void PipelineErrorCallback(media::PipelineStatus error);
+ void NetworkEventCallback(media::PipelineStatus status);
// Returns the message loop used by the proxy.
MessageLoop* message_loop() { return render_loop_; }
@@ -125,23 +125,27 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
virtual ~Proxy();
+ // Adds a data source to data_sources_.
+ void AddDataSource(WebDataSource* data_source);
+
// Invoke |webmediaplayer_| to perform a repaint.
void RepaintTask();
// Notify |webmediaplayer_| that initialization has finished.
- void PipelineInitializationTask();
+ void PipelineInitializationTask(media::PipelineStatus status);
// Notify |webmediaplayer_| that a seek has finished.
- void PipelineSeekTask();
+ void PipelineSeekTask(media::PipelineStatus status);
// Notify |webmediaplayer_| that the media has ended.
- void PipelineEndedTask();
+ void PipelineEndedTask(media::PipelineStatus status);
- // Notify |webmediaplayer_| that a pipeline error has been set.
- void PipelineErrorTask();
+ // Notify |webmediaplayer_| that a pipeline error has occurred during
+ // playback.
+ void PipelineErrorTask(media::PipelineStatus error);
// Notify |webmediaplayer_| that there's a network event.
- void NetworkEventTask();
+ void NetworkEventTask(media::PipelineStatus status);
// The render message loop where WebKit lives.
MessageLoop* render_loop_;
@@ -150,6 +154,7 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
base::Lock data_sources_lock_;
typedef std::list<scoped_refptr<WebDataSource> > DataSourceList;
DataSourceList data_sources_;
+ scoped_ptr<WebDataSourceBuildObserverHack> build_observer_;
scoped_refptr<WebVideoRenderer> video_renderer_;
@@ -203,7 +208,7 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
virtual void setRate(float rate);
virtual void setVolume(float volume);
virtual void setVisible(bool visible);
- virtual bool setAutoBuffer(bool autoBuffer);
+ virtual void setPreload(WebKit::WebMediaPlayer::Preload preload);
virtual bool totalBytesKnown();
virtual const WebKit::WebTimeRanges& buffered();
virtual float maxTimeSeekable() const;
@@ -257,15 +262,15 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
void Repaint();
- void OnPipelineInitialize();
+ void OnPipelineInitialize(media::PipelineStatus status);
- void OnPipelineSeek();
+ void OnPipelineSeek(media::PipelineStatus status);
- void OnPipelineEnded();
+ void OnPipelineEnded(media::PipelineStatus status);
- void OnPipelineError();
+ void OnPipelineError(media::PipelineStatus error);
- void OnNetworkEvent();
+ void OnNetworkEvent(media::PipelineStatus status);
private:
// Helpers that set the network/ready state and notifies the client if
@@ -276,10 +281,6 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
// Destroy resources held.
void Destroy();
- // Callback executed after |pipeline_| stops which signals Destroy()
- // to continue.
- void PipelineStoppedCallback();
-
// Getter method to |client_|.
WebKit::WebMediaPlayerClient* GetClient();
@@ -323,9 +324,6 @@ class WebMediaPlayerImpl : public WebKit::WebMediaPlayer,
scoped_refptr<Proxy> proxy_;
- // Used to block Destroy() until Pipeline::Stop() is completed.
- base::WaitableEvent pipeline_stopped_;
-
#if WEBKIT_USING_CG
scoped_ptr<skia::PlatformCanvas> skia_canvas_;
#endif
diff --git a/webkit/glue/webmenurunner_mac.h b/webkit/glue/webmenurunner_mac.h
index eccb1ef..e122526 100644
--- a/webkit/glue/webmenurunner_mac.h
+++ b/webkit/glue/webmenurunner_mac.h
@@ -9,7 +9,7 @@
#include <vector>
-#include "base/scoped_nsobject.h"
+#include "base/memory/scoped_nsobject.h"
#include "webkit/glue/webmenuitem.h"
diff --git a/webkit/glue/webpasswordautocompletelistener_impl.cc b/webkit/glue/webpasswordautocompletelistener_impl.cc
deleted file mode 100644
index 20ecf60..0000000
--- a/webkit/glue/webpasswordautocompletelistener_impl.cc
+++ /dev/null
@@ -1,224 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// This file provides the implementaiton of the password manager's autocomplete
-// component.
-
-#include "webkit/glue/webpasswordautocompletelistener_impl.h"
-
-#include <vector>
-
-#include "base/string_util.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebDocument.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebFrame.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebView.h"
-
-using WebKit::WebFrame;
-using WebKit::WebView;
-
-namespace webkit_glue {
-
-WebInputElementDelegate::WebInputElementDelegate() {
-}
-
-WebInputElementDelegate::WebInputElementDelegate(const WebInputElement& element)
- : element_(element) {
-}
-
-WebInputElementDelegate::~WebInputElementDelegate() {
-}
-
-bool WebInputElementDelegate::IsEditable() const {
- return element_.isEnabledFormControl() && !element_.hasAttribute("readonly");
-}
-
-bool WebInputElementDelegate::IsValidValue(const string16& value) {
- return element_.isValidValue(value);
-}
-
-void WebInputElementDelegate::SetValue(const string16& value) {
- element_.setValue(value);
-}
-
-bool WebInputElementDelegate::IsAutofilled() const {
- return element_.isAutofilled();
-}
-
-void WebInputElementDelegate::SetAutofilled(bool autofilled) {
- if (element_.isAutofilled() == autofilled)
- return;
- element_.setAutofilled(autofilled);
- // Notify any changeEvent listeners.
- element_.dispatchFormControlChangeEvent();
-}
-
-void WebInputElementDelegate::SetSelectionRange(size_t start, size_t end) {
- element_.setSelectionRange(start, end);
-}
-
-void WebInputElementDelegate::RefreshAutoFillPopup(
- const std::vector<string16>& suggestions) {
- WebView* webview = element_.document().frame()->view();
- if (webview) {
- std::vector<string16> names;
- std::vector<string16> labels;
- std::vector<string16> icons;
- std::vector<int> unique_ids;
-
- for (size_t i = 0; i < suggestions.size(); ++i) {
- names.push_back(suggestions[i]);
- labels.push_back(string16());
- icons.push_back(string16());
- unique_ids.push_back(0);
- }
-
- webview->applyAutoFillSuggestions(
- element_, names, labels, icons, unique_ids, -1);
- }
-}
-
-void WebInputElementDelegate::HideAutoFillPopup() {
- WebView* webview = element_.document().frame()->view();
- if (webview) {
- webview->hidePopups();
- }
-}
-
-WebPasswordAutocompleteListenerImpl::WebPasswordAutocompleteListenerImpl(
- WebInputElementDelegate* username_delegate,
- WebInputElementDelegate* password_delegate,
- const PasswordFormFillData& data)
- : password_delegate_(password_delegate),
- username_delegate_(username_delegate),
- data_(data) {
-}
-
-WebPasswordAutocompleteListenerImpl::~WebPasswordAutocompleteListenerImpl() {
-}
-
-void WebPasswordAutocompleteListenerImpl::didBlurInputElement(
- const WebString& user_input) {
- // If this listener exists, its because the password manager had more than
- // one match for the password form, which implies it had at least one
- // [preferred] username/password pair.
-// DCHECK(data_.basic_data.values.size() == 2);
-
- if (!password_delegate_->IsEditable())
- return;
-
- string16 user_input16 = user_input;
-
- // If enabled, set the password field to match the current username.
- if (data_.basic_data.fields[0].value() == user_input16) {
- if (password_delegate_->IsValidValue(data_.basic_data.fields[1].value())) {
- // Preferred username/login is selected.
- password_delegate_->SetValue(data_.basic_data.fields[1].value());
- password_delegate_->SetAutofilled(true);
- }
- } else if (data_.additional_logins.find(user_input16) !=
- data_.additional_logins.end()) {
- if (password_delegate_->IsValidValue(
- data_.additional_logins[user_input16])) {
- // One of the extra username/logins is selected.
- password_delegate_->SetValue(data_.additional_logins[user_input16]);
- password_delegate_->SetAutofilled(true);
- }
- }
-}
-
-void WebPasswordAutocompleteListenerImpl::performInlineAutocomplete(
- const WebString& user_input,
- bool backspace_or_delete_pressed,
- bool show_suggestions) {
- // If wait_for_username is true, we only autofill the password when the
- // username field is blurred (i.e not inline) with a matching username string
- // entered.
- if (data_.wait_for_username)
- return;
-
- string16 user_input16 = user_input;
-
- // The input text is being changed, so any autofilled password is now
- // outdated.
- username_delegate_->SetAutofilled(false);
- if (password_delegate_->IsAutofilled()) {
- password_delegate_->SetValue(string16());
- password_delegate_->SetAutofilled(false);
- }
-
- if (show_suggestions && !showSuggestionPopup(user_input16))
- username_delegate_->HideAutoFillPopup();
-
- if (backspace_or_delete_pressed)
- return; // Don't inline autocomplete when the user deleted something.
-
- // Look for any suitable matches to current field text.
- // TODO(timsteele): The preferred login (in basic_data.values) and additional
- // logins could be bundled into the same data structure (possibly even as
- // WebCore strings) upon construction of the PasswordAutocompleteListenerImpl
- // to simplify lookup and save string conversions (see SetValue) on each
- // successful call to OnInlineAutocompleteNeeded.
- if (TryToMatch(user_input16,
- data_.basic_data.fields[0].value(),
- data_.basic_data.fields[1].value())) {
- return;
- }
-
- // Scan additional logins for a match.
- for (PasswordFormFillData::LoginCollection::iterator it =
- data_.additional_logins.begin();
- it != data_.additional_logins.end();
- ++it) {
- if (TryToMatch(user_input16, it->first, it->second))
- return;
- }
-}
-
-bool WebPasswordAutocompleteListenerImpl::showSuggestionPopup(
- const WebString& value) {
- std::vector<string16> suggestions;
- GetSuggestions(value, &suggestions);
- if (suggestions.empty())
- return false;
-
- username_delegate_->RefreshAutoFillPopup(suggestions);
- return true;
-}
-
-bool WebPasswordAutocompleteListenerImpl::TryToMatch(const string16& input,
- const string16& username,
- const string16& password) {
- if (!StartsWith(username, input, false))
- return false;
-
- if (!username_delegate_->IsValidValue(username))
- return false;
-
- // Input matches the username, fill in required values.
- username_delegate_->SetValue(username);
- username_delegate_->SetSelectionRange(input.length(), username.length());
- username_delegate_->SetAutofilled(true);
- if (password_delegate_->IsEditable() &&
- password_delegate_->IsValidValue(password)) {
- password_delegate_->SetValue(password);
- password_delegate_->SetAutofilled(true);
- }
- return true;
-}
-
-void WebPasswordAutocompleteListenerImpl::GetSuggestions(
- const string16& input, std::vector<string16>* suggestions) {
- if (StartsWith(data_.basic_data.fields[0].value(), input, false))
- suggestions->push_back(data_.basic_data.fields[0].value());
-
- for (PasswordFormFillData::LoginCollection::iterator it =
- data_.additional_logins.begin();
- it != data_.additional_logins.end();
- ++it) {
- if (StartsWith(it->first, input, false))
- suggestions->push_back(it->first);
- }
-}
-
-} // namespace webkit_glue
diff --git a/webkit/glue/webpasswordautocompletelistener_impl.h b/webkit/glue/webpasswordautocompletelistener_impl.h
deleted file mode 100644
index 067c6c2..0000000
--- a/webkit/glue/webpasswordautocompletelistener_impl.h
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// A concrete definition of the DOM autocomplete framework defined by
-// autocomplete_input_listener.h, for the password manager.
-
-#ifndef WEBKIT_GLUE_PASSWORDAUTOCOMPLETELISTENER_IMPL_H_
-#define WEBKIT_GLUE_PASSWORDAUTOCOMPLETELISTENER_IMPL_H_
-
-#include "base/basictypes.h"
-#include "base/scoped_ptr.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebInputElement.h"
-#include "third_party/WebKit/Source/WebKit/chromium/public/WebPasswordAutocompleteListener.h"
-#include "webkit/glue/password_form_dom_manager.h"
-
-using WebKit::WebInputElement;
-using WebKit::WebString;
-
-namespace webkit_glue {
-
-// A proxy interface to a WebInputElement for inline autocomplete. The proxy
-// is overridden by webpasswordautocompletelistener_unittest.
-class WebInputElementDelegate {
- public:
- WebInputElementDelegate();
- WebInputElementDelegate(const WebInputElement& element);
- virtual ~WebInputElementDelegate();
-
- // These are virtual to support unit testing.
- virtual bool IsEditable() const;
- virtual bool IsValidValue(const string16& value);
- virtual void SetValue(const string16& value);
- virtual bool IsAutofilled() const;
- virtual void SetAutofilled(bool autofilled);
- virtual void SetSelectionRange(size_t start, size_t end);
- virtual void RefreshAutoFillPopup(const std::vector<string16>& suggestions);
- virtual void HideAutoFillPopup();
-
- private:
- // The underlying DOM element we're wrapping.
- WebInputElement element_;
-
- DISALLOW_COPY_AND_ASSIGN(WebInputElementDelegate);
-};
-
-class WebPasswordAutocompleteListenerImpl :
- public WebKit::WebPasswordAutocompleteListener {
- public:
- WebPasswordAutocompleteListenerImpl(
- WebInputElementDelegate* username_element,
- WebInputElementDelegate* password_element,
- const PasswordFormFillData& data);
- virtual ~WebPasswordAutocompleteListenerImpl();
-
- // WebKit::PasswordAutocompleteListener methods:
- virtual void didBlurInputElement(const WebString& user_input);
- virtual void performInlineAutocomplete(const WebString& user_input,
- bool backspace_or_delete_pressed,
- bool show_suggestions);
- virtual bool showSuggestionPopup(const WebString& value);
-
- private:
- // Check if the input string resembles a potential matching login
- // (username/password) and if so, match them up by autocompleting the edit
- // delegates.
- bool TryToMatch(const string16& input,
- const string16& username,
- const string16& password);
-
- // Scan |data_| for prefix matches of |input| and add each to |suggestions|.
- void GetSuggestions(const string16& input,
- std::vector<string16>* suggestions);
-
- // Access to password field to autocomplete on blur/username updates.
- scoped_ptr<WebInputElementDelegate> password_delegate_;
- scoped_ptr<WebInputElementDelegate> username_delegate_;
-
- // Contains the extra logins for matching on delta/blur.
- PasswordFormFillData data_;
-
- DISALLOW_COPY_AND_ASSIGN(WebPasswordAutocompleteListenerImpl);
-};
-
-} // webkit_glue
-
-#endif // WEBKIT_GLUE_PASSWORD_AUTOCOMPLETE_LISTENER_H_
diff --git a/webkit/glue/webpasswordautocompletelistener_unittest.cc b/webkit/glue/webpasswordautocompletelistener_unittest.cc
deleted file mode 100644
index 2eeb890..0000000
--- a/webkit/glue/webpasswordautocompletelistener_unittest.cc
+++ /dev/null
@@ -1,345 +0,0 @@
-// Copyright (c) 2006-2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-//
-// The PasswordManagerAutocompleteTests in this file test only the
-// PasswordAutocompleteListener class implementation (and not any of the
-// higher level dom autocomplete framework).
-
-#include <string>
-
-#include "base/string_util.h"
-#include "base/utf_string_conversions.h"
-#include "testing/gtest/include/gtest/gtest.h"
-#include "webkit/glue/form_field.h"
-#include "webkit/glue/webpasswordautocompletelistener_impl.h"
-
-using WebKit::WebString;
-using webkit_glue::FormField;
-using webkit_glue::PasswordFormDomManager;
-using webkit_glue::PasswordFormFillData;
-using webkit_glue::WebInputElementDelegate;
-using webkit_glue::WebPasswordAutocompleteListenerImpl;
-
-class TestWebInputElementDelegate : public WebInputElementDelegate {
- public:
- TestWebInputElementDelegate()
- : WebInputElementDelegate(),
- selection_start_(0),
- selection_end_(0),
- is_editable_(true),
- is_valid_(true),
- is_autofilled_(false) {
- }
-
- // Override those methods we implicitly invoke in the tests.
- virtual bool IsEditable() const {
- return is_editable_;
- }
-
- virtual bool IsValidValue(const string16& value) {
- return is_valid_;
- }
-
- virtual void SetValue(const string16& value) {
- value_ = value;
- }
-
- virtual bool IsAutofilled() const { return is_autofilled_; }
-
- virtual void SetAutofilled(bool autofilled) {
- is_autofilled_ = autofilled;
- }
-
- virtual void SetSelectionRange(size_t start, size_t end) {
- selection_start_ = start;
- selection_end_ = end;
- }
-
- // Testing-only methods.
- void set_is_editable(bool editable) {
- is_editable_ = editable;
- }
-
- void set_is_valid(bool valid) {
- is_valid_ = valid;
- }
-
- string16 value() const {
- return value_;
- }
-
- size_t selection_start() const {
- return selection_start_;
- }
-
- size_t selection_end() const {
- return selection_end_;
- }
-
- private:
- string16 value_;
- size_t selection_start_;
- size_t selection_end_;
- bool is_editable_;
- bool is_valid_;
- bool is_autofilled_;
-};
-
-namespace {
-class PasswordManagerAutocompleteTests : public testing::Test {
- public:
- PasswordManagerAutocompleteTests()
- : username_delegate_(NULL),
- password_delegate_(NULL) {
- }
-
- virtual void SetUp() {
- // Add a preferred login and an additional login to the FillData.
- username1_ = ASCIIToUTF16("alice");
- password1_ = ASCIIToUTF16("password");
- username2_ = ASCIIToUTF16("bob");
- password2_ = ASCIIToUTF16("bobsyouruncle");
- data_.basic_data.fields.push_back(FormField(string16(),
- string16(),
- username1_,
- string16(),
- 0,
- false));
- data_.basic_data.fields.push_back(FormField(string16(),
- string16(),
- password1_,
- string16(),
- 0,
- false));
- data_.additional_logins[username2_] = password2_;
-
- username_delegate_ = new TestWebInputElementDelegate();
- password_delegate_ = new TestWebInputElementDelegate();
-
- testing::Test::SetUp();
- }
-
- protected:
- // Create the WebPasswordAutocompleteListener associated with
- // username_delegate_ and password_delegate_, should be called only once at
- // the begining of the test.
- WebKit::WebPasswordAutocompleteListener* CreateListener(
- bool wait_for_username) {
- DCHECK(!listener_.get());
- data_.wait_for_username = wait_for_username;
- listener_.reset(new WebPasswordAutocompleteListenerImpl(username_delegate_,
- password_delegate_,
- data_));
- return listener_.get();
- }
-
- string16 username1_;
- string16 password1_;
- string16 username2_;
- string16 password2_;
- PasswordFormFillData data_;
- TestWebInputElementDelegate* username_delegate_;
- TestWebInputElementDelegate* password_delegate_;
-
- private:
- scoped_ptr<WebPasswordAutocompleteListenerImpl> listener_;
-};
-
-TEST_F(PasswordManagerAutocompleteTests, OnBlur) {
- WebKit::WebPasswordAutocompleteListener* listener = CreateListener(false);
-
- // Make the password field read-only.
- password_delegate_->set_is_editable(false);
- // Simulate a blur event on the username field, but r/o password won't fill.
- listener->didBlurInputElement(username1_);
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
- password_delegate_->set_is_editable(true);
-
- // Simulate a blur event on the username field and expect a password autofill.
- listener->didBlurInputElement(username1_);
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-
- // Now the user goes back and changes the username to something we don't
- // have saved. The password should remain unchanged.
- listener->didBlurInputElement(ASCIIToUTF16("blahblahblah"));
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-
- // Now they type in the additional login username.
- listener->didBlurInputElement(username2_);
- EXPECT_EQ(password2_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-}
-
-TEST_F(PasswordManagerAutocompleteTests, OnInlineAutocompleteNeeded) {
- WebKit::WebPasswordAutocompleteListener* listener = CreateListener(false);
-
- // Simulate the user typing in the first letter of 'alice', a stored username.
- listener->performInlineAutocomplete(ASCIIToUTF16("a"), false, false);
- // Both the username and password delegates should reflect selection
- // of the stored login.
- EXPECT_EQ(username1_, username_delegate_->value());
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
- // And the selection should have been set to 'lice', the last 4 letters.
- EXPECT_EQ(1U, username_delegate_->selection_start());
- EXPECT_EQ(username1_.length(), username_delegate_->selection_end());
- // And both fields should have the autofill style.
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-
- // Now the user types the next letter of the same username, 'l'.
- listener->performInlineAutocomplete(ASCIIToUTF16("al"), false, false);
- // Now the fields should have the same value, but the selection should have a
- // different start value.
- EXPECT_EQ(username1_, username_delegate_->value());
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
- EXPECT_EQ(2U, username_delegate_->selection_start());
- EXPECT_EQ(username1_.length(), username_delegate_->selection_end());
-
- // Now lets say the user goes astray from the stored username and types
- // the letter 'f', spelling 'alf'. We don't know alf (that's just sad),
- // so in practice the username should no longer be 'alice' and the selected
- // range should be empty. In our case, when the autocomplete code doesn't
- // know the text, it won't set the value or the selection and hence our
- // delegate methods won't get called. The WebCore::HTMLInputElement's value
- // and selection would be set directly by WebCore in practice.
-
- // Reset the delegate's test state so we can determine what, if anything,
- // was set during performInlineAutocomplete.
- username_delegate_->SetValue(string16());
- username_delegate_->SetSelectionRange(0, 0);
- listener->performInlineAutocomplete(ASCIIToUTF16("alf"), false, false);
- EXPECT_EQ(0U, username_delegate_->selection_start());
- EXPECT_EQ(0U, username_delegate_->selection_end());
- // Username should not have been filled by us.
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
-
- // Ok, so now the user removes all the text and enters the letter 'b'.
- listener->performInlineAutocomplete(ASCIIToUTF16("b"), false, false);
- // The username and password fields should match the 'bob' entry.
- EXPECT_EQ(username2_, username_delegate_->value());
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_EQ(password2_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
- EXPECT_EQ(1U, username_delegate_->selection_start());
- EXPECT_EQ(username2_.length(), username_delegate_->selection_end());
-}
-
-TEST_F(PasswordManagerAutocompleteTests, TestWaitUsername) {
- // If we had an action authority mismatch (for example), we don't want to
- // automatically autofill anything without some user interaction first.
- // We require an explicit blur on the username field, and that a valid
- // matching username is in the field, before we autofill passwords.
- WebKit::WebPasswordAutocompleteListener* listener = CreateListener(true);
-
- // In all cases, username_delegate should remain empty because we should
- // never modify it when wait_for_username is true; only the user can by
- // typing into (in real life) the HTMLInputElement.
- password_delegate_->SetValue(string16());
- listener->performInlineAutocomplete(ASCIIToUTF16("a"), false, false);
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
- listener->performInlineAutocomplete(ASCIIToUTF16("al"), false, false);
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
- listener->performInlineAutocomplete(ASCIIToUTF16("alice"), false, false);
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
-
- listener->didBlurInputElement(ASCIIToUTF16("a"));
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
- listener->didBlurInputElement(ASCIIToUTF16("ali"));
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
-
- // Blur with 'alice' should allow password autofill.
- listener->didBlurInputElement(ASCIIToUTF16("alice"));
- EXPECT_TRUE(username_delegate_->value().empty());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-}
-
-// Tests that editing the password clears the autofilled password field.
-TEST_F(PasswordManagerAutocompleteTests, TestPasswordClearOnEdit) {
- WebKit::WebPasswordAutocompleteListener* listener = CreateListener(false);
-
- // User enters a known login.
- listener->performInlineAutocomplete(ASCIIToUTF16("alice"), false, false);
- // We are autofilled.
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-
- // User modifies the login name to an unknown one.
- listener->performInlineAutocomplete(ASCIIToUTF16("alicia"), false, false);
- // We should not be autofilled anymore and the password should have been
- // cleared.
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
- EXPECT_TRUE(password_delegate_->value().empty());
-}
-
-// Tests that filling with invalid value for input element does not fill.
-TEST_F(PasswordManagerAutocompleteTests, TestValidValueConditions) {
- WebKit::WebPasswordAutocompleteListener* listener = CreateListener(false);
-
- // User enters a known login that validates ok.
- username_delegate_->set_is_valid(true);
- password_delegate_->set_is_valid(true);
- username_delegate_->SetValue(string16());
- password_delegate_->SetValue(string16());
- listener->performInlineAutocomplete(ASCIIToUTF16("alice"), false, false);
- // We are autofilled.
- EXPECT_EQ(username1_, username_delegate_->value());
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_EQ(password1_, password_delegate_->value());
- EXPECT_TRUE(password_delegate_->IsAutofilled());
-
- // User enters a known login that does not validate.
- username_delegate_->set_is_valid(false);
- password_delegate_->set_is_valid(true);
- username_delegate_->SetValue(string16());
- password_delegate_->SetValue(string16());
- listener->performInlineAutocomplete(ASCIIToUTF16("alice"), false, false);
- // We are not autofilled.
- EXPECT_EQ(string16(), username_delegate_->value());
- EXPECT_FALSE(username_delegate_->IsAutofilled());
- EXPECT_EQ(string16(), password_delegate_->value());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
-
- // User enters a known login that validates ok, but password does not.
- username_delegate_->set_is_valid(true);
- password_delegate_->set_is_valid(false);
- username_delegate_->SetValue(string16());
- password_delegate_->SetValue(string16());
- listener->performInlineAutocomplete(ASCIIToUTF16("alice"), false, false);
- // We are autofilled.
- EXPECT_EQ(username1_, username_delegate_->value());
- EXPECT_TRUE(username_delegate_->IsAutofilled());
- EXPECT_EQ(string16(), password_delegate_->value());
- EXPECT_FALSE(password_delegate_->IsAutofilled());
-}
-
-} // namespace
diff --git a/webkit/glue/webpreferences.cc b/webkit/glue/webpreferences.cc
index ab359a2..a7817a1 100644
--- a/webkit/glue/webpreferences.cc
+++ b/webkit/glue/webpreferences.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -68,10 +68,12 @@ WebPreferences::WebPreferences()
show_fps_counter(false),
asynchronous_spell_checking_enabled(true),
accelerated_compositing_enabled(false),
+ force_compositing_mode(false),
composite_to_texture_enabled(false),
accelerated_layers_enabled(false),
accelerated_video_enabled(false),
accelerated_2d_canvas_enabled(false),
+ accelerated_drawing_enabled(false),
accelerated_plugins_enabled(false),
memory_info_enabled(false),
interactive_form_validation_enabled(true),
@@ -154,9 +156,7 @@ void WebPreferences::Apply(WebView* web_view) const {
// Enable experimental WebGL support if requested on command line
// and support is compiled in.
- bool enable_webgl =
- WebRuntimeFeatures::isWebGLEnabled() && experimental_webgl_enabled;
- settings->setExperimentalWebGLEnabled(enable_webgl);
+ settings->setExperimentalWebGLEnabled(experimental_webgl_enabled);
// Disable GL multisampling if requested on command line.
settings->setOpenGLMultisamplingEnabled(gl_multisampling_enabled);
@@ -175,12 +175,18 @@ void WebPreferences::Apply(WebView* web_view) const {
// Enable gpu-accelerated compositing if requested on the command line.
settings->setAcceleratedCompositingEnabled(accelerated_compositing_enabled);
+ // Always enter compositing if requested on the command line.
+ settings->setForceCompositingMode(force_compositing_mode);
+
// Enable composite to offscreen texture if requested on the command line.
settings->setCompositeToTextureEnabled(composite_to_texture_enabled);
// Enable gpu-accelerated 2d canvas if requested on the command line.
settings->setAccelerated2dCanvasEnabled(accelerated_2d_canvas_enabled);
+ // Enable gpu-accelerated drawing if requested on the command line.
+ settings->setAcceleratedDrawingEnabled(accelerated_drawing_enabled);
+
// Enabling accelerated layers from the command line enabled accelerated
// 3D CSS, Video, and Animations.
settings->setAcceleratedCompositingFor3DTransformsEnabled(
@@ -196,7 +202,7 @@ void WebPreferences::Apply(WebView* web_view) const {
// WebGL and accelerated 2D canvas are always gpu composited.
settings->setAcceleratedCompositingForCanvasEnabled(
- enable_webgl || accelerated_2d_canvas_enabled);
+ experimental_webgl_enabled || accelerated_2d_canvas_enabled);
// Enable memory info reporting to page if requested on the command line.
settings->setMemoryInfoEnabled(memory_info_enabled);
diff --git a/webkit/glue/webpreferences.h b/webkit/glue/webpreferences.h
index 0d37d39..f2ab807 100644
--- a/webkit/glue/webpreferences.h
+++ b/webkit/glue/webpreferences.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
@@ -74,10 +74,12 @@ struct WebPreferences {
bool show_fps_counter;
bool asynchronous_spell_checking_enabled;
bool accelerated_compositing_enabled;
+ bool force_compositing_mode;
bool composite_to_texture_enabled;
bool accelerated_layers_enabled;
bool accelerated_video_enabled;
bool accelerated_2d_canvas_enabled;
+ bool accelerated_drawing_enabled;
bool accelerated_plugins_enabled;
bool memory_info_enabled;
bool interactive_form_validation_enabled;
diff --git a/webkit/glue/websocketstreamhandle_bridge.h b/webkit/glue/websocketstreamhandle_bridge.h
index ee897fd..d051712 100644
--- a/webkit/glue/websocketstreamhandle_bridge.h
+++ b/webkit/glue/websocketstreamhandle_bridge.h
@@ -1,4 +1,4 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -8,7 +8,7 @@
#include <vector>
#include "base/basictypes.h"
-#include "base/ref_counted.h"
+#include "base/memory/ref_counted.h"
class GURL;
diff --git a/webkit/glue/websocketstreamhandle_impl.cc b/webkit/glue/websocketstreamhandle_impl.cc
index d1c7ba0..9e26896 100644
--- a/webkit/glue/websocketstreamhandle_impl.cc
+++ b/webkit/glue/websocketstreamhandle_impl.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -10,8 +10,8 @@
#include "base/compiler_specific.h"
#include "base/logging.h"
-#include "base/ref_counted.h"
-#include "base/scoped_ptr.h"
+#include "base/memory/ref_counted.h"
+#include "base/memory/scoped_ptr.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebData.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURL.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSocketStreamHandleClient.h"
diff --git a/webkit/glue/websocketstreamhandle_impl.h b/webkit/glue/websocketstreamhandle_impl.h
index 81ae68c..e018388 100644
--- a/webkit/glue/websocketstreamhandle_impl.h
+++ b/webkit/glue/websocketstreamhandle_impl.h
@@ -1,11 +1,11 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef WEBKIT_GLUE_WEBSOCKETSTREAMHANDLE_IMPL_H_
#define WEBKIT_GLUE_WEBSOCKETSTREAMHANDLE_IMPL_H_
-#include "base/ref_counted.h"
+#include "base/memory/ref_counted.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSocketStreamHandle.h"
namespace webkit_glue {
diff --git a/webkit/glue/webthemeengine_impl_linux.cc b/webkit/glue/webthemeengine_impl_linux.cc
index 6cdda79..dde3f50 100644
--- a/webkit/glue/webthemeengine_impl_linux.cc
+++ b/webkit/glue/webthemeengine_impl_linux.cc
@@ -1,4 +1,4 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
@@ -7,7 +7,7 @@
#include "skia/ext/platform_canvas.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebSize.h"
-#include "ui/gfx/native_theme_linux.h"
+#include "ui/gfx/native_theme.h"
using WebKit::WebCanvas;
using WebKit::WebColor;
@@ -19,61 +19,61 @@ static gfx::Rect WebRectToRect(const WebRect& rect) {
return gfx::Rect(rect.x, rect.y, rect.width, rect.height);
}
-static gfx::NativeThemeLinux::Part NativeThemePart(
+static gfx::NativeTheme::Part NativeThemePart(
WebKit::WebThemeEngine::Part part) {
switch (part) {
case WebKit::WebThemeEngine::PartScrollbarDownArrow:
- return gfx::NativeThemeLinux::kScrollbarDownArrow;
+ return gfx::NativeTheme::kScrollbarDownArrow;
case WebKit::WebThemeEngine::PartScrollbarLeftArrow:
- return gfx::NativeThemeLinux::kScrollbarLeftArrow;
+ return gfx::NativeTheme::kScrollbarLeftArrow;
case WebKit::WebThemeEngine::PartScrollbarRightArrow:
- return gfx::NativeThemeLinux::kScrollbarRightArrow;
+ return gfx::NativeTheme::kScrollbarRightArrow;
case WebKit::WebThemeEngine::PartScrollbarUpArrow:
- return gfx::NativeThemeLinux::kScrollbarUpArrow;
+ return gfx::NativeTheme::kScrollbarUpArrow;
case WebKit::WebThemeEngine::PartScrollbarHorizontalThumb:
- return gfx::NativeThemeLinux::kScrollbarHorizontalThumb;
+ return gfx::NativeTheme::kScrollbarHorizontalThumb;
case WebKit::WebThemeEngine::PartScrollbarVerticalThumb:
- return gfx::NativeThemeLinux::kScrollbarVerticalThumb;
+ return gfx::NativeTheme::kScrollbarVerticalThumb;
case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack:
- return gfx::NativeThemeLinux::kScrollbarHorizontalTrack;
+ return gfx::NativeTheme::kScrollbarHorizontalTrack;
case WebKit::WebThemeEngine::PartScrollbarVerticalTrack:
- return gfx::NativeThemeLinux::kScrollbarVerticalTrack;
+ return gfx::NativeTheme::kScrollbarVerticalTrack;
case WebKit::WebThemeEngine::PartCheckbox:
- return gfx::NativeThemeLinux::kCheckbox;
+ return gfx::NativeTheme::kCheckbox;
case WebKit::WebThemeEngine::PartRadio:
- return gfx::NativeThemeLinux::kRadio;
+ return gfx::NativeTheme::kRadio;
case WebKit::WebThemeEngine::PartButton:
- return gfx::NativeThemeLinux::kPushButton;
+ return gfx::NativeTheme::kPushButton;
case WebKit::WebThemeEngine::PartTextField:
- return gfx::NativeThemeLinux::kTextField;
+ return gfx::NativeTheme::kTextField;
case WebKit::WebThemeEngine::PartMenuList:
- return gfx::NativeThemeLinux::kMenuList;
+ return gfx::NativeTheme::kMenuList;
case WebKit::WebThemeEngine::PartSliderTrack:
- return gfx::NativeThemeLinux::kSliderTrack;
+ return gfx::NativeTheme::kSliderTrack;
case WebKit::WebThemeEngine::PartSliderThumb:
- return gfx::NativeThemeLinux::kSliderThumb;
+ return gfx::NativeTheme::kSliderThumb;
case WebKit::WebThemeEngine::PartInnerSpinButton:
- return gfx::NativeThemeLinux::kInnerSpinButton;
+ return gfx::NativeTheme::kInnerSpinButton;
case WebKit::WebThemeEngine::PartProgressBar:
- return gfx::NativeThemeLinux::kProgressBar;
+ return gfx::NativeTheme::kProgressBar;
default:
- return gfx::NativeThemeLinux::kScrollbarDownArrow;
+ return gfx::NativeTheme::kScrollbarDownArrow;
}
}
-static gfx::NativeThemeLinux::State NativeThemeState(
+static gfx::NativeTheme::State NativeThemeState(
WebKit::WebThemeEngine::State state) {
switch (state) {
case WebKit::WebThemeEngine::StateDisabled:
- return gfx::NativeThemeLinux::kDisabled;
+ return gfx::NativeTheme::kDisabled;
case WebKit::WebThemeEngine::StateHover:
- return gfx::NativeThemeLinux::kHovered;
+ return gfx::NativeTheme::kHovered;
case WebKit::WebThemeEngine::StateNormal:
- return gfx::NativeThemeLinux::kNormal;
+ return gfx::NativeTheme::kNormal;
case WebKit::WebThemeEngine::StatePressed:
- return gfx::NativeThemeLinux::kPressed;
+ return gfx::NativeTheme::kPressed;
default:
- return gfx::NativeThemeLinux::kDisabled;
+ return gfx::NativeTheme::kDisabled;
}
}
@@ -81,7 +81,7 @@ static void GetNativeThemeExtraParams(
WebKit::WebThemeEngine::Part part,
WebKit::WebThemeEngine::State state,
const WebKit::WebThemeEngine::ExtraParams* extra_params,
- gfx::NativeThemeLinux::ExtraParams* native_theme_extra_params) {
+ gfx::NativeTheme::ExtraParams* native_theme_extra_params) {
switch (part) {
case WebKit::WebThemeEngine::PartScrollbarHorizontalTrack:
case WebKit::WebThemeEngine::PartScrollbarVerticalTrack:
@@ -160,7 +160,7 @@ static void GetNativeThemeExtraParams(
}
WebKit::WebSize WebThemeEngineImpl::getSize(WebKit::WebThemeEngine::Part part) {
- return gfx::NativeThemeLinux::instance()->GetPartSize(NativeThemePart(part));
+ return gfx::NativeTheme::instance()->GetPartSize(NativeThemePart(part));
}
void WebThemeEngineImpl::paint(
@@ -169,10 +169,10 @@ void WebThemeEngineImpl::paint(
WebKit::WebThemeEngine::State state,
const WebKit::WebRect& rect,
const WebKit::WebThemeEngine::ExtraParams* extra_params) {
- gfx::NativeThemeLinux::ExtraParams native_theme_extra_params;
+ gfx::NativeTheme::ExtraParams native_theme_extra_params;
GetNativeThemeExtraParams(
part, state, extra_params, &native_theme_extra_params);
- gfx::NativeThemeLinux::instance()->Paint(
+ gfx::NativeTheme::instance()->Paint(
canvas,
NativeThemePart(part),
NativeThemeState(state),
diff --git a/webkit/glue/webthemeengine_impl_win.cc b/webkit/glue/webthemeengine_impl_win.cc
index a6344b6..5f5d089 100644
--- a/webkit/glue/webthemeengine_impl_win.cc
+++ b/webkit/glue/webthemeengine_impl_win.cc
@@ -1,9 +1,12 @@
-// Copyright (c) 2010 The Chromium Authors. All rights reserved.
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "webkit/glue/webthemeengine_impl_win.h"
+#include <vsstyle.h> // To convert to gfx::NativeTheme::State
+
+#include "base/logging.h"
#include "skia/ext/platform_canvas.h"
#include "skia/ext/skia_utils_win.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebRect.h"
@@ -24,119 +27,462 @@ static RECT WebRectToRECT(const WebRect& rect) {
return result;
}
+static gfx::NativeTheme::State WebButtonStateToGfx(
+ int part,
+ int state,
+ gfx::NativeTheme::ButtonExtraParams* extra) {
+ gfx::NativeTheme::State gfx_state = gfx::NativeTheme::kNormal;
+
+ if (part == BP_PUSHBUTTON) {
+ switch(state) {
+ case PBS_NORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case PBS_HOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case PBS_PRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case PBS_DISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case PBS_DEFAULTED:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = true;
+ break;
+ case PBS_DEFAULTED_ANIMATING:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = true;
+ break;
+ default:
+ NOTREACHED() << "Invalid state: " << state;
+ }
+ } else if (part == BP_RADIOBUTTON) {
+ switch(state) {
+ case RBS_UNCHECKEDNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_UNCHECKEDHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_UNCHECKEDPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_UNCHECKEDDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_CHECKEDNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_CHECKEDHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_CHECKEDPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case RBS_CHECKEDDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ default:
+ NOTREACHED() << "Invalid state: " << state;
+ break;
+ }
+ } else if (part == BP_CHECKBOX) {
+ switch(state) {
+ case CBS_UNCHECKEDNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_UNCHECKEDHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_UNCHECKEDPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_UNCHECKEDDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_CHECKEDNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_CHECKEDHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_CHECKEDPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_CHECKEDDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = true;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_MIXEDNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = true;
+ extra->is_default = false;
+ break;
+ case CBS_MIXEDHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = true;
+ extra->is_default = false;
+ break;
+ case CBS_MIXEDPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = true;
+ extra->is_default = false;
+ break;
+ case CBS_MIXEDDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = true;
+ extra->is_default = false;
+ break;
+ case CBS_IMPLICITNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_IMPLICITHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_IMPLICITPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_IMPLICITDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_EXCLUDEDNORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_EXCLUDEDHOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_EXCLUDEDPRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CBS_EXCLUDEDDISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ default:
+ NOTREACHED() << "Invalid state: " << state;
+ break;
+ }
+ } else if (part == BP_GROUPBOX) {
+ switch(state) {
+ case GBS_NORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case GBS_DISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ default:
+ NOTREACHED() << "Invalid state: " << state;
+ break;
+ }
+ } else if (part == BP_COMMANDLINK) {
+ switch(state) {
+ case CMDLS_NORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLS_HOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLS_PRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLS_DISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLS_DEFAULTED:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = true;
+ break;
+ case CMDLS_DEFAULTED_ANIMATING:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = true;
+ break;
+ default:
+ NOTREACHED() << "Invalid state: " << state;
+ break;
+ }
+ } else if (part == BP_COMMANDLINKGLYPH) {
+ switch(state) {
+ case CMDLGS_NORMAL:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLGS_HOT:
+ gfx_state = gfx::NativeTheme::kHovered;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLGS_PRESSED:
+ gfx_state = gfx::NativeTheme::kPressed;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLGS_DISABLED:
+ gfx_state = gfx::NativeTheme::kDisabled;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = false;
+ break;
+ case CMDLGS_DEFAULTED:
+ gfx_state = gfx::NativeTheme::kNormal;
+ extra->checked = false;
+ extra->indeterminate = false;
+ extra->is_default = true;
+ break;
+ default:
+ NOTREACHED() << "Invalid state: " << state;
+ break;
+ }
+ }
+ return gfx_state;
+}
+
void WebThemeEngineImpl::paintButton(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect) {
- HDC hdc = canvas->beginPlatformPaint();
-
- RECT native_rect = WebRectToRECT(rect);
- gfx::NativeTheme::instance()->PaintButton(
- hdc, part, state, classic_state, &native_rect);
-
- canvas->endPlatformPaint();
+ gfx::NativeTheme::Part native_part = gfx::NativeTheme::kPushButton;
+ switch(part) {
+ case BP_PUSHBUTTON:
+ native_part = gfx::NativeTheme::kPushButton;
+ break;
+ case BP_CHECKBOX:
+ native_part = gfx::NativeTheme::kCheckbox;
+ break;
+ case BP_RADIOBUTTON:
+ native_part = gfx::NativeTheme::kRadio;
+ break;
+ default:
+ break;
+ }
+ gfx::NativeTheme::ExtraParams extra;
+ gfx::NativeTheme::State native_state = WebButtonStateToGfx(part, state,
+ &extra.button);
+ extra.button.classic_state = classic_state;
+ gfx::Rect gfx_rect(rect.x, rect.y, rect.width, rect.height);
+ gfx::NativeTheme::instance()->Paint(canvas, native_part,
+ native_state, gfx_rect, extra);
}
void WebThemeEngineImpl::paintMenuList(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
- gfx::NativeTheme::instance()->PaintMenuList(
+ gfx::NativeThemeWin::instance()->PaintMenuList(
hdc, part, state, classic_state, &native_rect);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintScrollbarArrow(
WebCanvas* canvas, int state, int classic_state,
const WebRect& rect) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
- gfx::NativeTheme::instance()->PaintScrollbarArrow(
+ gfx::NativeThemeWin::instance()->PaintScrollbarArrow(
hdc, state, classic_state, &native_rect);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintScrollbarThumb(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
- gfx::NativeTheme::instance()->PaintScrollbarThumb(
+ gfx::NativeThemeWin::instance()->PaintScrollbarThumb(
hdc, part, state, classic_state, &native_rect);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintScrollbarTrack(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect, const WebRect& align_rect) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
RECT native_align_rect = WebRectToRECT(align_rect);
- gfx::NativeTheme::instance()->PaintScrollbarTrack(
+ gfx::NativeThemeWin::instance()->PaintScrollbarTrack(
hdc, part, state, classic_state, &native_rect, &native_align_rect,
canvas);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintSpinButton(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
- gfx::NativeTheme::instance()->PaintSpinButton(
+ gfx::NativeThemeWin::instance()->PaintSpinButton(
hdc, part, state, classic_state, &native_rect);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintTextField(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect, WebColor color, bool fill_content_area,
bool draw_edges) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
COLORREF c = skia::SkColorToCOLORREF(color);
- gfx::NativeTheme::instance()->PaintTextField(
+ gfx::NativeThemeWin::instance()->PaintTextField(
hdc, part, state, classic_state, &native_rect, c, fill_content_area,
draw_edges);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintTrackbar(
WebCanvas* canvas, int part, int state, int classic_state,
const WebRect& rect) {
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
RECT native_rect = WebRectToRECT(rect);
- gfx::NativeTheme::instance()->PaintTrackbar(
+ gfx::NativeThemeWin::instance()->PaintTrackbar(
hdc, part, state, classic_state, &native_rect, canvas);
- canvas->endPlatformPaint();
+ skia::EndPlatformPaint(canvas);
}
void WebThemeEngineImpl::paintProgressBar(
WebCanvas* canvas, const WebRect& barRect, const WebRect& valueRect,
bool determinate, double animatedSeconds)
{
- HDC hdc = canvas->beginPlatformPaint();
+ HDC hdc = skia::BeginPlatformPaint(canvas);
+
RECT native_bar_rect = WebRectToRECT(barRect);
RECT native_value_rect = WebRectToRECT(valueRect);
- gfx::NativeTheme::instance()->PaintProgressBar(
+ gfx::NativeThemeWin::instance()->PaintProgressBar(
hdc, &native_bar_rect,
&native_value_rect, determinate, animatedSeconds, canvas);
- canvas->endPlatformPaint();
+
+ skia::EndPlatformPaint(canvas);
}
} // namespace webkit_glue
diff --git a/webkit/glue/weburlloader_impl.cc b/webkit/glue/weburlloader_impl.cc
index b86e232..c9df4a8 100644
--- a/webkit/glue/weburlloader_impl.cc
+++ b/webkit/glue/weburlloader_impl.cc
@@ -7,9 +7,9 @@
#include "webkit/glue/weburlloader_impl.h"
#include "base/file_path.h"
+#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
#include "base/process_util.h"
-#include "base/scoped_ptr.h"
#include "base/string_util.h"
#include "base/time.h"
#include "net/base/data_url.h"
@@ -135,6 +135,8 @@ ResourceType::Type FromTargetType(WebURLRequest::TargetType type) {
return ResourceType::SHARED_WORKER;
case WebURLRequest::TargetIsPrefetch:
return ResourceType::PREFETCH;
+ case WebURLRequest::TargetIsFavicon:
+ return ResourceType::FAVICON;
default:
NOTREACHED();
return ResourceType::SUB_RESOURCE;
@@ -157,6 +159,8 @@ bool GetInfoFromDataURL(const GURL& url,
info->charset.swap(charset);
info->security_info.clear();
info->content_length = -1;
+ info->encoded_data_length = 0;
+ info->load_timing.base_time = Time::Now();
return true;
}
@@ -194,22 +198,24 @@ void PopulateURLResponse(
response->setConnectionReused(info.connection_reused);
response->setDownloadFilePath(FilePathToWebString(info.download_file_path));
- WebURLLoadTiming timing;
- timing.initialize();
const ResourceLoadTimingInfo& timing_info = info.load_timing;
- timing.setRequestTime(timing_info.base_time.ToDoubleT());
- timing.setProxyStart(timing_info.proxy_start);
- timing.setProxyEnd(timing_info.proxy_end);
- timing.setDNSStart(timing_info.dns_start);
- timing.setDNSEnd(timing_info.dns_end);
- timing.setConnectStart(timing_info.connect_start);
- timing.setConnectEnd(timing_info.connect_end);
- timing.setSSLStart(timing_info.ssl_start);
- timing.setSSLEnd(timing_info.ssl_end);
- timing.setSendStart(timing_info.send_start);
- timing.setSendEnd(timing_info.send_end);
- timing.setReceiveHeadersEnd(timing_info.receive_headers_end);
- response->setLoadTiming(timing);
+ if (!timing_info.base_time.is_null()) {
+ WebURLLoadTiming timing;
+ timing.initialize();
+ timing.setRequestTime(timing_info.base_time.ToDoubleT());
+ timing.setProxyStart(timing_info.proxy_start);
+ timing.setProxyEnd(timing_info.proxy_end);
+ timing.setDNSStart(timing_info.dns_start);
+ timing.setDNSEnd(timing_info.dns_end);
+ timing.setConnectStart(timing_info.connect_start);
+ timing.setConnectEnd(timing_info.connect_end);
+ timing.setSSLStart(timing_info.ssl_start);
+ timing.setSSLEnd(timing_info.ssl_end);
+ timing.setSendStart(timing_info.send_start);
+ timing.setSendEnd(timing_info.send_end);
+ timing.setReceiveHeadersEnd(timing_info.receive_headers_end);
+ response->setLoadTiming(timing);
+ }
if (info.devtools_info.get()) {
WebHTTPLoadInfo load_info;
@@ -217,6 +223,7 @@ void PopulateURLResponse(
load_info.setHTTPStatusCode(info.devtools_info->http_status_code);
load_info.setHTTPStatusText(WebString::fromUTF8(
info.devtools_info->http_status_text));
+ load_info.setEncodedDataLength(info.encoded_data_length);
const HeadersVector& request_headers = info.devtools_info->request_headers;
for (HeadersVector::const_iterator it = request_headers.begin();
@@ -294,7 +301,9 @@ class WebURLLoaderImpl::Context : public base::RefCounted<Context>,
GURL* new_first_party_for_cookies);
virtual void OnReceivedResponse(const ResourceResponseInfo& info);
virtual void OnDownloadedData(int len);
- virtual void OnReceivedData(const char* data, int len);
+ virtual void OnReceivedData(const char* data,
+ int data_length,
+ int encoded_data_length);
virtual void OnReceivedCachedMetadata(const char* data, int len);
virtual void OnCompletedRequest(const net::URLRequestStatus& status,
const std::string& security_info,
@@ -590,23 +599,25 @@ void WebURLLoaderImpl::Context::OnDownloadedData(int len) {
client_->didDownloadData(loader_, len);
}
-void WebURLLoaderImpl::Context::OnReceivedData(const char* data, int len) {
+void WebURLLoaderImpl::Context::OnReceivedData(const char* data,
+ int data_length,
+ int encoded_data_length) {
if (!client_)
return;
// Temporary logging, see site_isolation_metrics.h/cc.
- SiteIsolationMetrics::SniffCrossOriginHTML(response_url_, data, len);
+ SiteIsolationMetrics::SniffCrossOriginHTML(response_url_, data, data_length);
if (ftp_listing_delegate_.get()) {
// The FTP listing delegate will make the appropriate calls to
// client_->didReceiveData and client_->didReceiveResponse.
- ftp_listing_delegate_->OnReceivedData(data, len);
+ ftp_listing_delegate_->OnReceivedData(data, data_length);
} else if (multipart_delegate_.get()) {
// The multipart delegate will make the appropriate calls to
// client_->didReceiveData and client_->didReceiveResponse.
- multipart_delegate_->OnReceivedData(data, len);
+ multipart_delegate_->OnReceivedData(data, data_length, encoded_data_length);
} else {
- client_->didReceiveData(loader_, data, len);
+ client_->didReceiveData(loader_, data, data_length, encoded_data_length);
}
}
@@ -693,7 +704,7 @@ void WebURLLoaderImpl::Context::HandleDataURL() {
if (GetInfoFromDataURL(request_.url(), &info, &data, &status)) {
OnReceivedResponse(info);
if (!data.empty())
- OnReceivedData(data.data(), data.size());
+ OnReceivedData(data.data(), data.size(), 0);
}
OnCompletedRequest(status, info.security_info, base::Time::Now());
diff --git a/webkit/glue/weburlloader_impl.h b/webkit/glue/weburlloader_impl.h
index 9a39911..44e4e1e 100644
--- a/webkit/glue/weburlloader_impl.h
+++ b/webkit/glue/weburlloader_impl.h
@@ -1,11 +1,11 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved. Use of this
+// Copyright (c) 2011 The Chromium Authors. All rights reserved. Use of this
// source code is governed by a BSD-style license that can be found in the
// LICENSE file.
#ifndef WEBKIT_GLUE_WEBURLLOADER_IMPL_H_
#define WEBKIT_GLUE_WEBURLLOADER_IMPL_H_
-#include "base/ref_counted.h"
+#include "base/memory/ref_counted.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebURLLoader.h"
namespace webkit_glue {
diff --git a/webkit/glue/webvideoframe_impl.h b/webkit/glue/webvideoframe_impl.h
index 0aca052..52f7f1f 100644
--- a/webkit/glue/webvideoframe_impl.h
+++ b/webkit/glue/webvideoframe_impl.h
@@ -8,14 +8,13 @@
#include "media/base/video_frame.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebVideoFrame.h"
-using namespace WebKit;
-
namespace webkit_glue {
-class WebVideoFrameImpl : public WebVideoFrame {
+class WebVideoFrameImpl : public WebKit::WebVideoFrame {
public:
// This converts a WebKit::WebVideoFrame to a media::VideoFrame.
- static media::VideoFrame* toVideoFrame(WebVideoFrame* web_video_frame);
+ static media::VideoFrame* toVideoFrame(
+ WebKit::WebVideoFrame* web_video_frame);
WebVideoFrameImpl(scoped_refptr<media::VideoFrame> video_frame);
virtual ~WebVideoFrameImpl();