Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/child/blink_platform_impl.h" | 5 #include "content/child/blink_platform_impl.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 | 8 |
| 9 #include <vector> | 9 #include <vector> |
| 10 | 10 |
| 11 #include "base/allocator/allocator_extension.h" | 11 #include "base/allocator/allocator_extension.h" |
| 12 #include "base/bind.h" | 12 #include "base/bind.h" |
| 13 #include "base/files/file_path.h" | 13 #include "base/files/file_path.h" |
| 14 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/memory/singleton.h" | 15 #include "base/memory/singleton.h" |
| 16 #include "base/message_loop/message_loop.h" | |
| 17 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 18 #include "base/metrics/sparse_histogram.h" | 17 #include "base/metrics/sparse_histogram.h" |
| 19 #include "base/process/process_metrics.h" | 18 #include "base/process/process_metrics.h" |
| 20 #include "base/rand_util.h" | 19 #include "base/rand_util.h" |
| 21 #include "base/strings/string_number_conversions.h" | 20 #include "base/strings/string_number_conversions.h" |
| 22 #include "base/strings/string_util.h" | 21 #include "base/strings/string_util.h" |
| 23 #include "base/strings/utf_string_conversions.h" | 22 #include "base/strings/utf_string_conversions.h" |
| 24 #include "base/synchronization/lock.h" | 23 #include "base/synchronization/lock.h" |
| 25 #include "base/synchronization/waitable_event.h" | 24 #include "base/synchronization/waitable_event.h" |
| 26 #include "base/sys_info.h" | 25 #include "base/sys_info.h" |
| (...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 411 } | 410 } |
| 412 return -1; | 411 return -1; |
| 413 } | 412 } |
| 414 | 413 |
| 415 BlinkPlatformImpl::BlinkPlatformImpl() | 414 BlinkPlatformImpl::BlinkPlatformImpl() |
| 416 : main_thread_task_runner_(base::MessageLoopProxy::current()), | 415 : main_thread_task_runner_(base::MessageLoopProxy::current()), |
| 417 shared_timer_func_(NULL), | 416 shared_timer_func_(NULL), |
| 418 shared_timer_fire_time_(0.0), | 417 shared_timer_fire_time_(0.0), |
| 419 shared_timer_fire_time_was_set_while_suspended_(false), | 418 shared_timer_fire_time_was_set_while_suspended_(false), |
| 420 shared_timer_suspended_(0), | 419 shared_timer_suspended_(0), |
| 421 current_thread_slot_(&DestroyCurrentThread) { | 420 current_thread_slot_() { |
| 422 InternalInit(); | 421 InternalInit(); |
| 423 } | 422 } |
| 424 | 423 |
| 425 BlinkPlatformImpl::BlinkPlatformImpl( | 424 BlinkPlatformImpl::BlinkPlatformImpl( |
| 426 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) | 425 scoped_refptr<base::SingleThreadTaskRunner> main_thread_task_runner) |
| 427 : main_thread_task_runner_(main_thread_task_runner), | 426 : main_thread_task_runner_(main_thread_task_runner), |
| 428 shared_timer_func_(NULL), | 427 shared_timer_func_(NULL), |
| 429 shared_timer_fire_time_(0.0), | 428 shared_timer_fire_time_(0.0), |
| 430 shared_timer_fire_time_was_set_while_suspended_(false), | 429 shared_timer_fire_time_was_set_while_suspended_(false), |
| 431 shared_timer_suspended_(0), | 430 shared_timer_suspended_(0), |
| 432 current_thread_slot_(&DestroyCurrentThread) { | 431 current_thread_slot_() { |
| 433 // TODO(alexclarke): Use c++11 delegated constructors when allowed. | 432 // TODO(alexclarke): Use c++11 delegated constructors when allowed. |
| 434 InternalInit(); | 433 InternalInit(); |
| 435 } | 434 } |
| 436 | 435 |
| 437 void BlinkPlatformImpl::InternalInit() { | 436 void BlinkPlatformImpl::InternalInit() { |
| 438 // ChildThread may not exist in some tests. | 437 // ChildThread may not exist in some tests. |
| 439 if (ChildThreadImpl::current()) { | 438 if (ChildThreadImpl::current()) { |
| 440 geofencing_provider_.reset(new WebGeofencingProviderImpl( | 439 geofencing_provider_.reset(new WebGeofencingProviderImpl( |
| 441 ChildThreadImpl::current()->thread_safe_sender())); | 440 ChildThreadImpl::current()->thread_safe_sender())); |
| 442 bluetooth_.reset( | 441 bluetooth_.reset( |
| 443 new WebBluetoothImpl(ChildThreadImpl::current()->thread_safe_sender())); | 442 new WebBluetoothImpl(ChildThreadImpl::current()->thread_safe_sender())); |
| 444 thread_safe_sender_ = ChildThreadImpl::current()->thread_safe_sender(); | 443 thread_safe_sender_ = ChildThreadImpl::current()->thread_safe_sender(); |
| 445 notification_dispatcher_ = | 444 notification_dispatcher_ = |
| 446 ChildThreadImpl::current()->notification_dispatcher(); | 445 ChildThreadImpl::current()->notification_dispatcher(); |
| 447 push_dispatcher_ = ChildThreadImpl::current()->push_dispatcher(); | 446 push_dispatcher_ = ChildThreadImpl::current()->push_dispatcher(); |
| 448 } | 447 } |
| 449 | 448 |
| 450 if (main_thread_task_runner_.get()) { | 449 if (main_thread_task_runner_.get()) { |
| 451 shared_timer_.SetTaskRunner(main_thread_task_runner_); | 450 shared_timer_.SetTaskRunner(main_thread_task_runner_); |
| 452 } | 451 } |
| 453 } | 452 } |
| 454 | 453 |
| 454 void BlinkPlatformImpl::UpdateWebThreadTLS(blink::WebThread* thread) { | |
| 455 DCHECK(!current_thread_slot_.Get()); | |
| 456 current_thread_slot_.Set(thread); | |
| 457 } | |
| 458 | |
| 455 BlinkPlatformImpl::~BlinkPlatformImpl() { | 459 BlinkPlatformImpl::~BlinkPlatformImpl() { |
| 456 } | 460 } |
| 457 | 461 |
| 458 WebURLLoader* BlinkPlatformImpl::createURLLoader() { | 462 WebURLLoader* BlinkPlatformImpl::createURLLoader() { |
| 459 ChildThreadImpl* child_thread = ChildThreadImpl::current(); | 463 ChildThreadImpl* child_thread = ChildThreadImpl::current(); |
| 460 // There may be no child thread in RenderViewTests. These tests can still use | 464 // There may be no child thread in RenderViewTests. These tests can still use |
| 461 // data URLs to bypass the ResourceDispatcher. | 465 // data URLs to bypass the ResourceDispatcher. |
| 462 return new WebURLLoaderImpl( | 466 return new WebURLLoaderImpl( |
| 463 child_thread ? child_thread->resource_dispatcher() : NULL, | 467 child_thread ? child_thread->resource_dispatcher() : NULL, |
| 464 MainTaskRunnerForCurrentThread()); | 468 MainTaskRunnerForCurrentThread()); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 492 | 496 |
| 493 bool BlinkPlatformImpl::isReservedIPAddress( | 497 bool BlinkPlatformImpl::isReservedIPAddress( |
| 494 const blink::WebString& host) const { | 498 const blink::WebString& host) const { |
| 495 net::IPAddressNumber address; | 499 net::IPAddressNumber address; |
| 496 if (!net::ParseURLHostnameToNumber(host.utf8(), &address)) | 500 if (!net::ParseURLHostnameToNumber(host.utf8(), &address)) |
| 497 return false; | 501 return false; |
| 498 return net::IsIPAddressReserved(address); | 502 return net::IsIPAddressReserved(address); |
| 499 } | 503 } |
| 500 | 504 |
| 501 blink::WebThread* BlinkPlatformImpl::createThread(const char* name) { | 505 blink::WebThread* BlinkPlatformImpl::createThread(const char* name) { |
| 502 return new WebThreadImpl(name); | 506 WebThreadImpl* thread = new WebThreadImpl(name); |
| 507 thread->TaskRunner()->PostTask( | |
| 508 FROM_HERE, base::Bind(&BlinkPlatformImpl::UpdateWebThreadTLS, | |
| 509 base::Unretained(this), thread)); | |
| 510 return thread; | |
| 503 } | 511 } |
| 504 | 512 |
| 505 blink::WebThread* BlinkPlatformImpl::currentThread() { | 513 blink::WebThread* BlinkPlatformImpl::currentThread() { |
| 506 WebThreadImplForMessageLoop* thread = | 514 return static_cast<blink::WebThread*>(current_thread_slot_.Get()); |
|
kinuko
2015/02/27 09:54:27
Hmm. By looking into the callsites in production c
sadrul
2015/03/01 10:21:38
it looks like it's used in some places to add task
kinuko
2015/03/02 06:08:17
They belong to main thread afaik. (I'm ok to keep
sadrul
2015/03/02 07:43:14
If this is only called on the main thread, then in
kinuko
2015/03/03 00:14:14
This is not really true, it's also called on the w
| |
| 507 static_cast<WebThreadImplForMessageLoop*>(current_thread_slot_.Get()); | |
| 508 if (thread) | |
| 509 return (thread); | |
| 510 | |
| 511 scoped_refptr<base::SingleThreadTaskRunner> task_runner = | |
| 512 MainTaskRunnerForCurrentThread(); | |
| 513 if (!task_runner.get()) | |
| 514 return NULL; | |
| 515 | |
| 516 thread = new WebThreadImplForMessageLoop(task_runner); | |
| 517 current_thread_slot_.Set(thread); | |
| 518 return thread; | |
| 519 } | 515 } |
| 520 | 516 |
| 521 void BlinkPlatformImpl::yieldCurrentThread() { | 517 void BlinkPlatformImpl::yieldCurrentThread() { |
| 522 base::PlatformThread::YieldCurrentThread(); | 518 base::PlatformThread::YieldCurrentThread(); |
| 523 } | 519 } |
| 524 | 520 |
| 525 blink::WebWaitableEvent* BlinkPlatformImpl::createWaitableEvent() { | 521 blink::WebWaitableEvent* BlinkPlatformImpl::createWaitableEvent() { |
| 526 return new WebWaitableEventImpl(); | 522 return new WebWaitableEventImpl(); |
| 527 } | 523 } |
| 528 | 524 |
| (...skipping 722 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1251 scoped_refptr<base::SingleThreadTaskRunner> | 1247 scoped_refptr<base::SingleThreadTaskRunner> |
| 1252 BlinkPlatformImpl::MainTaskRunnerForCurrentThread() { | 1248 BlinkPlatformImpl::MainTaskRunnerForCurrentThread() { |
| 1253 if (main_thread_task_runner_.get() && | 1249 if (main_thread_task_runner_.get() && |
| 1254 main_thread_task_runner_->BelongsToCurrentThread()) { | 1250 main_thread_task_runner_->BelongsToCurrentThread()) { |
| 1255 return main_thread_task_runner_; | 1251 return main_thread_task_runner_; |
| 1256 } else { | 1252 } else { |
| 1257 return base::MessageLoopProxy::current(); | 1253 return base::MessageLoopProxy::current(); |
| 1258 } | 1254 } |
| 1259 } | 1255 } |
| 1260 | 1256 |
| 1261 // static | |
| 1262 void BlinkPlatformImpl::DestroyCurrentThread(void* thread) { | |
| 1263 WebThreadImplForMessageLoop* impl = | |
| 1264 static_cast<WebThreadImplForMessageLoop*>(thread); | |
| 1265 delete impl; | |
| 1266 } | |
| 1267 | |
| 1268 WebString BlinkPlatformImpl::domCodeStringFromEnum(int dom_code) { | 1257 WebString BlinkPlatformImpl::domCodeStringFromEnum(int dom_code) { |
| 1269 return WebString::fromUTF8(ui::KeycodeConverter::DomCodeToCodeString( | 1258 return WebString::fromUTF8(ui::KeycodeConverter::DomCodeToCodeString( |
| 1270 static_cast<ui::DomCode>(dom_code))); | 1259 static_cast<ui::DomCode>(dom_code))); |
| 1271 } | 1260 } |
| 1272 | 1261 |
| 1273 int BlinkPlatformImpl::domEnumFromCodeString(const WebString& code) { | 1262 int BlinkPlatformImpl::domEnumFromCodeString(const WebString& code) { |
| 1274 return static_cast<int>(ui::KeycodeConverter::CodeStringToDomCode( | 1263 return static_cast<int>(ui::KeycodeConverter::CodeStringToDomCode( |
| 1275 code.utf8().data())); | 1264 code.utf8().data())); |
| 1276 } | 1265 } |
| 1277 | 1266 |
| 1278 } // namespace content | 1267 } // namespace content |
| OLD | NEW |