Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(93)

Side by Side Diff: mojo/examples/window_manager/window_manager.cc

Issue 489493004: Update view manager to support content handling. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: blah to the blizzah Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « mojo/examples/window_manager/debug_panel.cc ('k') | mojo/mojo_examples.gypi » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/c/system/main.h" 10 #include "mojo/public/c/system/main.h"
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
311 // Overridden from DebugPanel::Delegate: 311 // Overridden from DebugPanel::Delegate:
312 virtual void CloseTopWindow() OVERRIDE { 312 virtual void CloseTopWindow() OVERRIDE {
313 if (!windows_.empty()) 313 if (!windows_.empty())
314 CloseWindow(windows_.back()->id()); 314 CloseWindow(windows_.back()->id());
315 } 315 }
316 316
317 virtual void RequestNavigate( 317 virtual void RequestNavigate(
318 uint32 source_view_id, 318 uint32 source_view_id,
319 Target target, 319 Target target,
320 NavigationDetailsPtr nav_details) OVERRIDE { 320 NavigationDetailsPtr nav_details) OVERRIDE {
321 launcher_->Launch(nav_details.Pass(), 321 OnLaunch(source_view_id, target, nav_details->request->url);
322 base::Bind(&WindowManager::OnLaunch,
323 base::Unretained(this),
324 source_view_id,
325 target));
326 } 322 }
327 323
328 private: 324 private:
329 // Overridden from ApplicationDelegate: 325 // Overridden from ApplicationDelegate:
330 virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE { 326 virtual void Initialize(ApplicationImpl* app) MOJO_OVERRIDE {
331 app_ = app; 327 app_ = app;
332 app->ConnectToService("mojo:mojo_launcher", &launcher_);
333 views_init_.reset(new ViewsInit); 328 views_init_.reset(new ViewsInit);
334 window_manager_app_->Initialize(app); 329 window_manager_app_->Initialize(app);
335 } 330 }
336 331
337 virtual bool ConfigureIncomingConnection(ApplicationConnection* connection) 332 virtual bool ConfigureIncomingConnection(ApplicationConnection* connection)
338 MOJO_OVERRIDE { 333 MOJO_OVERRIDE {
339 connection->AddService(&window_manager_factory_); 334 connection->AddService(&window_manager_factory_);
340 connection->AddService(&navigator_host_factory_); 335 connection->AddService(&navigator_host_factory_);
341 window_manager_app_->ConfigureIncomingConnection(connection); 336 window_manager_app_->ConfigureIncomingConnection(connection);
342 return true; 337 return true;
(...skipping 29 matching lines...) Expand all
372 virtual void OnViewManagerDisconnected(ViewManager* view_manager) OVERRIDE { 367 virtual void OnViewManagerDisconnected(ViewManager* view_manager) OVERRIDE {
373 DCHECK_EQ(view_manager_, view_manager); 368 DCHECK_EQ(view_manager_, view_manager);
374 view_manager_ = NULL; 369 view_manager_ = NULL;
375 base::MessageLoop::current()->Quit(); 370 base::MessageLoop::current()->Quit();
376 } 371 }
377 372
378 // Overridden from WindowManagerDelegate: 373 // Overridden from WindowManagerDelegate:
379 virtual void Embed( 374 virtual void Embed(
380 const String& url, 375 const String& url,
381 InterfaceRequest<ServiceProvider> service_provider) OVERRIDE { 376 InterfaceRequest<ServiceProvider> service_provider) OVERRIDE {
382 CreateWindow(url, 377 CreateWindow(url);
383 NavigationDetailsPtr().Pass(),
384 ResponseDetailsPtr().Pass());
385 } 378 }
386 virtual void DispatchEvent(EventPtr event) MOJO_OVERRIDE {} 379 virtual void DispatchEvent(EventPtr event) MOJO_OVERRIDE {}
387 380
388 // Overridden from ui::EventHandler: 381 // Overridden from ui::EventHandler:
389 virtual void OnEvent(ui::Event* event) OVERRIDE { 382 virtual void OnEvent(ui::Event* event) OVERRIDE {
390 View* view = WindowManagerApp::GetViewForWindow( 383 View* view = WindowManagerApp::GetViewForWindow(
391 static_cast<aura::Window*>(event->target())); 384 static_cast<aura::Window*>(event->target()));
392 if (event->type() == ui::ET_MOUSE_PRESSED && 385 if (event->type() == ui::ET_MOUSE_PRESSED &&
393 !IsDescendantOfKeyboard(view)) { 386 !IsDescendantOfKeyboard(view)) {
394 view->SetFocus(); 387 view->SetFocus();
395 } 388 }
396 } 389 }
397 390
398 void OnLaunch( 391 void OnLaunch(
399 uint32 source_view_id, 392 uint32 source_view_id,
400 Target requested_target, 393 Target requested_target,
401 const mojo::String& handler_url, 394 const mojo::String& url) {
402 const mojo::String& view_url,
403 ResponseDetailsPtr response) {
404 // TODO(mpcomplete): This seems to be unused in favor of |response|. We
405 // might need to use it (and fill it in properly, with method, etc) if we
406 // need to preserve that information.
407 NavigationDetailsPtr nav_details(NavigationDetails::New());
408 nav_details->request->url = view_url;
409
410 Target target = debug_panel_->navigation_target(); 395 Target target = debug_panel_->navigation_target();
411 if (target == TARGET_DEFAULT) { 396 if (target == TARGET_DEFAULT) {
412 if (requested_target != TARGET_DEFAULT) { 397 if (requested_target != TARGET_DEFAULT) {
413 target = requested_target; 398 target = requested_target;
414 } else { 399 } else {
415 // TODO(aa): Should be TARGET_NEW_NODE if source origin and dest origin 400 // TODO(aa): Should be TARGET_NEW_NODE if source origin and dest origin
416 // are different? 401 // are different?
417 target = TARGET_SOURCE_NODE; 402 target = TARGET_SOURCE_NODE;
418 } 403 }
419 } 404 }
420 405
421 View* dest_view = NULL; 406 View* dest_view = NULL;
422 if (target == TARGET_SOURCE_NODE) { 407 if (target == TARGET_SOURCE_NODE) {
423 View* source_view = view_manager_->GetViewById(source_view_id); 408 View* source_view = view_manager_->GetViewById(source_view_id);
424 bool app_initiated = std::find(windows_.begin(), windows_.end(), 409 bool app_initiated = std::find(windows_.begin(), windows_.end(),
425 source_view) != windows_.end(); 410 source_view) != windows_.end();
426 if (app_initiated) 411 if (app_initiated)
427 dest_view = source_view; 412 dest_view = source_view;
428 else if (!windows_.empty()) 413 else if (!windows_.empty())
429 dest_view = windows_.back(); 414 dest_view = windows_.back();
430 } 415 }
431 416
432 if (dest_view) 417 if (dest_view)
433 Embed(dest_view, handler_url, nav_details.Pass(), response.Pass()); 418 dest_view->Embed(url);
434 else 419 else
435 CreateWindow(handler_url, nav_details.Pass(), response.Pass()); 420 CreateWindow(url);
436 } 421 }
437 422
438 // TODO(beng): proper layout manager!! 423 // TODO(beng): proper layout manager!!
439 Id CreateLauncherUI() { 424 Id CreateLauncherUI() {
440 NavigationDetailsPtr nav_details; 425 NavigationDetailsPtr nav_details;
441 ResponseDetailsPtr response; 426 ResponseDetailsPtr response;
442 View* view = view_manager_->GetViewById(content_view_id_); 427 View* view = view_manager_->GetViewById(content_view_id_);
443 gfx::Rect bounds = view->bounds(); 428 gfx::Rect bounds = view->bounds();
444 bounds.Inset(kBorderInset, kBorderInset); 429 bounds.Inset(kBorderInset, kBorderInset);
445 bounds.set_height(kTextfieldHeight); 430 bounds.set_height(kTextfieldHeight);
446 launcher_ui_ = CreateChild(content_view_id_, "mojo:mojo_browser", bounds, 431 launcher_ui_ = CreateChild(content_view_id_, "mojo:mojo_browser", bounds);
447 nav_details.Pass(), response.Pass());
448 return launcher_ui_->id(); 432 return launcher_ui_->id();
449 } 433 }
450 434
451 void CreateWindow(const std::string& handler_url, 435 void CreateWindow(const std::string& url) {
452 NavigationDetailsPtr nav_details,
453 ResponseDetailsPtr response) {
454 View* view = view_manager_->GetViewById(content_view_id_); 436 View* view = view_manager_->GetViewById(content_view_id_);
455 gfx::Rect bounds(kBorderInset, 437 gfx::Rect bounds(kBorderInset,
456 2 * kBorderInset + kTextfieldHeight, 438 2 * kBorderInset + kTextfieldHeight,
457 view->bounds().width() - 3 * kBorderInset - 439 view->bounds().width() - 3 * kBorderInset -
458 kControlPanelWidth, 440 kControlPanelWidth,
459 view->bounds().height() - 441 view->bounds().height() -
460 (3 * kBorderInset + kTextfieldHeight)); 442 (3 * kBorderInset + kTextfieldHeight));
461 if (!windows_.empty()) { 443 if (!windows_.empty()) {
462 gfx::Point position = windows_.back()->bounds().origin(); 444 gfx::Point position = windows_.back()->bounds().origin();
463 position.Offset(35, 35); 445 position.Offset(35, 35);
464 bounds.set_origin(position); 446 bounds.set_origin(position);
465 } 447 }
466 windows_.push_back(CreateChild(content_view_id_, handler_url, bounds, 448 windows_.push_back(CreateChild(content_view_id_, url, bounds));
467 nav_details.Pass(), response.Pass()));
468 } 449 }
469 450
470 View* CreateChild(Id parent_id, 451 View* CreateChild(Id parent_id,
471 const std::string& url, 452 const std::string& url,
472 const gfx::Rect& bounds, 453 const gfx::Rect& bounds) {
473 NavigationDetailsPtr nav_details,
474 ResponseDetailsPtr response) {
475 View* view = view_manager_->GetViewById(parent_id); 454 View* view = view_manager_->GetViewById(parent_id);
476 View* embedded = View::Create(view_manager_); 455 View* embedded = View::Create(view_manager_);
477 view->AddChild(embedded); 456 view->AddChild(embedded);
478 embedded->SetBounds(bounds); 457 embedded->SetBounds(bounds);
479 Embed(embedded, url, nav_details.Pass(), response.Pass()); 458 embedded->Embed(url);
480 embedded->SetFocus(); 459 embedded->SetFocus();
481 return embedded; 460 return embedded;
482 } 461 }
483 462
484 void Embed(View* view, const std::string& app_url,
485 NavigationDetailsPtr nav_details,
486 ResponseDetailsPtr response) {
487 view->Embed(app_url);
488 if (nav_details) {
489 NavigatorPtr navigator;
490 app_->ConnectToService(app_url, &navigator);
491 navigator->Navigate(view->id(), nav_details.Pass(), response.Pass());
492 }
493 }
494
495 bool IsDescendantOfKeyboard(View* target) { 463 bool IsDescendantOfKeyboard(View* target) {
496 return keyboard_manager_.get() && 464 return keyboard_manager_.get() &&
497 keyboard_manager_->view()->Contains(target); 465 keyboard_manager_->view()->Contains(target);
498 } 466 }
499 467
500 Id CreateControlPanel(View* root) { 468 Id CreateControlPanel(View* root) {
501 View* view = View::Create(view_manager_); 469 View* view = View::Create(view_manager_);
502 root->AddChild(view); 470 root->AddChild(view);
503 471
504 gfx::Rect bounds(root->bounds().width() - kControlPanelWidth - 472 gfx::Rect bounds(root->bounds().width() - kControlPanelWidth -
505 kBorderInset, 473 kBorderInset,
506 kBorderInset * 2 + kTextfieldHeight, 474 kBorderInset * 2 + kTextfieldHeight,
507 kControlPanelWidth, 475 kControlPanelWidth,
508 root->bounds().height() - kBorderInset * 3 - 476 root->bounds().height() - kBorderInset * 3 -
509 kTextfieldHeight); 477 kTextfieldHeight);
510 view->SetBounds(bounds); 478 view->SetBounds(bounds);
511 479
512 debug_panel_ = new DebugPanel(this, view); 480 debug_panel_ = new DebugPanel(this, view);
513 return view->id(); 481 return view->id();
514 } 482 }
515 483
516 InterfaceFactoryImplWithContext<WindowManagerConnection, WindowManager> 484 InterfaceFactoryImplWithContext<WindowManagerConnection, WindowManager>
517 window_manager_factory_; 485 window_manager_factory_;
518 InterfaceFactoryImplWithContext<NavigatorHostImpl, WindowManager> 486 InterfaceFactoryImplWithContext<NavigatorHostImpl, WindowManager>
519 navigator_host_factory_; 487 navigator_host_factory_;
520 488
521 scoped_ptr<ViewsInit> views_init_; 489 scoped_ptr<ViewsInit> views_init_;
522 DebugPanel* debug_panel_; 490 DebugPanel* debug_panel_;
523 LauncherPtr launcher_;
524 View* launcher_ui_; 491 View* launcher_ui_;
525 std::vector<View*> windows_; 492 std::vector<View*> windows_;
526 ViewManager* view_manager_; 493 ViewManager* view_manager_;
527 scoped_ptr<RootLayoutManager> root_layout_manager_; 494 scoped_ptr<RootLayoutManager> root_layout_manager_;
528 495
529 scoped_ptr<WindowManagerApp> window_manager_app_; 496 scoped_ptr<WindowManagerApp> window_manager_app_;
530 497
531 // Id of the view most content is added to. The keyboard is NOT added here. 498 // Id of the view most content is added to. The keyboard is NOT added here.
532 Id content_view_id_; 499 Id content_view_id_;
533 500
(...skipping 27 matching lines...) Expand all
561 window_manager_->RequestNavigate(source_view_id, target, nav_details.Pass()); 528 window_manager_->RequestNavigate(source_view_id, target, nav_details.Pass());
562 } 529 }
563 530
564 } // namespace examples 531 } // namespace examples
565 } // namespace mojo 532 } // namespace mojo
566 533
567 MojoResult MojoMain(MojoHandle shell_handle) { 534 MojoResult MojoMain(MojoHandle shell_handle) {
568 mojo::ApplicationRunnerChromium runner(new mojo::examples::WindowManager); 535 mojo::ApplicationRunnerChromium runner(new mojo::examples::WindowManager);
569 return runner.Run(shell_handle); 536 return runner.Run(shell_handle);
570 } 537 }
OLDNEW
« no previous file with comments | « mojo/examples/window_manager/debug_panel.cc ('k') | mojo/mojo_examples.gypi » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698