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 "base/basictypes.h" | 5 #include "base/basictypes.h" |
6 #include "base/bind.h" | 6 #include "base/bind.h" |
7 #include "mojo/examples/keyboard/keyboard.mojom.h" | 7 #include "mojo/examples/keyboard/keyboard.mojom.h" |
8 #include "mojo/examples/window_manager/debug_panel.h" | 8 #include "mojo/examples/window_manager/debug_panel.h" |
9 #include "mojo/examples/window_manager/window_manager.mojom.h" | 9 #include "mojo/examples/window_manager/window_manager.mojom.h" |
10 #include "mojo/public/cpp/application/application_connection.h" | 10 #include "mojo/public/cpp/application/application_connection.h" |
(...skipping 294 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 // Overridden from DebugPanel::Delegate: | 305 // Overridden from DebugPanel::Delegate: |
306 virtual void CloseTopWindow() OVERRIDE { | 306 virtual void CloseTopWindow() OVERRIDE { |
307 if (!windows_.empty()) | 307 if (!windows_.empty()) |
308 CloseWindow(windows_.back()->id()); | 308 CloseWindow(windows_.back()->id()); |
309 } | 309 } |
310 | 310 |
311 virtual void RequestNavigate( | 311 virtual void RequestNavigate( |
312 uint32 source_view_id, | 312 uint32 source_view_id, |
313 Target target, | 313 Target target, |
314 NavigationDetailsPtr nav_details) OVERRIDE { | 314 NavigationDetailsPtr nav_details) OVERRIDE { |
315 launcher_->Launch(nav_details.Pass(), | 315 OnLaunch(source_view_id, target, nav_details->request->url); |
316 base::Bind(&WindowManager::OnLaunch, | |
317 base::Unretained(this), | |
318 source_view_id, | |
319 target)); | |
320 } | 316 } |
321 | 317 |
322 private: | 318 private: |
323 // Overridden from ApplicationDelegate: | 319 // Overridden from ApplicationDelegate: |
324 virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { | 320 virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { |
325 app_ = app; | 321 app_ = app; |
326 app->ConnectToService("mojo:mojo_launcher", &launcher_); | |
327 views_init_.reset(new ViewsInit); | 322 views_init_.reset(new ViewsInit); |
328 } | 323 } |
329 | 324 |
330 virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) | 325 virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) |
331 MOJO_OVERRIDE { | 326 MOJO_OVERRIDE { |
332 connection->AddService(&window_manager_factory_); | 327 connection->AddService(&window_manager_factory_); |
333 connection->AddService(&navigator_host_factory_); | 328 connection->AddService(&navigator_host_factory_); |
334 connection->AddService(&view_manager_client_factory_); | 329 connection->AddService(&view_manager_client_factory_); |
335 return true; | 330 return true; |
336 } | 331 } |
(...skipping 27 matching lines...) Expand all Loading... |
364 virtual void OnViewManagerDisconnected(ViewManager* view_manager) OVERRIDE { | 359 virtual void OnViewManagerDisconnected(ViewManager* view_manager) OVERRIDE { |
365 DCHECK_EQ(view_manager_, view_manager); | 360 DCHECK_EQ(view_manager_, view_manager); |
366 view_manager_ = NULL; | 361 view_manager_ = NULL; |
367 base::MessageLoop::current()->Quit(); | 362 base::MessageLoop::current()->Quit(); |
368 } | 363 } |
369 | 364 |
370 // Overridden from WindowManagerDelegate: | 365 // Overridden from WindowManagerDelegate: |
371 virtual void Embed( | 366 virtual void Embed( |
372 const String& url, | 367 const String& url, |
373 InterfaceRequest<ServiceProvider> service_provider) OVERRIDE { | 368 InterfaceRequest<ServiceProvider> service_provider) OVERRIDE { |
374 CreateWindow(url, | 369 CreateWindow(url); |
375 NavigationDetailsPtr().Pass(), | |
376 ResponseDetailsPtr().Pass()); | |
377 } | 370 } |
378 virtual void DispatchEvent(View* target, EventPtr event) OVERRIDE { | 371 virtual void DispatchEvent(View* target, EventPtr event) OVERRIDE { |
379 // TODO(beng): More sophisticated focus handling than this is required! | 372 // TODO(beng): More sophisticated focus handling than this is required! |
380 if (event->action == EVENT_TYPE_MOUSE_PRESSED && | 373 if (event->action == EVENT_TYPE_MOUSE_PRESSED && |
381 !IsDescendantOfKeyboard(target)) { | 374 !IsDescendantOfKeyboard(target)) { |
382 target->SetFocus(); | 375 target->SetFocus(); |
383 } | 376 } |
384 view_manager_->DispatchEvent(target, event.Pass()); | 377 view_manager_->DispatchEvent(target, event.Pass()); |
385 } | 378 } |
386 | 379 |
387 void OnLaunch( | 380 void OnLaunch( |
388 uint32 source_view_id, | 381 uint32 source_view_id, |
389 Target requested_target, | 382 Target requested_target, |
390 const mojo::String& handler_url, | 383 const mojo::String& url) { |
391 const mojo::String& view_url, | |
392 ResponseDetailsPtr response) { | |
393 // TODO(mpcomplete): This seems to be unused in favor of |response|. We | |
394 // might need to use it (and fill it in properly, with method, etc) if we | |
395 // need to preserve that information. | |
396 NavigationDetailsPtr nav_details(NavigationDetails::New()); | |
397 nav_details->request->url = view_url; | |
398 | |
399 Target target = debug_panel_->navigation_target(); | 384 Target target = debug_panel_->navigation_target(); |
400 if (target == TARGET_DEFAULT) { | 385 if (target == TARGET_DEFAULT) { |
401 if (requested_target != TARGET_DEFAULT) { | 386 if (requested_target != TARGET_DEFAULT) { |
402 target = requested_target; | 387 target = requested_target; |
403 } else { | 388 } else { |
404 // TODO(aa): Should be TARGET_NEW_NODE if source origin and dest origin | 389 // TODO(aa): Should be TARGET_NEW_NODE if source origin and dest origin |
405 // are different? | 390 // are different? |
406 target = TARGET_SOURCE_NODE; | 391 target = TARGET_SOURCE_NODE; |
407 } | 392 } |
408 } | 393 } |
409 | 394 |
410 View* dest_view = NULL; | 395 View* dest_view = NULL; |
411 if (target == TARGET_SOURCE_NODE) { | 396 if (target == TARGET_SOURCE_NODE) { |
412 View* source_view = view_manager_->GetViewById(source_view_id); | 397 View* source_view = view_manager_->GetViewById(source_view_id); |
413 bool app_initiated = std::find(windows_.begin(), windows_.end(), | 398 bool app_initiated = std::find(windows_.begin(), windows_.end(), |
414 source_view) != windows_.end(); | 399 source_view) != windows_.end(); |
415 if (app_initiated) | 400 if (app_initiated) |
416 dest_view = source_view; | 401 dest_view = source_view; |
417 else if (!windows_.empty()) | 402 else if (!windows_.empty()) |
418 dest_view = windows_.back(); | 403 dest_view = windows_.back(); |
419 } | 404 } |
420 | 405 |
421 if (dest_view) | 406 if (dest_view) |
422 Embed(dest_view, handler_url, nav_details.Pass(), response.Pass()); | 407 dest_view->Embed(url); |
423 else | 408 else |
424 CreateWindow(handler_url, nav_details.Pass(), response.Pass()); | 409 CreateWindow(url); |
425 } | 410 } |
426 | 411 |
427 // TODO(beng): proper layout manager!! | 412 // TODO(beng): proper layout manager!! |
428 Id CreateLauncherUI() { | 413 Id CreateLauncherUI() { |
429 NavigationDetailsPtr nav_details; | 414 NavigationDetailsPtr nav_details; |
430 ResponseDetailsPtr response; | 415 ResponseDetailsPtr response; |
431 View* view = view_manager_->GetViewById(content_view_id_); | 416 View* view = view_manager_->GetViewById(content_view_id_); |
432 gfx::Rect bounds = view->bounds(); | 417 gfx::Rect bounds = view->bounds(); |
433 bounds.Inset(kBorderInset, kBorderInset); | 418 bounds.Inset(kBorderInset, kBorderInset); |
434 bounds.set_height(kTextfieldHeight); | 419 bounds.set_height(kTextfieldHeight); |
435 launcher_ui_ = CreateChild(content_view_id_, "mojo:mojo_browser", bounds, | 420 launcher_ui_ = CreateChild(content_view_id_, "mojo:mojo_browser", bounds); |
436 nav_details.Pass(), response.Pass()); | |
437 return launcher_ui_->id(); | 421 return launcher_ui_->id(); |
438 } | 422 } |
439 | 423 |
440 void CreateWindow(const std::string& handler_url, | 424 void CreateWindow(const std::string& url) { |
441 NavigationDetailsPtr nav_details, | |
442 ResponseDetailsPtr response) { | |
443 View* view = view_manager_->GetViewById(content_view_id_); | 425 View* view = view_manager_->GetViewById(content_view_id_); |
444 gfx::Rect bounds(kBorderInset, | 426 gfx::Rect bounds(kBorderInset, |
445 2 * kBorderInset + kTextfieldHeight, | 427 2 * kBorderInset + kTextfieldHeight, |
446 view->bounds().width() - 3 * kBorderInset - | 428 view->bounds().width() - 3 * kBorderInset - |
447 kControlPanelWidth, | 429 kControlPanelWidth, |
448 view->bounds().height() - | 430 view->bounds().height() - |
449 (3 * kBorderInset + kTextfieldHeight)); | 431 (3 * kBorderInset + kTextfieldHeight)); |
450 if (!windows_.empty()) { | 432 if (!windows_.empty()) { |
451 gfx::Point position = windows_.back()->bounds().origin(); | 433 gfx::Point position = windows_.back()->bounds().origin(); |
452 position.Offset(35, 35); | 434 position.Offset(35, 35); |
453 bounds.set_origin(position); | 435 bounds.set_origin(position); |
454 } | 436 } |
455 windows_.push_back(CreateChild(content_view_id_, handler_url, bounds, | 437 windows_.push_back(CreateChild(content_view_id_, url, bounds)); |
456 nav_details.Pass(), response.Pass())); | |
457 } | 438 } |
458 | 439 |
459 View* CreateChild(Id parent_id, | 440 View* CreateChild(Id parent_id, |
460 const std::string& url, | 441 const std::string& url, |
461 const gfx::Rect& bounds, | 442 const gfx::Rect& bounds) { |
462 NavigationDetailsPtr nav_details, | |
463 ResponseDetailsPtr response) { | |
464 View* view = view_manager_->GetViewById(parent_id); | 443 View* view = view_manager_->GetViewById(parent_id); |
465 View* embedded = View::Create(view_manager_); | 444 View* embedded = View::Create(view_manager_); |
466 view->AddChild(embedded); | 445 view->AddChild(embedded); |
467 embedded->SetBounds(bounds); | 446 embedded->SetBounds(bounds); |
468 Embed(embedded, url, nav_details.Pass(), response.Pass()); | 447 embedded->Embed(url); |
469 embedded->SetFocus(); | 448 embedded->SetFocus(); |
470 return embedded; | 449 return embedded; |
471 } | 450 } |
472 | 451 |
473 void Embed(View* view, const std::string& app_url, | |
474 NavigationDetailsPtr nav_details, | |
475 ResponseDetailsPtr response) { | |
476 view->Embed(app_url); | |
477 if (nav_details) { | |
478 NavigatorPtr navigator; | |
479 app_->ConnectToService(app_url, &navigator); | |
480 navigator->Navigate(view->id(), nav_details.Pass(), response.Pass()); | |
481 } | |
482 } | |
483 | |
484 bool IsDescendantOfKeyboard(View* target) { | 452 bool IsDescendantOfKeyboard(View* target) { |
485 return keyboard_manager_.get() && | 453 return keyboard_manager_.get() && |
486 keyboard_manager_->view()->Contains(target); | 454 keyboard_manager_->view()->Contains(target); |
487 } | 455 } |
488 | 456 |
489 Id CreateControlPanel(View* root) { | 457 Id CreateControlPanel(View* root) { |
490 View* view = View::Create(view_manager_); | 458 View* view = View::Create(view_manager_); |
491 root->AddChild(view); | 459 root->AddChild(view); |
492 | 460 |
493 gfx::Rect bounds(root->bounds().width() - kControlPanelWidth - | 461 gfx::Rect bounds(root->bounds().width() - kControlPanelWidth - |
494 kBorderInset, | 462 kBorderInset, |
495 kBorderInset * 2 + kTextfieldHeight, | 463 kBorderInset * 2 + kTextfieldHeight, |
496 kControlPanelWidth, | 464 kControlPanelWidth, |
497 root->bounds().height() - kBorderInset * 3 - | 465 root->bounds().height() - kBorderInset * 3 - |
498 kTextfieldHeight); | 466 kTextfieldHeight); |
499 view->SetBounds(bounds); | 467 view->SetBounds(bounds); |
500 | 468 |
501 debug_panel_ = new DebugPanel(this, view); | 469 debug_panel_ = new DebugPanel(this, view); |
502 return view->id(); | 470 return view->id(); |
503 } | 471 } |
504 | 472 |
505 InterfaceFactoryImplWithContext<WindowManagerConnection, WindowManager> | 473 InterfaceFactoryImplWithContext<WindowManagerConnection, WindowManager> |
506 window_manager_factory_; | 474 window_manager_factory_; |
507 InterfaceFactoryImplWithContext<NavigatorHostImpl, WindowManager> | 475 InterfaceFactoryImplWithContext<NavigatorHostImpl, WindowManager> |
508 navigator_host_factory_; | 476 navigator_host_factory_; |
509 | 477 |
510 scoped_ptr<ViewsInit> views_init_; | 478 scoped_ptr<ViewsInit> views_init_; |
511 DebugPanel* debug_panel_; | 479 DebugPanel* debug_panel_; |
512 LauncherPtr launcher_; | |
513 View* launcher_ui_; | 480 View* launcher_ui_; |
514 std::vector<View*> windows_; | 481 std::vector<View*> windows_; |
515 ViewManager* view_manager_; | 482 ViewManager* view_manager_; |
516 ViewManagerClientFactory view_manager_client_factory_; | 483 ViewManagerClientFactory view_manager_client_factory_; |
517 scoped_ptr<RootLayoutManager> root_layout_manager_; | 484 scoped_ptr<RootLayoutManager> root_layout_manager_; |
518 | 485 |
519 // Id of the view most content is added to. The keyboard is NOT added here. | 486 // Id of the view most content is added to. The keyboard is NOT added here. |
520 Id content_view_id_; | 487 Id content_view_id_; |
521 | 488 |
522 scoped_ptr<KeyboardManager> keyboard_manager_; | 489 scoped_ptr<KeyboardManager> keyboard_manager_; |
(...skipping 27 matching lines...) Expand all Loading... |
550 } | 517 } |
551 | 518 |
552 } // namespace examples | 519 } // namespace examples |
553 | 520 |
554 // static | 521 // static |
555 ApplicationDelegate* ApplicationDelegate::Create() { | 522 ApplicationDelegate* ApplicationDelegate::Create() { |
556 return new examples::WindowManager; | 523 return new examples::WindowManager; |
557 } | 524 } |
558 | 525 |
559 } // namespace mojo | 526 } // namespace mojo |
OLD | NEW |