For some reason, I hadn't uploaded a finished patch.
Change-Id: I9d0b31fa1984d7448d87b2e25989fd59eb938b11
Signed-off-by: Arnaud Renevier <a.renevier@samsung.com>
}
void OnReceivedHitTestData(int render_view,
- const _Ewk_Hit_Test& hit_test_data,
- const NodeAttributesMap& node_attributes) {
+ const Hit_Test_Params& params) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
if (!web_view_)
return;
DCHECK(render_view_host);
if (render_view_host && render_view_host->GetRoutingID() == render_view)
- web_view_->UpdateHitTestData(hit_test_data, node_attributes);
+ web_view_->UpdateHitTestData(params);
}
void OnReceivedDidFailLoadWithError(ErrorParams error) {
}
void OnReceivedHitTestAsyncData(int render_view,
- const _Ewk_Hit_Test& hit_test_data,
- const NodeAttributesMap& node_attributes,
const Hit_Test_Params& params,
int64_t request_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
DCHECK(render_view_host);
if (render_view_host && render_view_host->GetRoutingID() == render_view) {
- web_view_->DispatchAsyncHitTestData(hit_test_data,
- node_attributes, params, request_id);
+ web_view_->DispatchAsyncHitTestData(params, request_id);
}
}
typedef std::map<std::string, std::string> NodeAttributesMap;
-/*
-namespace IPC {
-
-template <>
-struct ParamTraits<SkBitmap> {
- static void Write(Message* msg, const SkBitmap& bitmap) {
- if (!msg->WriteInt(bitmap.colorType()))
- return;
- if (!msg->WriteInt(bitmap.alphaType()))
- return;
- if (!msg->WriteInt(bitmap.width()))
- return;
- if (!msg->WriteInt(bitmap.height()))
- return;
- // XXX: should we use mapped memory instead?
- if (!msg->WriteData(static_cast<const char*>(bitmap.getPixels()), bitmap.getSize()))
- return;
- }
-
- static bool Read(const Message* m, PickleIterator* iter, SkBitmap* bitmap) {
- int colorType, alphaType;
- int width, height;
- int data_len;
- const char* data;
-
- if (!iter->ReadInt(&colorType))
- return false;
-
- if (!iter->ReadInt(&alphaType))
- return false;
-
- if (!iter->ReadInt(&width))
- return false;
-
- if (!iter->ReadInt(&height))
- return false;
-
- if (!iter->ReadData(&data, &data_len))
- return false;
-
- bitmap->setInfo(SkImageInfo::Make(width, height, static_cast<SkColorType>(colorType), static_cast<SkAlphaType>(alphaType)), 0);
- bitmap->setPixels(static_cast<void*>(const_cast<char*>(data)));
-
- return true;
- }
-
- static void Log(const SkBitmap&, std::string* l) {
- l->append("<SkBitmap>");
- }
-};
-
-} // namespace IPC
-*/
-
struct Hit_Test_Params {
int context;
std::string linkURI;
IPC_ENUM_TRAITS(Ewk_CSP_Header_Type)
IPC_ENUM_TRAITS(tizen_webview::Hit_Test_Mode)
-IPC_ENUM_TRAITS(tizen_webview::Hit_Test_Result_Context)
-
-IPC_STRUCT_TRAITS_BEGIN(_Ewk_Hit_Test::Hit_Test_Node_Data)
- IPC_STRUCT_TRAITS_MEMBER(tagName)
- IPC_STRUCT_TRAITS_MEMBER(nodeValue)
-IPC_STRUCT_TRAITS_END()
IPC_STRUCT_TRAITS_BEGIN(DidPrintPagesParams)
IPC_STRUCT_TRAITS_MEMBER(metafile_data_handle)
IPC_STRUCT_TRAITS_MEMBER(filename)
IPC_STRUCT_TRAITS_END()
-#if !defined(EWK_BRINGUP)
-IPC_STRUCT_TRAITS_BEGIN(_Ewk_Hit_Test::Hit_Test_Image_Buffer)
- IPC_STRUCT_TRAITS_MEMBER(fileNameExtension)
- IPC_STRUCT_TRAITS_MEMBER(imageBitmap)
-IPC_STRUCT_TRAITS_END()
-#endif
-
-IPC_STRUCT_TRAITS_BEGIN(_Ewk_Hit_Test)
- IPC_STRUCT_TRAITS_MEMBER(context)
- IPC_STRUCT_TRAITS_MEMBER(linkURI)
- IPC_STRUCT_TRAITS_MEMBER(linkLabel)
- IPC_STRUCT_TRAITS_MEMBER(linkTitle)
- IPC_STRUCT_TRAITS_MEMBER(imageURI)
- IPC_STRUCT_TRAITS_MEMBER(mediaURI)
- IPC_STRUCT_TRAITS_MEMBER(isEditable)
- IPC_STRUCT_TRAITS_MEMBER(mode)
- IPC_STRUCT_TRAITS_MEMBER(nodeData)
-// XXX: find a better way to prevent the crash when copying SkBitmap
-#if !defined(EWK_BRINGUP)
- IPC_STRUCT_TRAITS_MEMBER(imageData)
-#endif
-IPC_STRUCT_TRAITS_END()
-
IPC_STRUCT_TRAITS_BEGIN(CacheParamsEfl)
IPC_STRUCT_TRAITS_MEMBER(cache_total_capacity)
IPC_STRUCT_TRAITS_MEMBER(cache_min_dead_capacity)
IPC_MESSAGE_ROUTED1(EwkHostMsg_WrtMessage,
Ewk_Wrt_Message_Data /* data */);
-IPC_MESSAGE_CONTROL3(EwkViewHostMsg_HitTestReply,
+IPC_MESSAGE_CONTROL2(EwkViewHostMsg_HitTestReply,
int, /* render_view_id */
- _Ewk_Hit_Test, /* Ewk Hit test data without node map */
- NodeAttributesMap /* node attributes */)
+ Hit_Test_Params);
-IPC_MESSAGE_CONTROL5(EwkViewHostMsg_HitTestAsyncReply,
+IPC_MESSAGE_CONTROL3(EwkViewHostMsg_HitTestAsyncReply,
int, /* render_view_id */
- _Ewk_Hit_Test, /* Ewk Hit test data without node map */
- NodeAttributesMap, /* node attributes */
Hit_Test_Params,
int64_t /* request id */)
return EINA_FALSE;
}
-void EWebView::DispatchAsyncHitTestData(const _Ewk_Hit_Test& hit_test_data,
- const NodeAttributesMap& node_attributes, const Hit_Test_Params& params, int64_t request_id) {
+void EWebView::DispatchAsyncHitTestData(const Hit_Test_Params& params, int64_t request_id) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
std::map<int64_t, WebViewAsyncRequestHitTestDataCallback*>::iterator it =
if (it == hit_test_callback_.end())
return;
- _Ewk_Hit_Test data = hit_test_data;
- data.nodeData.PopulateNodeAtributes(node_attributes);
scoped_ptr<tizen_webview::Hit_Test> hit_test(new tizen_webview::Hit_Test(params));
it->second->Run(hit_test.get(), this);
ScopedAllowWaitForLegacyWebViewApi allow_wait;
render_view_host->Send(new EwkViewMsg_DoHitTest(render_view_host->GetRoutingID(), x, y, mode));
hit_test_completion_.Wait();
- return new tizen_webview::Hit_Test(hit_test_data_);
+ return new tizen_webview::Hit_Test(hit_test_params_);
}
return NULL;
}
}
-void EWebView::UpdateHitTestData(const _Ewk_Hit_Test& hit_test_data,
- const NodeAttributesMap& node_attributes) {
+void EWebView::UpdateHitTestData(const Hit_Test_Params& params) {
DCHECK(content::BrowserThread::CurrentlyOn(content::BrowserThread::IO));
- hit_test_data_ = hit_test_data;
- hit_test_data_.nodeData.PopulateNodeAtributes(node_attributes);
+ hit_test_params_ = params;
hit_test_completion_.Signal();
}
tizen_webview::Hit_Test_Mode mode,
tizen_webview::View_Hit_Test_Request_Callback,
void* user_data);
- void DispatchAsyncHitTestData(const _Ewk_Hit_Test& hit_test_data, const NodeAttributesMap& node_attributes, const Hit_Test_Params& params, int64_t request_id);
- void UpdateHitTestData(const _Ewk_Hit_Test& hit_test_data, const NodeAttributesMap& node_attributes);
+ void DispatchAsyncHitTestData(const Hit_Test_Params& params, int64_t request_id);
+ void UpdateHitTestData(const Hit_Test_Params& params);
int current_find_request_id() const { return current_find_request_id_; }
bool PlainTextGet(tizen_webview::View_Plain_Text_Get_Callback callback, void* user_data);
double progress_;
mutable std::string title_;
mutable std::string pem_certificate_;
- _Ewk_Hit_Test hit_test_data_;
+ Hit_Test_Params hit_test_params_;
base::WaitableEvent hit_test_completion_;
IDMap<MHTMLCallbackDetails, IDMapOwnPointer> mhtml_callback_map_;
double page_scale_factor_;
eina_stringshare_del(static_cast<Eina_Stringshare*>(data));
}
-_Ewk_Hit_Test::_Ewk_Hit_Test()
- : context(TW_HIT_TEST_RESULT_CONTEXT_DOCUMENT),
- isEditable(false),
- mode(TW_HIT_TEST_MODE_DEFAULT) {
-}
-
-_Ewk_Hit_Test::_Ewk_Hit_Test(const _Ewk_Hit_Test& other)
- : context(other.context),
- linkURI(other.linkURI),
- linkTitle(other.linkTitle),
- linkLabel(other.linkLabel),
- imageURI(other.imageURI),
- mediaURI(other.mediaURI),
- isEditable(other.isEditable),
- mode(other.mode),
- nodeData(other.nodeData),
- imageData(other.imageData) {
-}
-
_Ewk_Hit_Test::_Ewk_Hit_Test(const Hit_Test_Params& params)
: context(static_cast<tizen_webview::Hit_Test_Result_Context>(params.context)),
linkURI(params.linkURI),
imageURI(params.imageURI),
mediaURI(params.mediaURI),
isEditable(params.isEditable),
- mode(static_cast<tizen_webview::Hit_Test_Mode>(params.mode)) {
- nodeData.tagName = params.nodeData.tagName;
- nodeData.nodeValue = params.nodeData.nodeValue;
- imageData.fileNameExtension = params.imageData.fileNameExtension;
- params.imageData.imageBitmap.deepCopyTo(&(imageData.imageBitmap));
+ mode(static_cast<tizen_webview::Hit_Test_Mode>(params.mode)),
+ nodeData(params.nodeData),
+ imageData(params.imageData) {
+}
- const NodeAttributesMap& nodeAttributes = params.nodeData.attributes;
+_Ewk_Hit_Test::Hit_Test_Node_Data::Hit_Test_Node_Data(const Hit_Test_Params::Node_Data& data)
+ : tagName(data.tagName),
+ nodeValue(data.nodeValue),
+ attributeHash(NULL) {
+ const NodeAttributesMap& nodeAttributes = data.attributes;
if (!nodeAttributes.empty()) {
- nodeData.attributeHash = eina_hash_string_superfast_new(FreeHitTestAttributeHashData);
+ attributeHash = eina_hash_string_superfast_new(FreeHitTestAttributeHashData);
NodeAttributesMap::const_iterator attributeMapEnd = nodeAttributes.end();
for (NodeAttributesMap::const_iterator it = nodeAttributes.begin(); it != attributeMapEnd; ++it) {
- eina_hash_add(nodeData.attributeHash, it->first.c_str(), eina_stringshare_add(it->second.c_str()));
+ eina_hash_add(attributeHash, it->first.c_str(), eina_stringshare_add(it->second.c_str()));
}
}
-
-}
-
-_Ewk_Hit_Test::Hit_Test_Node_Data::Hit_Test_Node_Data()
- : attributeHash(NULL) {
-}
-
-// deep copy of node map
-_Ewk_Hit_Test::Hit_Test_Node_Data::Hit_Test_Node_Data(const Hit_Test_Node_Data& other)
- : tagName(other.tagName),
- nodeValue(other.nodeValue),
- attributeHash(NULL) {
- if (!other.attributeHash)
- return;
-
- Eina_Iterator* it = eina_hash_iterator_tuple_new(other.attributeHash);
- void* data;
- attributeHash = eina_hash_string_superfast_new(FreeHitTestAttributeHashData);
- while (eina_iterator_next(it, &data)) {
- Eina_Hash_Tuple* t = static_cast<Eina_Hash_Tuple*>(data);
- eina_hash_add(attributeHash,
- static_cast<const char*>(t->key), eina_stringshare_add(static_cast<const char*>(t->data)));
- }
- eina_iterator_free(it);
}
_Ewk_Hit_Test::Hit_Test_Node_Data::~Hit_Test_Node_Data() {
eina_hash_free(attributeHash);
}
-void _Ewk_Hit_Test::Hit_Test_Node_Data::PopulateNodeAtributes(const NodeAttributesMap& nodeAttributes) {
- if (nodeAttributes.empty())
- return;
-
- attributeHash = eina_hash_string_superfast_new(FreeHitTestAttributeHashData);
- NodeAttributesMap::const_iterator attributeMapEnd = nodeAttributes.end();
- for (NodeAttributesMap::const_iterator it = nodeAttributes.begin(); it != attributeMapEnd; ++it) {
- eina_hash_add(attributeHash, it->first.c_str(), eina_stringshare_add(it->second.c_str()));
- }
-}
-
-_Ewk_Hit_Test::Hit_Test_Image_Buffer::Hit_Test_Image_Buffer() {
-}
-
//(warning) deep copy of skia buffer.
-_Ewk_Hit_Test::Hit_Test_Image_Buffer::Hit_Test_Image_Buffer(const Hit_Test_Image_Buffer& other)
- : fileNameExtension(other.fileNameExtension) {
- other.imageBitmap.deepCopyTo(&imageBitmap);
+_Ewk_Hit_Test::Hit_Test_Image_Buffer::Hit_Test_Image_Buffer(const Hit_Test_Params::Image_Data& data):
+ fileNameExtension(data.fileNameExtension) {
+ data.imageBitmap.deepCopyTo(&(imageBitmap));
}
// Use compiler generated constructor and destructor
// Structure used to report hit test result
struct _Ewk_Hit_Test {
- _Ewk_Hit_Test();
- _Ewk_Hit_Test(const _Ewk_Hit_Test& other);
- _Ewk_Hit_Test(const Hit_Test_Params& params);
- // TODO: check whether bitwise assignment is acceptable (e.g, attributeHash)
- // If not, proper implementation for below should be added:
- // _Ewk_Hit_Test& operator=(const _Ewk_Hit_Test&);
- // Note: Currently the operation is used in EwebView::UpdateHitTestData().
+ explicit _Ewk_Hit_Test(const Hit_Test_Params& params);
tizen_webview::Hit_Test_Result_Context context;
std::string linkURI;
// store node attributes in a map
struct Hit_Test_Node_Data {
- Hit_Test_Node_Data();
- Hit_Test_Node_Data(const Hit_Test_Node_Data& other);
+ explicit Hit_Test_Node_Data(const Hit_Test_Params::Node_Data& data);
~Hit_Test_Node_Data();
- void PopulateNodeAtributes(const NodeAttributesMap& nodeAttributes);
std::string tagName; // tag name for hit element
std::string nodeValue; // node value for hit element
// when hit node is image we need to store image buffer and filename extension
struct Hit_Test_Image_Buffer {
- Hit_Test_Image_Buffer();
- Hit_Test_Image_Buffer(const Hit_Test_Image_Buffer& other);
+ explicit Hit_Test_Image_Buffer(const Hit_Test_Params::Image_Data& data);
std::string fileNameExtension; // image filename extension for hit element
SkBitmap imageBitmap; // image pixels data
return parsing_status;
}
-void PopulateEwkHitTestData(const blink::WebHitTestResult& web_hit_test, _Ewk_Hit_Test* ewk_hit_test, Hit_Test_Params* params)
+void PopulateEwkHitTestData(const blink::WebHitTestResult& web_hit_test, Hit_Test_Params* params)
{
- DCHECK(ewk_hit_test);
- ewk_hit_test->imageURI = web_hit_test.absoluteImageURL().string().utf8();
- ewk_hit_test->linkURI = web_hit_test.absoluteLinkURL().string().utf8();
- ewk_hit_test->mediaURI = web_hit_test.absoluteMediaURL().string().utf8();
- ewk_hit_test->linkLabel = web_hit_test.textContent().utf8();
- ewk_hit_test->linkTitle = web_hit_test.titleDisplayString().utf8();
- ewk_hit_test->isEditable = web_hit_test.isContentEditable();
-
+ DCHECK(params);
params->imageURI = web_hit_test.absoluteImageURL().string().utf8();
params->linkURI = web_hit_test.absoluteLinkURL().string().utf8();
params->mediaURI = web_hit_test.absoluteMediaURL().string().utf8();
if (web_hit_test.node().isTextNode())
context |= TW_HIT_TEST_RESULT_CONTEXT_TEXT;
- ewk_hit_test->context = static_cast<tizen_webview::Hit_Test_Result_Context>(context);
- ewk_hit_test->nodeData.attributeHash = 0;
-
params->context = static_cast<tizen_webview::Hit_Test_Result_Context>(context);
- if (ewk_hit_test->mode & TW_HIT_TEST_MODE_NODE_DATA) {
- ewk_hit_test->nodeData.tagName = web_hit_test.node().nodeName().utf8();
- ewk_hit_test->nodeData.nodeValue = web_hit_test.node().nodeValue().utf8();
+ if (params->mode & TW_HIT_TEST_MODE_NODE_DATA) {
params->nodeData.tagName = web_hit_test.node().nodeName().utf8();
params->nodeData.nodeValue = web_hit_test.node().nodeValue().utf8();
}
- if ((ewk_hit_test->mode & TW_HIT_TEST_MODE_IMAGE_DATA) &&
- (ewk_hit_test->context & TW_HIT_TEST_RESULT_CONTEXT_IMAGE)) {
+ if ((params->mode & TW_HIT_TEST_MODE_IMAGE_DATA) &&
+ (params->context & TW_HIT_TEST_RESULT_CONTEXT_IMAGE)) {
blink::WebElement hit_element = web_hit_test.node().toConst<blink::WebElement>();
- ewk_hit_test->imageData.imageBitmap = hit_element.imageContents().getSkBitmap();
- ewk_hit_test->imageData.fileNameExtension = hit_element.imageFilenameExtension().utf8();
params->imageData.imageBitmap = hit_element.imageContents().getSkBitmap();
params->imageData.fileNameExtension = hit_element.imageFilenameExtension().utf8();
}
void PopulateNodeAttributesMapFromHitTest(const blink::WebHitTestResult& web_hit_test,
- NodeAttributesMap* attributes,
Hit_Test_Params* params)
{
- DCHECK(attributes && params);
+ DCHECK(params);
if (!web_hit_test.node().isElementNode())
return;
blink::WebElement hit_element = web_hit_test.node().toConst<blink::WebElement>();
for (unsigned int i = 0; i < hit_element.attributeCount(); i++) {
- attributes->insert(std::pair<std::string, std::string>(
- hit_element.attributeLocalName(i).utf8(), hit_element.attributeValue(i).utf8()));
params->nodeData.attributes.insert(std::pair<std::string, std::string>(
hit_element.attributeLocalName(i).utf8(), hit_element.attributeValue(i).utf8()));
}
void RenderViewObserverEfl::OnDoHitTest(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode)
{
- _Ewk_Hit_Test hit_test_result;
- NodeAttributesMap attributes;
Hit_Test_Params params;
- if (DoHitTest(view_x, view_y, mode, &hit_test_result, &attributes, ¶ms)) {
- Send(new EwkViewHostMsg_HitTestReply(routing_id(), hit_test_result, attributes));
+ if (DoHitTest(view_x, view_y, mode, ¶ms)) {
+ Send(new EwkViewHostMsg_HitTestReply(routing_id(), params));
}
}
void RenderViewObserverEfl::OnDoHitTestAsync(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode, int64_t request_id)
{
- _Ewk_Hit_Test hit_test_result;
- NodeAttributesMap attributes;
Hit_Test_Params params;
- if (DoHitTest(view_x, view_y, mode, &hit_test_result, &attributes, ¶ms)) {
- Send(new EwkViewHostMsg_HitTestAsyncReply(routing_id(), hit_test_result, attributes, params, request_id));
+ if (DoHitTest(view_x, view_y, mode, ¶ms)) {
+ Send(new EwkViewHostMsg_HitTestAsyncReply(routing_id(), params, request_id));
}
}
-bool RenderViewObserverEfl::DoHitTest(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode, _Ewk_Hit_Test* hit_test_result, NodeAttributesMap* attributes, Hit_Test_Params* params)
+bool RenderViewObserverEfl::DoHitTest(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode, Hit_Test_Params* params)
{
- DCHECK(hit_test_result);
- DCHECK(attributes);
DCHECK(params);
if (!render_view() || !render_view()->GetWebView())
if (web_hit_test_result.node().isNull())
return false;
- hit_test_result->mode = mode;
params->mode = mode;
- PopulateEwkHitTestData(web_hit_test_result, hit_test_result, params);
- if (hit_test_result->mode & TW_HIT_TEST_MODE_NODE_DATA)
- PopulateNodeAttributesMapFromHitTest(web_hit_test_result, attributes, params);
+ PopulateEwkHitTestData(web_hit_test_result, params);
+ if (params->mode & TW_HIT_TEST_MODE_NODE_DATA)
+ PopulateNodeAttributesMapFromHitTest(web_hit_test_result, params);
return true;
}
void OnGetSelectionStyle();
void OnDoHitTest(int x, int y, tizen_webview::Hit_Test_Mode mode);
void OnDoHitTestAsync(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode, int64_t request_id);
- bool DoHitTest(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode, _Ewk_Hit_Test* hit_test_result, NodeAttributesMap* attributes, Hit_Test_Params* params);
+ bool DoHitTest(int view_x, int view_y, tizen_webview::Hit_Test_Mode mode, Hit_Test_Params* params);
void OnPrintToPdf(int width, int height, const base::FilePath& filename);
void OnGetMHTMLData(int callback_id);
void OnSetDrawsTransparentBackground(bool enabled);
namespace tizen_webview {
-Hit_Test::Hit_Test()
- : impl (new _Ewk_Hit_Test) {
-}
-
-Hit_Test::Hit_Test(const Hit_Test& other)
- : impl (new _Ewk_Hit_Test(*other.impl)) {
-}
-
-Hit_Test::Hit_Test(const Hit_Test_Impl& impl_)
- : impl (new _Ewk_Hit_Test(impl_)) {
-}
-
Hit_Test::Hit_Test(const Hit_Test_Params& params)
: impl (new _Ewk_Hit_Test(params)) {
}
delete impl;
}
-Hit_Test& Hit_Test::operator=(const Hit_Test& other) {
- if (this != &other) {
- Hit_Test temp (other);
- Swap(temp);
- }
- return *this;
-}
-
-void Hit_Test::Swap(Hit_Test& other) {
- std::swap(impl, other.impl);
-}
-
tizen_webview::Hit_Test_Result_Context Hit_Test::GetResultContext() const {
return impl->context;
}
class Hit_Test {
public:
- Hit_Test();
- Hit_Test(const Hit_Test& other);
- Hit_Test(const Hit_Test_Params& params);
+ explicit Hit_Test(const Hit_Test_Params& params);
~Hit_Test();
- Hit_Test& operator=(const Hit_Test& other);
Hit_Test_Result_Context GetResultContext() const;
typedef _Ewk_Hit_Test Hit_Test_Impl;
Hit_Test_Impl* impl;
- // construct directly from the impl class;
- explicit Hit_Test(const Hit_Test_Impl& impl_);
-
- // utility function
- void Swap(Hit_Test& other);
-
friend class ::EWebView;
};